基于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
相关推荐
数智化管理手记1 小时前
手工统计指标误差大、效率低?指标管理系统如何告别人工算数痛点?
大数据·运维·数据库·人工智能·云计算
fthux4 小时前
RenoPit 能为普通业主做什么?看懂图纸、审查合同,提前发现装修坑
javascript·人工智能·ai·开源·github·chrome扩展·open source·edge扩展·firefox扩展
火山引擎开发者社区7 小时前
火山引擎混合云 veStack 智算平台 Day0 适配 Kimi K3
人工智能
RSABLOCKCHAIN7 小时前
AI Agents in LangGraph-2
人工智能·python
cd_949217218 小时前
哪些AI工具适合生成游戏开发用的3D道具模型?从道具草稿到引擎测试的选择方法
人工智能·3d
FII工业富联科技服务8 小时前
工业设备运维如何Agentic化?拆解Factory Brain的设备运维架构
大数据·运维·人工智能·架构·制造
糖果店的幽灵8 小时前
人已经用 WorkBuddy 找工作拿了面试,你还在一份份手工改简历
人工智能·面试·职场和发展·langgraph
qq29539 小时前
2026 财搭子决策模拟器:多智能体投研架构能力拆解
大数据·人工智能·架构
满怀冰雪10 小时前
12-PaddlePaddle, 飞桨, 分类模型, 训练循环, 损失函数, 优化器, cross_entropy, Adam
人工智能·深度学习·分类·paddlepaddle
冬奇Lab10 小时前
AI 评测系列(08):评测 CI/CD——持续质量门控
人工智能