在工业质检领域,精确测量零件的高度差是常见但关键的需求。比如锂电池生产中,需要确保电芯与外壳的装配间隙符合0.5mm±0.1mm的工艺标准。传统卡尺测量效率低下,而基于Halcon的3D点云技术能实现毫秒级自动化检测。
我曾在某新能源电池项目中,用这套方法将检测速度从每分钟5件提升到120件。核心原理很简单:通过3D相机获取物体表面点云数据,用Z坐标值识别不同平面,最终计算高度差。但实际操作中会遇到点云噪点、曲面干扰等挑战,需要合理的预处理和参数调整。
python复制read_object_model_3d ('battery.om3', 'mm', [], [], ObjectModel3D, Status)
dev_open_window (0, 0, 800, 600, 'black', WindowHandle)
visualize_object_model_3d (WindowHandle, ObjectModel3D, [], [],
['lut','color_attrib','disp_pose'],
['heatmap','coord_z','true'], [], [], [], PoseOut)
这里有个实用技巧:将'color1'改为'heatmap'能生成热力图,更直观显示高度分布。我曾遇到某型号电池因反光导致点云缺失,通过调整相机曝光参数和添加偏振镜解决。
工业点云常见三种噪点:
实测这三种滤波方案效果:
| 方法 | 执行时间(ms) | 保真度 | 适用场景 |
|---|---|---|---|
| 距离阈值过滤 | 12 | ★★★☆ | 简单几何体 |
| 统计离群值移除 | 35 | ★★★★ | 复杂曲面 |
| 双边滤波 | 80 | ★★★★★ | 高精度要求 |
推荐新手先用这个组合拳:
python复制* 移除飞点
select_points_object_model_3d (ObjectModel3D, 'point_coord_z', 10, 20, ObjectModel3DFiltered)
* 统计滤波
connection_object_model_3d (ObjectModel3DFiltered, 'distance_3d', 0.5, ObjectModel3DCleaned)
电池检测通常需要分离:
python复制* 提取上表面(15-16mm)
select_points_object_model_3d (ObjectModel3D, 'point_coord_z', 15, 16, ObjectModel3DTop)
* 提取下表面(12-14mm)
select_points_object_model_3d (ObjectModel3D, 'point_coord_z', 12, 14, ObjectModel3DBottom)
注意阈值设定:建议先用直方图分析Z值分布:
python复制get_object_model_3d_params (ObjectModel3D, 'point_coord_z', ZValues)
histogram (ZValues, 50, AbsoluteHisto, RelativeHisto)
当零件存在倾斜时,需要用平面拟合替代固定阈值:
python复制* 使用RANSAC算法拟合平面
fit_primitives_object_model_3d (ObjectModel3D, 'plane', [0.1,0.5], Primitive3D, Info)
* 提取符合平面的点
get_object_model_3d_params (Primitive3D, 'inlier_point_indices', Inliers)
select_points_object_model_3d (ObjectModel3D, 'inlier', Inliers, ObjectModel3DPlane)
这个方案在汽车零部件检测中帮我们解决了±5°倾斜带来的测量误差问题。
原始文章用的均值法存在风险:当平面存在凹陷时会失真。更稳健的方案是:
python复制* 计算Z值百分位数(排除极端值)
get_object_model_3d_params (ObjectModel3DTop, 'point_coord_z', ZTop)
get_percentile (ZTop, 50, MedianTop) * 中位数替代均值
get_percentile (ZBottom, 50, MedianBottom)
Height := MedianTop - MedianBottom
在结果展示时添加这些元素会更专业:
python复制* 添加比例尺
create_shape_model_3d (['axis'], ['length'], [10], [], [], [], [], [], ShapeModel3DID)
* 显示测量线
gen_contour_polygon_xld (Contour, [X1,Y1,Z1, X2,Y2,Z2])
dev_display (Contour)
某客户验收时特别认可这种带三维标注的报告形式,比单纯数字更直观。
处理大型点云(>100万点)时要注意:
python复制clear_object_model_3d (ObjectModel3DTemp)
python复制partition_object_model_3d (ObjectModel3D, 'octree', [1,1,1], ObjectModel3DPartitions)
启用GPU加速能提升3-5倍速度:
python复制set_system ('use_gpu', 'true')
query_available_compute_devices (Devices)
set_compute_device (Devices[0])
在联想P920工作站上实测,处理200万点云从1.2秒降至0.3秒。
问题1:测量结果波动大
connection_object_model_3d的距离阈值问题2:平面分割不完整
fit_primitives_object_model_3d的残差阈值问题3:程序运行卡顿
visualize_object_model_3d的渲染质量某次产线突发测量异常,最终发现是振动导致相机位移0.1mm。现在我们会定期用标准块校验系统精度。