Halcon三维测量(2):基于深度图视差转换的二维化处理

Halcon三维测量(2):基于深度图视差转换的二维化处理 1. 深度图与视差图三维测量的降维利器第一次接触Halcon三维测量时我被深度图这个神奇的数据结构深深吸引。简单来说深度图就像给普通照片的每个像素点都标注了距离信息——比如用灰度值表示物体离相机的远近越亮表示距离越近越暗则距离越远。但实际项目中我发现直接处理三维点云数据就像在迷宫里找路而将深度图拆解为X/Y/Z三个方向的视差图相当于把迷宫地图展开成三张平面图操作难度直线下降。举个例子去年我们团队做工业零件尺寸检测时需要测量螺丝头部直径和螺纹高度。原始深度图看起来就像一团模糊的云雾图1左但拆解后X视差图清晰呈现了螺丝左右边缘图1中上Y视差图显示了前后轮廓图1中下Z视差图则像等高线图一样标出了不同高度区域图1右。这种转换让后续测量变得异常简单——只需要在对应的视差图上用二维图像处理方法就能获取三维尺寸数据。2. 深度图拆解实战X/Y/Z视差图生成2.1 拆解原理与Halcon实现拆解深度图的核心是坐标转换。假设原始深度图的像素坐标为(u,v)深度值为d(u,v)那么X视差图x u × d(u,v) / ff为相机焦距Y视差图y v × d(u,v) / fZ视差图z d(u,v)在Halcon中只需几行代码就能完成转换* 读取深度图 read_image(DepthImage, part_depth.tiff) * 生成X/Y/Z视差图 xyz_to_xyz_map(DepthImage, XImage, YImage, ZImage, focus, 0.05)这里的关键参数是焦距值示例中0.05mm需要根据相机标定数据调整。我建议先用标准量块校准拍摄已知尺寸的标定物微调焦距参数直到测量误差小于0.1%。2.2 参数调优经验分享在汽车零部件检测项目中我们发现两个常见问题视差图边缘出现锯齿通常是深度图本身存在噪点导致建议先做中值滤波Z视差图分层不明显检查相机是否垂直于被测表面倾斜超过15°会影响深度精度这里分享我的预处理组合拳* 深度图预处理 median_image(DepthImage, SmoothedDepth, circle, 3, mirrored) fill_interlace(SmoothedDepth, FilledDepth, weighted, 10, 5) * 视差图生成 xyz_to_xyz_map(FilledDepth, XImage, YImage, ZImage, focus, 0.048)3. 二维化处理三大实战技巧3.1 边缘检测方法选型指南在PCB板焊点高度检测中我们对比了三种边缘检测方案方法适用场景精度(像素)速度(ms)二值化轮廓高对比度简单形状±1.515Canny算法复杂边缘±0.345亚像素拟合超精密测量±0.1120对于常规检测我的建议是先用快速二值化做初筛对可疑区域再用Canny精测关键尺寸才启用亚像素算法典型Canny参数设置示例edges_sub_pix(ZImage, Edges, canny, 1.5, 15, 30)3.2 轮廓拟合的避坑实践曾经在玻璃瓶口尺寸测量时踩过大坑直接拟合轮廓线得到的直径总是偏小。后来发现是因为瓶口反光导致边缘检测时内侧轮廓丢失。解决方案是在Y视差图上做区域生长提取最大连通域用Tukey算法拟合抗干扰性强关键代码片段* 区域生长 regiongrowing(YImage, Regions, 2, 2, 0.5, 100) * 选择最大区域 connection(Regions, ConnectedRegions) select_shape(ConnectedRegions, SelectedRegions, area, and, 500, 999999) * 轮廓拟合 gen_contour_region_xld(SelectedRegions, Contours, border) fit_line_contour_xld(Contours, tukey, -1, 2, 5, 2, _, _, _, _, _, _, _)3.3 高度差计算的最佳路径Z视差图最神奇的特性是相同灰度值代表相同高度。在电池极片厚度测量中我们这样计算高度差在Z视差图上框选两个ROI区域分别计算平均灰度值通过标定系数转换为实际高度* 测量区域1 reduce_domain(ZImage, ROI1, ImageReduced1) intensity(ROI1, ImageReduced1, Mean1, Deviation1) * 测量区域2 reduce_domain(ZImage, ROI2, ImageReduced2) intensity(ROI2, ImageReduced2, Mean2, Deviation2) * 高度差计算 HeightDiff : (Mean1 - Mean2) * CalibrationFactor注意要采集20组以上标定数据建立灰度-高度对应关系我们使用的二次多项式回归模型可将误差控制在0.5%以内。4. 工业场景中的典型应用案例4.1 电子元器件共面性检测某贴片电容检测项目要求引脚共面度≤0.1mm。我们将深度图转换为Z视差图后对四个引脚区域做阈值分割计算各区域平均高度值找出最大值与最小值差* 四引脚检测 for Index : 1 to 4 by 1 threshold(ZImage, Region, MinGray, MaxGray) connection(Region, ConnectedRegions) select_shape(ConnectedRegions, Pin, area, and, 500, 1500) area_center(Pin, _, Row, Col) get_grayval(ZImage, Row, Col, HeightValues[Index]) endfor * 共面度计算 Coplanarity : max(HeightValues) - min(HeightValues)4.2 注塑件毛边检测利用X/Y视差图的边缘突变特性检测毛边在X视差图上做Sobel边缘增强设定动态阈值提取异常边缘通过形态学处理区分真实毛边与纹理* 边缘增强 sobel_amp(XImage, EdgeAmplitude, sum_abs, 3) * 动态阈值 dyn_threshold(EdgeAmplitude, EdgeAmplitude, Region, 5, light) * 毛边判定 opening_circle(Region, SmoothRegion, 3.5) connection(SmoothRegion, BurrRegions) select_shape(BurrRegions, FinalBurrs, circularity, and, 0, 0.3)这套方案使误检率从最初的12%降到了1.8%检测速度达到每秒15件。