基于Halcon深度图的曲面圆柱凹坑缺陷处理方法

一、概述

可以选用海康机器人或深视智能的3D轮廓仪完成曲面圆柱表面缺陷的扫描,获取一张平铺的3D深度图进行处理。首先对采集的深度图通过高度平滑拟合出基准面,差分提取下凹区域,再结合像素分辨率换算实际面积。

3D轮廓仪输出的数据包括点云(X/Y/Z)、深度图、亮度图三种数据,在做 "凹陷面积 + 深度" 定量检测(轮对颈这种金属圆柱面),优先用深度图;精度要求极高、要做圆柱展开 / 三维拟合时,再用原始点云;亮度图只适合辅助定位、区分油污 / 脏污,不能算面积和深度。

二、实现过程

  1. 基准面拟合

曲面圆柱即使经过机械加工,其表面也会存在微小的曲线起伏或安装倾斜。不能直接用一个固定常数做全局阈值分割。代码中采用 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
相关推荐
乌恩大侠5 分钟前
「AI-RAN」Aerial,使用ORAN C1模式
人工智能·5g·spark·o-ru·ai-ran
Zhao-Jichao8 分钟前
AI Prompting for Everyone 课程笔记 - 05 使用深度搜索 Using Deep Research
人工智能·笔记
暴走约伯14 分钟前
【VFX工具链源码拆解 02】告别机械劳动(上):一键统改百个子粒子颜色与批量重命名
3d·unity·c#·材质
feasibility.20 分钟前
世界模型WSM技术解读:SLAM内化为具身智能的状态记忆,纯RGB机器人导航反超RGB-D
人工智能·机器人·aigc·slam·导航·具身智能·世界模型
alonglong39 分钟前
本地模型部署避坑:HF_HOME 缓存指向 + macOS fd 上限 256
人工智能
注塑机数据采集联网1 小时前
数据采集网关入门:ZK-D1/D3从零开始构建你的数据运用
大数据·数据仓库·人工智能·物联网·数据库架构·注塑机网关
hantmac1 小时前
不记得文件名时,Mac 上的搜索还能怎么做?
人工智能·macos
郝学胜-神的一滴1 小时前
游戏设计:原型与开发 18:Unity入门的第一课
人工智能·程序人生·游戏·ui·unity·游戏引擎
天树星智源1 小时前
每个 token 各配其师:token 级多教师蒸馏拉高 5.9 分
人工智能
米饭是菜qy1 小时前
深度学习Transformer详细介绍
人工智能·深度学习·transformer