第一次接触Halcon三维测量时,我被它处理深度图的方式惊艳到了。想象一下,你手里有一块金属板,表面有些肉眼几乎看不见的微小凹坑。传统的二维图像处理可能束手无策,但Halcon通过将深度图拆分为X、Y、Z三个视差图,把三维问题转化成了我们熟悉的二维图像处理问题。
深度图本质上是一个三维数据集合,每个像素点除了有X、Y坐标外,还包含Z轴的高度信息。Halcon的魔法在于,它能将这个三维数据拆分成三张二维图:X视差图显示左右方向的深度变化,Y视差图显示上下方向的深度变化,而Z视差图则直接反映高度信息。在实际工业检测中,Z视差图往往是最有用的——因为它直接告诉我们工件表面哪里凸起、哪里凹陷。
我曾在塑料件检测项目中做过对比:直接处理原始深度图需要复杂的点云算法,而使用Z视差图后,只需要简单的图像阈值分割就能定位缺陷区域。这种"降维打击"式的处理方式,让三维测量变得像处理普通图片一样简单。
想要准确检测缺陷,首先得获得清晰的Z视差图。这里有个容易踩的坑:很多新手会直接使用相机输出的原始深度图。实际上,工业场景中的金属表面反光、环境光照变化都会影响深度图质量。我的经验是,在生成视差图前一定要做预处理:
python复制* 中值滤波去除噪声
median_image(DepthImage, FilteredImage, 'circle', 3, 'mirrored')
* 高斯平滑处理
gauss_filter(FilteredImage, SmoothedImage, 5)
* 视差图生成
disparity_to_xyz(SmoothedImage, XImage, YImage, ZImage)
记得有次检测铝合金工件时,由于没做滤波处理,表面纹理被误判为凹陷。后来加了预处理步骤,检测准确率直接从70%提升到了95%。
拿到Z视差图后,下一步是分割出可能存在缺陷的区域。这里推荐三种我常用的方法:
python复制threshold(ZImage, Region, MinHeight, MaxHeight)
python复制dyn_threshold(ZImage, SmoothedImage, Region, Offset, 'light')
python复制edges_sub_pix(ZImage, Edges, 'canny', 1, 20, 40)
在金属件检测中,我发现动态阈值法效果最好。比如检测0.1mm深的凹坑时,设置Offset为5就能稳定识别,而固定阈值会因为工件摆放角度变化导致误检。
分割出可疑区域后,需要量化分析高度特征。Halcon提供了多种计算方式:
python复制* 计算区域平均高度
region_features(DefectRegion, ZImage, 'mean', MeanHeight)
* 获取区域高度分布
height_histogram(DefectRegion, ZImage, Histogram)
* 计算相对于背景的高度差
region_features(BackgroundRegion, ZImage, 'mean', BgHeight)
DefectDepth := BgHeight - MeanHeight
这里有个实用技巧:计算高度差时,最好选取缺陷周围的正常区域作为背景参考,而不是整个图像的平均高度。我曾遇到一个案例,由于工件本身有弧度,使用全局背景导致边缘区域总是误报。
根据高度特征,我们可以进一步分类缺陷类型:
在塑料盖板检测项目中,我通过组合高度均值和分布特征,成功区分了注塑不良(凸起)和运输损伤(凹坑),误判率低于2%。
经过多个项目实践,我总结出几个关键参数调优经验:
视差图生成阶段:
缺陷检测阶段:
高度分析阶段:
遇到检测不准时,可以按照这个顺序排查:
有次夜班生产时,检测系统突然频繁误报。后来发现是车间空调直吹导致工件表面温度变化,影响了深度相机精度。加装隔热罩后问题立即解决。这个经历让我明白,工业检测不仅要考虑算法本身,环境因素同样关键。