《Halcon三维测量工具链实战教程》

三维数据基础:点云、深度图、视差图、三角网格的概念与区别

在Halcon三维视觉测量体系中,理解三维数据的底层表示是构建稳定测量工具链的基石。许多初学者在接触3D测量时,往往被点云、深度图、视差图、三角网格等术语困扰,不清楚它们之间的推导关系与适用场景。本章将系统梳理这四种核心三维数据形态的数学定义、存储结构、相互转换逻辑,并结合Halcon的HObject与HTuple数据结构,讲解如何在Halcon中高效地创建、访问与转换三维数据。只有透彻理解这些基础表示,后续的标定、预处理、表面拟合与尺寸测量才能建立在可靠的数据地基之上。

Halcon三维数据表示与转换关系图 双目相机 / 结构光 左右图像对 / 条纹图 视差图 (Disparity) 像素级视差值 d = xL - xR 深度图 (Depth) Z值矩阵,单通道图像 点云 (PointCloud) X/Y/Z 无序点集 三角网格 (Mesh) 顶点 + 面片拓扑 相机内参 + 外参 贪婪投影三角化 Z = f·B / d Halcon中数据表示要点: • 深度图/视差图:HObject (单通道图像) • 点云:HObject (3通道图像) 或 XLD轮廓 • 三角网格:HObject + HTuple (顶点/面片数组) 转换关系: 视差→深度 深度→点云 点云→网格

上图清晰地展示了四种三维数据形态在Halcon视觉系统中的层级关系:双目相机或结构光传感器首先获取原始图像对,经过立体匹配算法生成视差图;视差图结合相机内外参数可转换为深度图;深度图通过反投影计算得到三维点云;点云经过表面重建算法生成三角网格。在Halcon中,这四种数据分别对应不同的HObject类型与存储格式,理解其差异是正确调用算子的前提。

核心原理:四种三维数据形态的数学本质

从数学视角看,四种数据形态的本质差异在于信息组织方式的不同。视差图是二维图像坐标系下的像素偏移量矩阵,其每个像素值表示左右相机成像平面上对应点的水平位置差d = xL - xR。视差图保留了图像的结构化特性,便于在像素网格上进行快速处理,但其数值本身并不直接代表物理距离。深度图同样是单通道图像,但每个像素值直接编码了该点相对于相机光心沿光轴方向的物理距离Z。深度图与视差图之间存在严格的几何换算关系:Z = f·B/d,其中f为焦距,B为基线距。

点云则完全抛弃了图像网格结构,以无序的三维坐标点集形式存储,每个点包含X、Y、Z三个坐标分量。点云的优势在于能够表达任意形状的表面,不受图像分辨率限制,且可以直接进行刚体变换与空间运算。但点云缺乏拓扑连接信息,无法直接判断点与点之间的邻接关系。三角网格在点云基础上增加了顶点之间的连接关系,通过三角形面片将离散点组织成连续的表面模型,从而支持法向量计算、曲率分析、体积测量等高级几何操作。

数据形态存储结构坐标维度拓扑信息Halcon表示
视差图单通道图像像素坐标(u,v) + 视差d无HObject (real图像)
深度图单通道图像像素坐标(u,v) + 深度Z无HObject (real图像)
点云无序点集三维坐标(X,Y,Z)无HObject (3通道图像) 或 XLD
三角网格顶点数组 + 面片索引三维坐标(X,Y,Z)有(面片连接)HObject + HTuple

Halcon中三维数据的表示与操作流程

在Halcon中,三维数据的表示方式与算子调用紧密相关。对于深度图和视差图,Halcon直接使用单通道的real类型图像对象(HObject)进行存储,图像尺寸与原始相机分辨率一致。例如,使用binocular_disparity算子计算得到的视差图,可以直接通过get_image_size获取尺寸,通过get_grayval访问单个像素的视差值。

点云在Halcon中有两种常见表示:一种是三通道图像对象,其中三个通道分别存储X、Y、Z坐标值,这种表示保留了图像网格结构,便于与深度图进行像素级对应;另一种是XLD轮廓或3D对象模型(如object_model_3d),后者是Halcon 3D测量的核心数据结构,支持点云合并、滤波、分割等操作。三角网格则通过object_model_3d中的顶点和三角面片属性进行表示,可使用triangulate_object_model_3d算子从点云生成。

操作流程示例:从深度图生成点云

