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)]
得到左右边缘后,焊缝中心 = 两边缘中点,焊缝宽度 = 两边缘在图像中的像素距离。再通过标定矩阵换算到机器人基坐标系,即可得到跟踪所需的横向偏差与高度偏差。
四、从像素到机器人坐标:标定与偏差计算
提取到焊缝中心后,需要把它转换到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。
总结来说,UR焊缝跟踪中的图像处理不是孤立的算法,而是“预处理—中心线—边缘—坐标转换—偏差修正”的闭环。每一步的参数都应与相机分辨率、激光功率、焊接速度和坡口形式匹配。只有把中心线提取稳定、边缘定位准确,后续的机器人跟踪才能真正做到“跟得住、焊得准”。