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不是简单的一堆点,它把几何、颜色、法向量、三角网格都组织在一起。你通过属性名就能拿到想要的数据。
举个例子,我想获取所有点的Z坐标:
* 获取Z坐标数组
get_object_model_3d_params (ObjectModel3D, 'point_coord_z', Z_Values)
就这么简单。同样的方式,可以获取颜色、法向量等等。
我的经验: 处理大点云(比如几百万个点)时,别一次性把所有属性都读出来。按需读取,能省不少内存。我做过一个项目,点云有500万个点,全读出来内存直接爆了。后来改成只读Z坐标做测量,问题就解决了。
本章小结
这一章我们聊了三件事:
- 点云数据结构: XYZ是骨架,XYZRGB是血肉,根据需求选
- 文件格式: PLY最推荐,OBJ用于对接,CSV用于交换但小心列顺序
- ObjectModel3D: Halcon的核心点云对象,属性化管理,灵活高效