基于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
相关推荐
山东云弈创峰科技2 小时前
山东云弈创峰:基于多模态AI的跨境供应链数字化重构
人工智能·重构
智慧景区与市集主理人2 小时前
巨有科技乡村农文旅智慧建设|适配乡村短板,打造轻量长效数字业态
人工智能·科技
甲维斯2 小时前
马斯克Grok4.5太会了!狙击GPT5.6,贴脸Opus4.8!
人工智能·ai编程
雪碧聊技术3 小时前
Badge 应用场景与落地实践指南
大数据·人工智能
ai产品老杨3 小时前
NVIDIA GPU部署AI视频分析项目实战记录
人工智能·音视频
chaoyuanl4 小时前
现有游乐设施 XR 数字化升级改造方案
大数据·科技·3d·xr·娱乐
LL334455675 小时前
创业自动化平台怎么选
大数据·人工智能
OceanBase数据库官方博客5 小时前
OceanBase AI 时代,数据库的变与不变(技术解析与实践)
数据库·人工智能·oceanbase
冬奇Lab5 小时前
MCP 系列(01):MCP 是什么——为什么 Function Calling 不够
人工智能·llm·mcp
冬奇Lab5 小时前
每日一个开源项目(第154篇):Warp - 从‘好看的终端‘到 Agentic 开发环境
人工智能·rust·llm