2. 点云基础
点云(Point Cloud)是三维视觉与工业缺陷检测中最基础的数据载体。与二维图像不同,点云直接记录了物体表面在三维空间中的离散采样点,每个点通常包含X、Y、Z坐标,并可附加强度、颜色、法向量等属性。在Halcon中处理点云,首先需要理解其数据组织方式、坐标系的定义规则以及不同采集设备的特性。本章将从数据格式、坐标系、获取方式与Halcon实现四个维度展开,帮助读者建立扎实的点云处理基础。
点云数据格式与属性
点云数据的核心是三维坐标集合,但实际工程中往往需要附加多种属性信息。最基本的格式为XYZ三元组,仅包含空间位置。在此基础上扩展出XYZI格式(增加反射强度Intensity)、XYZRGB格式(增加颜色信息)以及XYZNormal格式(增加法向量)。工业缺陷检测中,强度信息尤为重要——例如激光扫描时,不同材质表面对激光的反射强度不同,这为区分缺陷类型提供了额外判据。
在文件存储层面,常见格式包括PLY(Polygon File Format)、PCD(Point Cloud Data)、OBJ(Wavefront Object)和Halcon原生格式。PLY支持ASCII与二进制两种编码,可存储顶点、面片及自定义属性;PCD是PCL库的默认格式,支持高效流式读写;OBJ则常用于CAD模型交换。Halcon通过read_object_model_3d算子可直接读取PLY、PCD、OBJ、DXF等格式,无需额外转换。
| 格式 | 扩展名 | 属性支持 | 典型应用 |
|---|---|---|---|
| XYZ | .xyz | 仅坐标 | 简单点云交换 |
| XYZI | .xyzi | 坐标+强度 | 激光雷达数据 |
| PLY | .ply | 坐标+颜色+法向量+自定义 | 三维扫描仪输出 |
| PCD | .pcd | 坐标+强度+颜色+多字段 | PCL生态、机器人感知 |
| OBJ | .obj | 坐标+纹理坐标+法向量 | CAD模型、动画制作 |
坐标系定义与转换
点云处理中的坐标系是理解数据空间关系的基石。相机坐标系(Camera Coordinate System)以光学中心为原点,Z轴指向场景前方,X轴向右,Y轴向下(遵循右手定则)。世界坐标系(World Coordinate System)则是用户自定义的全局参考系,通常与机器人基座或工件基准对齐。在Halcon中,通过set_origin和pose_to_hom_mat3d等算子实现坐标系间的刚性变换。
实际工程中,坐标系的统一是缺陷检测精度的关键。例如,当使用3D相机获取点云后,需要将点云从相机坐标系转换到机器人坐标系,才能引导机械臂进行精确抓取。Halcon提供hand_eye_calibration算子完成手眼标定,输出相机相对于机器人末端的位姿矩阵。此外,多视角点云拼接时,需通过points_to_object_model_3d配合ICP算法(refine_object_model_3d)实现配准。
- 确定源坐标系与目标坐标系(如相机坐标系→世界坐标系)
- 获取转换参数:平移向量(Tx, Ty, Tz)与旋转矩阵(Rx, Ry, Rz)
- 在Halcon中构建齐次变换矩阵:
pose_to_hom_mat3d - 应用变换:
affine_trans_object_model_3d - 验证转换精度:使用已知尺寸的标定板进行误差评估
点云获取方式:3D相机与激光扫描
工业场景中主流的点云获取设备分为三大类:结构光相机、ToF(Time of Flight)相机和激光扫描仪。结构光相机(如Ensenso、Photoneo)通过投射编码光栅并分析畸变图案来重建三维信息,精度可达亚毫米级,适合静态或慢速运动物体的高精度检测。ToF相机(如Basler ToF、Intel RealSense)通过测量光脉冲飞行时间计算距离,帧率较高但分辨率相对较低,适用于大范围、低精度的场景。
激光扫描仪则分为线激光和面阵激光两种。线激光扫描仪(如Keyence LJ-X系列)通过激光三角测量原理,逐线扫描物体表面,可获得极高精度的轮廓数据,特别适合检测微小缺陷(如划痕、凹坑)。面阵激光雷达(如Velodyne)多用于自动驾驶领域,在工业检测中较少使用。选择设备时需综合考虑精度、速度、成本与物体材质反射特性。
| 获取方式 | 精度范围 | 帧率/速度 | 适用场景 | 局限性 |
|---|---|---|---|---|
| 结构光 | 0.01-0.1 mm | 1-30 fps | 精密零件检测、逆向工程 | 受环境光干扰,需暗室 |
| ToF | 1-10 mm | 30-100 fps | 物流分拣、AGV导航 | 分辨率低,边缘精度差 |
| 线激光 | 0.005-0.05 mm | 1000-10000 线/秒 | 在线检测、表面缺陷 | 需运动平台,速度受限 |
| 面阵激光 | 1-5 cm | 10-50 fps | 大场景建模、环境感知 | 精度低,不适合精密测量 |
Halcon中的点云表示与操作
Halcon将点云封装为ObjectModel3D句柄,通过该句柄可访问点云的全部属性。核心操作包括:read_object_model_3d读取文件,visualize_object_model_3d进行三维可视化,sample_object_model_3d进行降采样,smooth_object_model_3d进行平滑滤波。对于缺陷检测任务,常用distance_object_model_3d计算点云到参考模型的距离,从而定位异常区域。
在Halcon中,点云数据以连续内存块存储,每个点默认包含X、Y、Z三个float32值。若包含强度或颜色,则按顺序追加。开发者可通过get_object_model_3d_params查询点云属性,例如获取点云数量、包围盒、中心点等。以下代码展示了从PLY文件读取点云并获取基本信息的过程:
read_object_model_3d ('pointcloud.ply', 'mm', [], [], ObjectModel3D)
get_object_model_3d_params (ObjectModel3D, 'num_points', NumPoints)
get_object_model_3d_params (ObjectModel3D, 'bounding_box1', BBox)
get_object_model_3d_params (ObjectModel3D, 'point_coord_x', XCoords)
get_object_model_3d_params (ObjectModel3D, 'point_coord_y', YCoords)
get_object_model_3d_params (ObjectModel3D, 'point_coord_z', ZCoords)
对于缺陷检测场景,Halcon提供了完整的点云处理管线:首先通过xyz_to_object_model_3d将XYZ图像转换为点云,然后进行预处理(去噪、滤波),接着通过segment_object_model_3d分割感兴趣区域,最后使用fit_primitives_object_model_3d拟合平面或圆柱体,计算偏差。
案例拆解:基于线激光的电池表面缺陷检测
某新能源电池生产线上,需要检测电池壳体表面的划痕与凹坑。产线节拍为每件3秒,检测精度要求0.02mm。初始方案采用结构光相机,但电池壳体为哑光金属材质,反光导致点云噪声较大,误检率高达15%。后改用线激光扫描方案,具体实施如下:
硬件配置:Keyence LJ-X8400线激光轮廓仪,采样频率4000线/秒,配合高精度直线模组(重复定位精度±0.005mm)。扫描速度设定为50mm/s,每件电池扫描时间约1.8秒。
数据处理流程:
- 使用Halcon读取扫描得到的轮廓序列,通过
xyz_to_object_model_3d重建三维点云 - 应用
smooth_object_model_3d(高斯滤波,sigma=0.5)去除随机噪声 - 通过
fit_primitives_object_model_3d拟合基准平面(电池壳体主平面) - 计算每个点到拟合平面的有向距离,生成偏差图
- 设定阈值:划痕区域偏差>0.03mm,凹坑区域偏差<-0.05mm
- 使用
connection_object_model_3d连通域分析,过滤孤立噪点
结果对比:线激光方案将误检率降至0.5%以内,漏检率为0.1%,检测节拍2.2秒/件,满足产线要求。但代价是设备成本增加约40%,且需要额外的运动控制同步。复盘发现,初始结构光方案失败的关键在于未考虑材质反射特性,而线激光的三角测量原理对哑光表面适应性更好。
常见误区与总结复盘
初学者在处理点云时容易陷入以下误区:一是忽视坐标系标定,直接使用相机原始坐标进行测量,导致结果偏差;二是盲目追求高密度点云,未考虑处理效率与内存占用;三是忽略点云属性(如强度、法向量)的利用,仅依赖几何位置判断缺陷。实际上,在Halcon中,强度信息对于区分表面脏污与真实凹陷非常有效。
本章核心要点归纳如下:
- 数据格式:根据应用场景选择XYZI或PLY格式,注意属性字段的完整性
- 坐标系:明确相机坐标系与世界坐标系的转换关系,定期校验标定参数
- 获取方式:结构光适合静态高精度,线激光适合动态在线检测,ToF适合大范围粗定位
- Halcon操作:掌握
ObjectModel3D句柄的核心算子,善用get_object_model_3d_params调试