3D 线激光相机的激光条纹中心提取方法

论文地址:Excellent-Paper-For-Daily-Reading/application/centerline at main

类别:应用——中心线

时间:2023/11/06

摘要

线激光条纹中心提取是实现线激光相机三维扫描的关键,根据激光三角测量法研制了线激光相机,基于传统 Steger 法对其进行优化并提出一种适用于提取线激光相机光条中心的方法。对图像进行预处理,结合 Canny 算子找出光条边缘,求取光条边缘极值并计算确定ROI区域,利用高斯滤波处理提取后的图像,利用 Hessian 矩阵求取光条中心法线方向,在法线方向进行二阶泰勒展开确定光条中心点,最后对中心点连接并平滑处理,实现中心线精确提取。实验表明,采用本方法能够准确找到不同背景与光源环境下的光条中心,不同条件下的光条中心均方根误差平均值小于0.4,并能够准确扫描出零件三维点云。

实验

Canny、Sobel 和 Laplace边缘检测算子的对比结果:

由图可知,Canny 算子检测的线激光边缘更清 晰和准确。利用 Canny 算子作为边缘检测方法,设 计了自适应 ROI 范围算法。

极值法、灰度重心法、骨骼细化法、法向质心法与本文所提方法对六组图像进行图像处理对 比,记录运行时长。平均运行时间:

由以上数据可知,每种算法所需时间均不同,运算量越大的方法其处理速度越慢,其中骨骼细化法 速度最慢,平均速度比极值法慢 1.6 ~ 2.1 倍。本文所提方法运行速度与法向质心法相接近,比骨骼细化法快 40.6% ~ 87.2% ,比灰度重心法快 25.2% ~ 53.2% 。对比不同组别的结果可以发现,不同环境下的运行速度也不一样,在弱光环境下算法速度更快。分析原因是弱光环境下激光光条的成像效果会变差,光条中点的数量变少,同时环境的噪点也变少,图像滤波与光条中点的遍历计算均会变快。

为了验证本文方法的提取精度,分别使用灰度重心法、法向质心法与本文方法对六组图片进行 20 次分析处理,记录 300 ~ 600 列的中心点行坐标数据。 利用 Bessel 公式求取标准误差:

s = \sqrt[]{\frac{\sum_{i=1}^{n}v_i^{2}}{n-1}}

残差v_{i}=x_{i}-\bar{x}代替真差。

总结

基于三角激光测量法研制了线激光相机,搭建了相关实验系统,提出了激光条纹中心提取方法。 对图像进行预处理,结合 Canny 算子优化的自适应ROI处理,对提取后的图像进行滤波处理。基于 Hessian 矩阵的 Steger 法提取中心线,并且对中心线进行拟合平滑处理。对3D线激光相机进行标定。匹配相机扫描速度与被测物运动速度,实现对目标零件的三维点云获取。由实验结果可知,本文所提方法在不同环境下运行较为稳定,处理图像的时间波动小于 10ms,精度较高,均方根误差小于 0.4。 利用本文方法,线激光相机能够较好地提取零件点云。但该方法依然存在一定的局限性,即物体在试验台上运动速度与相机采集的匹配速度不快,影响整个系统的运行速度,后续将进行相关优化。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用Python实现Steger算法来提取激光条纹中心线。以下是一个简单的示例代码: ```python import cv2 import numpy as np def steger_algorithm(image): # 转换为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 计算梯度 grad_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) grad_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) # 计算梯度幅值和方向 mag, ang = cv2.cartToPolar(grad_x, grad_y) # 进行非最大抑制 mag_max = cv2.dilate(mag, None, iterations=3) mag_mask = np.zeros_like(mag) mag_mask[mag >= mag_max] = 255 # 应用阈值 _, thresholded = cv2.threshold(mag_mask, 50, 255, cv2.THRESH_BINARY) # 进行霍夫直线检测 lines = cv2.HoughLines(thresholded, 1, np.pi/180, 100) # 计算中心线的坐标 center_lines = [] for line in lines: rho, theta = line[0] if theta < np.pi/4 or theta > 3*np.pi/4: x1 = int(rho / np.cos(theta)) y1 = 0 x2 = int((rho - gray.shape[0]*np.sin(theta)) / np.cos(theta)) y2 = gray.shape[0] else: x1 = 0 y1 = int(rho / np.sin(theta)) x2 = gray.shape[1] y2 = int((rho - gray.shape[1]*np.cos(theta)) / np.sin(theta)) center_lines.append((x1, y1, x2, y2)) return center_lines # 读取图像 image = cv2.imread('image.jpg') # 提取中心线 center_lines = steger_algorithm(image) # 绘制中心线 for line in center_lines: x1, y1, x2, y2 = line cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 2) # 显示图像 cv2.imshow('Center Lines', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请注意,这只是一个简单的示例代码,你可能需要根据你的具体需求进行适当的调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天是冰红茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值