* 假设已获取深度图DepthImage和相机内参CamParam
* 1. 将深度图转换为点云(使用图像坐标反投影)
xyz_to_point_cloud (DepthImage, CamParam, PointCloud)
* 2. 将点云转换为3D对象模型
object_model_3d_from_point_cloud (PointCloud, ObjectModel3D)
* 3. 对点云进行三角化生成网格
triangulate_object_model_3d (ObjectModel3D, 'greedy', TriangulatedModel)
* 4. 访问三角网格的顶点和面片
get_object_model_3d_params (TriangulatedModel, 'point_coord_x', XCoord)
get_object_model_3d_params (TriangulatedModel, 'point_coord_y', YCoord)
get_object_model_3d_params (TriangulatedModel, 'point_coord_z', ZCoord)
get_object_model_3d_params (TriangulatedModel, 'triangles', Triangles)

案例拆解:基于结构光的三维测量数据链路

以工业零件的高度测量为例,我们搭建一套完整的Halcon三维测量工具链。硬件配置为单目相机加结构光投影仪,投影仪投射编码条纹图案,相机同步采集变形条纹图像。初始目标是测量零件表面某区域的平均高度,精度要求±0.05mm。

第一步,通过decode_structured_light_pattern算子对采集到的多幅条纹图进行解码,得到视差图。该视差图的分辨率为1280×1024,视差范围在-50到50像素之间。第二步,利用标定得到的相机内参(焦距f=12mm,基线B=100mm)和视差图,通过公式Z = f·B/d逐像素计算深度值,生成深度图。此时深度图的像素值直接代表物理距离,单位为米。

第三步,将深度图转换为点云。这里需要注意,Halcon的xyz_to_point_cloud算子要求输入深度图与相机内参,输出为三通道点云图像。由于深度图可能存在无效像素(如背景区域),在转换前应使用threshold算子将无效深度值置为0,避免生成异常点。第四步,对点云进行三角化处理,生成三角网格模型。在三角化之前,建议先使用smooth_object_model_3d算子对点云进行平滑滤波,去除测量噪声。

最终测量结果显示,零件表面区域的平均高度为15.234mm,与三坐标测量机(CMM)的实测值15.228mm偏差仅0.006mm,满足精度要求。整个处理流程耗时约850ms,其中视差解码占40%,点云生成占25%,三角化占20%,其余为预处理和后处理时间。通过这个案例可以看出,四种数据形态在工具链中各有分工:视差图负责原始匹配,深度图提供物理尺度,点云支持空间运算,三角网格实现表面重建。

经验提醒:在Halcon中处理三维数据时,务必注意坐标系的统一。深度图转换点云时,默认使用相机坐标系(Z轴指向场景前方),而点云到三角网格的转换不会改变坐标系。如果后续需要将测量结果转换到机器人基座坐标系,必须在标定阶段就建立好相机到机器人的变换矩阵。

常见误区与总结复盘

在实际项目开发中,工程师常陷入几个典型误区。第一个误区是混淆深度图与点云的概念,试图直接对深度图进行三维空间变换。深度图本质上是二维图像,其像素坐标与物理坐标之间存在投影关系,直接对深度图做旋转平移会产生错误结果。正确的做法是先将深度图转换为点云,再对点云进行刚体变换。

第二个误区是忽视视差图与深度图的非线性关系。视差图与深度成反比,这意味着在近距离处,微小的视差变化对应较大的深度变化,测量精度较高;而在远距离处,同样的视差误差会导致更大的深度误差。因此,在评估测量系统精度时,不能简单用视差精度代替深度精度,必须考虑距离因素。

第三个误区是三角网格的过度细化。虽然三角网格能够更精细地表达表面细节,但过密的网格会显著增加计算量和存储空间。在Halcon中,可以通过reduce_object_model_3d_by_edges或simplify_object_model_3d算子对网格进行简化,在保持几何精度的前提下减少面片数量。根据经验,对于大多数工业测量场景,将网格面片数量控制在点云数量的1/3到1/2即可获得良好的平衡。

风险提示:当深度图存在大量无效像素(如黑色吸光表面或高反光区域)时,直接转换生成的点云会出现空洞。在Halcon中,应使用interpolate_object_model_3d算子对空洞区域进行插值填充,或使用select_points_object_model_3d算子剔除离群点。否则,后续的三角化过程可能产生错误的表面连接,导致测量结果失真。

总结本章内容,四种三维数据形态构成了从图像到几何模型的完整数据链路。视差图是立体匹配的原始输出,深度图提供了物理尺度的距离信息,点云实现了从图像坐标到空间坐标的转换,三角网格则赋予了表面拓扑结构。在Halcon中,掌握这四种数据的表示方法、转换关系与适用场景,是构建高效三维测量工具链的核心能力。建议读者在实践中有意识地使用object_model_3d作为主要的三维数据容器,它提供了最丰富的算子支持,且能够统一管理点云与网格数据。