一、概述
可以选用海康机器人或深视智能的3D轮廓仪完成曲面圆柱表面缺陷的扫描,获取一张平铺的3D深度图进行处理。首先对采集的深度图通过高度平滑拟合出基准面,差分提取下凹区域,再结合像素分辨率换算实际面积。
3D轮廓仪输出的数据包括点云(X/Y/Z)、深度图、亮度图三种数据,在做 "凹陷面积 + 深度" 定量检测(轮对颈这种金属圆柱面),优先用深度图;精度要求极高、要做圆柱展开 / 三维拟合时,再用原始点云;亮度图只适合辅助定位、区分油污 / 脏污,不能算面积和深度。
二、实现过程
- 基准面拟合
曲面圆柱即使经过机械加工,其表面也会存在微小的曲线起伏或安装倾斜。不能直接用一个固定常数做全局阈值分割。代码中采用 mean_image(核大小需大于最大缺陷尺寸的2倍)来提取背景基准线,确保只提取局部下凹。
2.物理单位转换
3D轮廓仪输出的图像,其像素距离与实际物理尺寸存在比例关系:
X方向分辨率:通常与轮对旋转编码器的触发频率、轴颈直径相关。
Y方向分辨率:取决于3D激光相机的线激光X轴点间隔。
必须确保 PixelAreaSize(单像素面积)计算准确,否则会导致面积筛选误判。
3.深度与面积的双重过滤
算法中通过 threshold (ImageDiff, ..., 0.1, 99999) 先行过滤了深度不足 0.1mm (举例数据)的微小波动,随后通过面积元组 过滤 AreaReal >= 60.0(举例数值) 剔除了面积不达标的区域。
说明:这里计算面积时,需根据基准面的Z值,需先求出对应的XY像素坐标值之间的距离信息来求出面积。
三、逻辑代码
通过读取深度图图像的数据,实现的Halcon代码缺陷检测的代码如下所示
bash
* 1. 读取或引入展开后的深度图像 (Z图)
read_image (ImageDepth, 'wheel_journal_depth_image.tif')
* 2. 预处理:去除无效点(噪点),填充缺失值
* 假设无效值为0,将其替换为周围均值或背景高度
threshold (ImageDepth, RegionValid, 0.1, 99999)
reduce_domain (ImageDepth, RegionValid, ImageReduced)
* 3. 拟合基准面(消除轴颈整体的微小倾斜或圆柱度偏差)
* 使用大核均值滤波或中值滤波模拟无缺陷的理想表面
mean_image (ImageReduced, ImageBackground, 151, 151)
* 4. 图像差分:寻找下凹区域
* 基准面减去原始深度图,得到正值代表下凹深度的图像
sub_image (ImageBackground, ImageReduced, ImageDiff, 1.0, 0)
* 5. 深度阈值分割:提取深度超过 0.1 毫米的区域
* 假设深度图的灰度值单位就是毫米(如果是数据精度需乘以算子系数)
ThresholdDepth := 0.1
threshold (ImageDiff, RegionDefectsRaw, ThresholdDepth, 99999)
* 6. 区域连通性分析与形态学去噪
connection (RegionDefectsRaw, ConnectedDefects)
* 使用闭运算消除内部空洞,开运算消除毛刺
closing_circle (ConnectedDefects, RegionClosed, 3.5)
connection (RegionClosed, ConnectedDefectsFinal)
* 7. 计算每个缺陷的实际物理面积并筛选
* ⚠️ 请根据相机实际标定参数修改以下两个像素分辨率(单位:毫米/像素)
PixelSizeX := 0.05 * X方向(圆周展开方向)每个像素代表的毫米数
PixelSizeY := 0.05 * Y方向(轴向)每个像素代表的毫米数
PixelAreaSize := PixelSizeX * PixelSizeY * 1.0
* 计算每个连通域的像素面积
area_center (ConnectedDefectsFinal, AreaPixels, Row, Column)
* 将像素面积转换为物理面积(平方毫米)
AreaReal := AreaPixels * PixelAreaSize
* 筛选出面积超过 60 平方毫米的缺陷
MinAreaMM2 := 60.0
tuple_find (AreaReal, expression(AreaReal >= MinAreaMM2), Indices)
if (size_of_tuple(Indices) > 0 and Indices != -1)
select_obj (ConnectedDefectsFinal, SelectedDefects, Indices + 1)
* SelectedDefects 即为最终输出的达标凹陷缺陷区域
else
gen_empty_region (SelectedDefects)
endif