2. 点云数据基础

各位同学,欢迎来到第二章。上一章我们聊了3D视觉的整体框架,这一章咱们就扎进点云数据的细节里。说实话,我刚接触3D视觉时,面对一堆XYZ坐标和文件格式,也懵了好一阵。但别担心,今天我就把这些基础掰开揉碎了讲给你听。

点云数据结构:XYZ与XYZRGB

点云是什么?说白了,就是空间中一堆点的集合。每个点至少有三个坐标:X、Y、Z。这就是最基础的XYZ点云。

但光有坐标够吗?我做过一个项目,要区分传送带上的红色零件和蓝色零件。纯XYZ数据根本分不出来。这时候就需要XYZRGB点云——每个点除了坐标,还带R、G、B颜色信息。

核心区别一览

类型 数据内容 典型应用
XYZ 三维坐标 (X, Y, Z) 几何测量、轮廓检测
XYZRGB 三维坐标 + 颜色 (R, G, B) 物体识别、颜色分拣

你想想看,在Halcon里,这两种数据怎么存?其实很简单。Halcon的ObjectModel3D对象内部用属性列表管理数据。比如'point_coord_x'、'point_coord_y'、'point_coord_z'存坐标,'point_color_r'、'point_color_g'、'point_color_b'存颜色。我习惯把它们想象成一张大表格,每一行就是一个点。

我的小技巧: 调试时,用get_object_model_3d_params查看属性列表,能快速确认点云是否带颜色信息。我曾经因为没检查这个,白白浪费了半天排查颜色显示问题。

点云文件格式:PLY、OBJ、CSV

数据在内存里,总得存到硬盘上吧?这就涉及到文件格式了。市面上格式很多,但咱们做工业视觉,最常用的就三种:PLY、OBJ、CSV。

PLY格式(Polygon File Format)

这是我最推荐的格式。它既能存点云,也能存三角网格。结构清晰,分文件头和数据体两部分。文件头告诉程序:有多少个点、每个点有哪些属性。数据体就是实实在在的数值。

ply
format ascii 1.0
element vertex 8
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
end_header
0.0 0.0 0.0 255 0 0
1.0 0.0 0.0 0 255 0
0.0 1.0 0.0 0 0 255
...

你看,上面这个例子,8个点,每个点有XYZ和RGB。Halcon读写PLY非常方便,read_object_model_3d和write_object_model_3d直接搞定。

OBJ格式

OBJ在3D建模领域很流行。它用v开头表示顶点坐标,f开头表示面片索引。但说实话,纯点云场景下,OBJ不如PLY直接。我只有在和CAD软件对接时才会用到它。

CSV格式

CSV就是逗号分隔的文本文件。简单粗暴,每行一个点,列之间用逗号隔开。比如:

x,y,z,r,g,b
0.0,0.0,0.0,255,0,0
1.0,0.0,0.0,0,255,0

CSV的好处是通用性强,Excel都能打开。但缺点也很明显——没有标准文件头,容易搞混列顺序。我踩过这个坑:有一次客户给的CSV,列顺序是Z、Y、X,我没注意,结果重建出来的点云整个是歪的。

避坑指南: 拿到CSV文件,第一件事就是确认列顺序。我曾经因为默认按XYZ读,结果数据是ZYX,导致后续所有测量都错了。建议先写个小脚本预览前几行数据。

三种格式怎么选?我一般这样:

  • 自己用: PLY,信息完整,Halcon支持最好
  • 和设计部门对接: OBJ,他们建模软件都认
  • 和客户或第三方系统交换: CSV,虽然简陋但兼容性无敌

Halcon点云对象:ObjectModel3D

好了,文件格式聊完了,咱们看看Halcon里怎么玩。核心对象就是ObjectModel3D。你可以把它理解成一个容器,里面装着点云的所有信息。

创建一个点云对象很简单:

* 创建一个空的3D对象模型
create_object_model_3d (ObjectModel3D)

* 从PLY文件读取
read_object_model_3d ('pointcloud.ply', 'm', [], [], ObjectModel3D)

* 从内存中的点数据创建
gen_object_model_3d_from_points (X, Y, Z, ObjectModel3D)

我个人习惯用gen_object_model_3d_from_points,因为很多时候点数据是从相机SDK或者算法里算出来的,不是从文件读的。

ObjectModel3D内部到底存了什么?我用一张图给你讲清楚:

ObjectModel3D 内部结构 ObjectModel3D 几何属性 颜色属性 附加属性 point_coord_x point_coord_y point_coord_z point_color_r / g / b point_normal_x / y / z 三角网格索引 关键理解 • ObjectModel3D 是一个容器,通过属性名访问数据 • 属性可以动态添加和删除,非常灵活 • 使用 get_object_model_3d_params 查看所有属性

看到没?ObjectModel3D不是简单的一堆点,它把几何、颜色、法向量、三角网格都组织在一起。你通过属性名就能拿到想要的数据。

举个例子,我想获取所有点的Z坐标:

* 获取Z坐标数组
get_object_model_3d_params (ObjectModel3D, 'point_coord_z', Z_Values)

就这么简单。同样的方式,可以获取颜色、法向量等等。

我的经验: 处理大点云(比如几百万个点)时,别一次性把所有属性都读出来。按需读取,能省不少内存。我做过一个项目,点云有500万个点,全读出来内存直接爆了。后来改成只读Z坐标做测量,问题就解决了。

本章小结

这一章我们聊了三件事:

  • 点云数据结构: XYZ是骨架,XYZRGB是血肉,根据需求选
  • 文件格式: PLY最推荐,OBJ用于对接,CSV用于交换但小心列顺序
  • ObjectModel3D: Halcon的核心点云对象,属性化管理,灵活高效