第一次用Halcon处理3D数据时,我对着各种文件格式和参数选项简直头大。后来才发现,只要掌握几个关键点,读取PLY、OBJ这些常见格式其实特别简单。咱们先从最基础的讲起。
Halcon支持的3D格式主要有六种:
实际项目中我发现,PLY和OBJ是最常用的。比如读取一个兔子点云数据,代码就这么简单:
halcon复制read_object_model_3d('bunny.ply', 'mm', 'convert_to_triangles', 'true', ObjectModel3D, Status)
这里有个坑要注意:'convert_to_triangles'参数如果设为true,所有面都会转成三角面片。有次我读取复杂机械零件时没开这个选项,结果渲染出来全是破面。
visualize_object_model_3d这个算子有二十多个参数,新手很容易懵。我常用的是lut和color_attrib组合:
halcon复制visualize_object_model_3d(WindowHandle, ObjectModel3D, [], [],
['lut','color_attrib'],
['color1','coord_z'],
[], [], [], PoseOut)
这样就能用渐变色显示Z轴深度,红色是高处,蓝色是低处。有次检测注塑件厚度,用这个方案一眼就能看出哪些区域过薄。
颜色表(lut)可选值:
'color1':红到蓝渐变'color2':彩虹色渐变'inverse':反色显示'thermal':热力图效果检查点云质量时,显示法向量特别有用:
halcon复制visualize_object_model_3d(WindowHandle, ObjectModel3D, [], [],
['disp_normals','normal_color'],
['true','green'],
[], [], [], PoseOut)
但要注意,STL文件自带的法线会被忽略,Halcon会重新计算。有次我对比原始STL和Halcon渲染效果,发现光照表现不一样,就是这个原因。
inspection_mode参数决定查看方式:
'standard':物体中心为旋转点(十字光标)'surface':表面点为旋转点(叉形光标)检测大型工件时用surface模式更方便,按住Ctrl+Alt+鼠标左键还能随时切换。这个技巧我们团队新人用了都说好。
去年做过一个汽车钣金项目,需要检测20多个关键尺寸。我的方案是:
read_object_model_3d读取扫描的STL数据color_attrib='coord_z'显示高度差disp_pose显示坐标系halcon复制visualize_object_model_3d(WindowHandle, ObjectModel3D, [], [],
['color_attrib','disp_pose','inspection_mode'],
['coord_z','true','surface'],
[], [], [], PoseOut)
另一个案例是检测手机壳注塑缺陷。关键点在于:
lut='thermal'突出温度异常区域color_attrib_start/end过滤噪声alpha=0.7半透明显示内部结构halcon复制visualize_object_model_3d(WindowHandle, ObjectModel3D, [], [],
['lut','color_attrib','alpha'],
['thermal','intensity',0.7],
[], [], [], PoseOut)
处理大型点云时(比如超过100万点),这几个参数能显著提升速度:
disp_normalspoint_size=1attribute='points'只显示点云有次扫描发动机缸体,原始数据800多万点,调优后渲染帧率从2fps提升到15fps。具体配置:
halcon复制visualize_object_model_3d(WindowHandle, ObjectModel3D, [], [],
['attribute','point_size'],
['points',1],
[], [], [], PoseOut)
还有个隐藏技巧:提前用reduce_object_model_3d降采样,既能保持特征又减轻渲染压力。