在线结构光视觉测量系统中,激光光条的提取精度至关重要。光条的提取效果,一方面取决于激光光条本身的质量,另一方面取决于图像处理算法性能,下面进行简要分析。
拍摄的原始图片如下图所示:
用的绿光激光器,本项目使用的是双目相机,两个相机拍摄了很多张图片,所有图片可以点击链接获取。通过下面的python函数对图片进行处理,并计算直线在像面坐标系的直线方程:
def Fitline(original_img, binary, erodeksize, erodeite, dilateksize, dilateite, gaussksize):
ret, img = cv.threshold(original_img, binary, 255, 0)
img = cv.erode(img, (erodeksize, erodeksize), iterations=erodeite)
# cv.imshow("erosion", cv.resize(img, (960, 540)))
img = cv.dilate(img, (dilateksize, dilateksize), dilateite)
# cv2.imshow("dilate", img)
gauss = cv.GaussianBlur(img, (gaussksize, gaussksize), 0)
edges = cv.Canny(gauss, 100, 150, apertureSize=3)
# cv.imshow('Canny', cv.resize(edges, (960, 540)))
contours, hierarchy = cv.findContours(gauss, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
# cnt = contours[0]
area = []
for k in range(len(contours)):
area.append(cv.contourArea(contours[k]))
max_idx = np.argmax(np.array(area))
img1 = cv.merge([original_img, original_img, original_img])
cv.drawContours(img1, contours[max_idx], -1, (0, 255, 0), 1)
# cv.imshow('result', cv.resize(img1, (960, 540)))
vx, vy, x, y = cv.fitLine(contours[max_idx], cv.DIST_L2, 0, 0.01, 0.01)
k = vy / vx
b = y - k * x
# print(k, b)
lefty = int((-x * vy / vx) + y)
rows, cols = img1.shape[:2]
righty = int(((cols - x) * vy / vx) + y)
line = cv.line(img1, (cols - 1, righty), (0, lefty), (0, 0, 255), 1)
cv.imshow('line', cv.resize(line, (960, 540)))
cv.waitKey(10)
return k, b
把文件夹里面的每一张图片都进行处理,这些光条都是在同一个固定位置拍摄的,理论上每个光条的直线方程应该相同。如果直线用 y = k x + b y=kx+b y=kx+b的形式表示,那么 k k k和 b b b都应该基本保持不变。我们对这两个参数进行统计分析,得到如下四张统计图:
处理得到的直线提取效果为:
精度有待于进一步提升。