4. 焊缝特征提取与图像处理

在UR协作机器人激光焊缝跟踪系统中,相机采集到的原始图像只是“原料”,真正决定跟踪精度的是从图像中提取出的焊缝特征。典型流程是:先对图像做滤波与形态学预处理,抑制弧光飞溅、反光与噪声;再从激光条纹中提取中心线;最后在中心线上定位坡口边缘,得到焊缝中心与宽度。本节围绕这三步展开,并给出可直接参考的实现参数与判断依据。

一、预处理:滤波与形态学处理

焊接现场图像的主要干扰有三类:弧光造成的局部过曝、飞溅形成的离散亮点、以及金属表面反光产生的伪条纹。预处理的目标不是“美化图像”,而是让激光条纹成为图像中最稳定、最连续的亮结构。

常用组合是:先高斯滤波平滑随机噪声,再用中值滤波去除飞溅类椒盐噪声,最后用形态学开运算断开细小的伪连接、闭运算填补条纹断裂。示例参数(需按实际相机与镜头调整):高斯核 5×5、σ=1.2;中值滤波核 5×5;开运算结构元 3×3 矩形,闭运算结构元 5×1 水平矩形(因为条纹近似水平走向,水平方向闭运算更利于连接断点)。

import cv2, numpy as np

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 1.2)
med  = cv2.medianBlur(blur, 5)

k_open  = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
k_close = cv2.getStructuringElement(cv2.MORPH_RECT, (5,1))
opened  = cv2.morphologyEx(med, cv2.MORPH_OPEN,  k_open)
closed  = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, k_close)

# 自适应阈值提取激光条纹候选区域
bw = cv2.adaptiveThreshold(closed, 255,
        cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
        cv2.THRESH_BINARY, 31, -8)

判断预处理是否合格,可观察二值图中条纹是否连续、宽度是否均匀、是否仍有孤立亮斑。若条纹断裂严重,优先增大闭运算核或降低阈值偏移量;若伪条纹增多,则减小开运算核或提高阈值。

二、激光条纹中心线提取

激光条纹有一定宽度(通常5~20像素),直接取整条条纹会引入宽度方向的随机误差。中心线提取就是把每一列(或每一行)的条纹压缩为一个亚像素坐标。常用方法有灰度重心法、极值法和Steger法。

灰度重心法计算简单、抗噪较好,适合实时跟踪。对二值图中每一列,在条纹所在行区间内按灰度加权求重心:

def center_of_mass(bw, gray):
    centers = []
    h, w = bw.shape
    for x in range(w):
        ys = np.where(bw[:, x] > 0)[0]
        if len(ys) < 3:
            continue
        wgt = gray[ys, x].astype(np.float32)
        yc = (ys * wgt).sum() / wgt.sum()
        centers.append((x, yc))
    return np.array(centers)

示例中,若条纹在图像中近似水平,则按列求重心得到 (x, y) 序列;若条纹竖直,则按行求重心。提取后应做一次异常点剔除:计算相邻中心点的一阶差分,若某点跳变超过阈值(如8像素),用前后点线性插值替换。这样得到的中心线才能用于后续坡口边缘定位。

三、焊缝坡口边缘检测

坡口边缘是中心线上灰度或几何发生突变的点。对V形坡口,中心线在坡口处会出现明显的“下凹”或“折点”。常用做法有两种:一是对中心线做一阶差分,找差分极值;二是对中心线做直线拟合,用残差最大点作为边缘。

示例:对中心线 y(x) 做滑动窗口差分,窗口宽度 9,计算 dy/dx,取绝对值最大的两个位置作为左右坡口边缘。若坡口为对接形式,则边缘对应中心线两端的拐点;若为角接,则边缘对应中心线与母材的交点。

def edge_points(centers, win=9):
    x = centers[:,0]; y = centers[:,1]
    dy = np.gradient(y, x)
    k = np.ones(win)/win
    dys = np.convolve(dy, k, mode='same')
    idx = np.argsort(np.abs(dys))[-2:]
    return centers[np.sort(idx)]

得到左右边缘后,焊缝中心 = 两边缘中点,焊缝宽度 = 两边缘在图像中的像素距离。再通过标定矩阵换算到机器人基坐标系,即可得到跟踪所需的横向偏差与高度偏差。

激光条纹中心线提取与坡口边缘定位流程 ① 原始图像 弧光/飞溅/反光 ② 滤波+形态学 高斯+中值+开闭运算 ③ 二值条纹 自适应阈值 ④ 中心线 灰度重心法 中心线 y(x) 与坡口边缘定位(示例) x / 像素 y 坡口最低点 左边缘 右边缘 焊缝中心 焊缝宽度 中心线 坡口边缘 坡口最低点

四、从像素到机器人坐标:标定与偏差计算

提取到焊缝中心后,需要把它转换到UR机器人基坐标系。常用手眼标定矩阵 T(4×4)完成:

P_base = T @ [u, v, 0, 1].T
# 取 P_base 的 x、y、z 作为焊缝在基坐标系下的位置

跟踪时,机器人沿焊缝前进,相机每帧给出当前焊缝中心与期望路径的偏差 Δx、Δy。若偏差超过阈值(示例:横向 ±0.5 mm,高度 ±0.8 mm),则通过UR的servoj或movep进行实时修正。阈值需根据焊丝直径、坡口间隙和跟踪速度综合设定。

五、工程中的常见问题与处理

  • 条纹断裂:多因飞溅遮挡或反光过强。可增大闭运算核,或改用多帧累积后再提取中心线。
  • 中心线抖动:多因弧光随机闪烁。可对连续5帧的中心线做滑动平均,或对差分结果做低通滤波。
  • 坡口边缘误判:当坡口内有焊渣或间隙不均时,差分极值可能偏移。可结合先验坡口宽度做约束,只保留宽度在合理范围内的边缘对。
  • 实时性不足:若处理耗时超过相机帧周期,可降低ROI区域,只处理条纹附近200×100像素,或把形态学核缩小到3×3。
建议在正式跟踪前,用一段已知坡口的标准试板做一次“静态标定+动态验证”:静态时记录中心线与边缘的像素坐标,动态时观察偏差曲线是否收敛。若偏差在2~3帧内收敛到阈值内,说明滤波、中心线提取和边缘检测参数匹配良好。

总结来说,UR焊缝跟踪中的图像处理不是孤立的算法,而是“预处理—中心线—边缘—坐标转换—偏差修正”的闭环。每一步的参数都应与相机分辨率、激光功率、焊接速度和坡口形式匹配。只有把中心线提取稳定、边缘定位准确,后续的机器人跟踪才能真正做到“跟得住、焊得准”。