第一章 点云数据基础:从零认识你的数据
做点云处理这些年,我见过太多人一上来就调滤波参数,结果越调越懵。为什么?说白了,你连手里拿的是什么数据都没搞清楚。这一章,我们就从最基础的东西说起——点云到底是什么,它长什么样,怎么存,怎么读。
1.1 点云数据结构:PCD、PLY、XYZ
点云文件格式有很多,但常用的就那几种。我个人习惯用PCD,因为PCL库原生支持,读写快,还带头部信息。PLY格式呢,更通用一些,很多三维建模软件都认它。至于XYZ,就是纯文本,简单粗暴,但缺了元数据。
先看一个PCD文件的头部长什么样:
# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z intensity
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 640
HEIGHT 480
VIEWPOINT 0 0 0 1 0 0 0
POINTS 307200
DATA ascii
0.123 0.456 0.789 128
0.234 0.567 0.890 255
...
注意看WIDTH和HEIGHT。如果HEIGHT大于1,说明这是有序点云,像一张深度图。如果HEIGHT等于1,那就是无序点云,所有点挤在一行里。我在项目中遇到过有人把有序点云当无序处理,结果滤波效果一塌糊涂——嗯,这个坑我替你们踩过了。
PLY格式稍微复杂一点,支持顶点和面片。如果你要做网格重建,PLY是首选。XYZ格式最简单,每行三个浮点数,连头部都没有。但我不建议用XYZ存重要数据,因为丢了坐标系信息,换台机器可能就对不上了。
1.2 点云坐标系统
点云的坐标系统,说白了就是定义原点在哪、三个轴怎么指。常见的坐标系有几种:
- 世界坐标系:全局统一的参考系,比如GPS经纬度转过来的UTM坐标
- 传感器坐标系:以激光雷达或相机为中心,x轴朝前,y轴朝左,z轴朝上(ROS标准)
- 相机坐标系:z轴朝前,x轴朝右,y轴朝下(OpenCV标准)
你想想看,如果坐标系搞混了,滤波出来的点云可能直接飞到天上去。我建议你在代码开头就明确标注当前数据用的是哪个坐标系,别偷懒。
1.3 点云属性:坐标、强度、法向量
每个点云点,最基本的属性就是三维坐标(x, y, z)。但光有坐标不够,很多算法还需要额外信息。
| 属性 | 含义 | 典型用途 |
|---|---|---|
| 坐标 (x, y, z) | 点在空间中的位置 | 所有滤波、配准、分割的基础 |
| 强度 (intensity) | 激光回波信号的强度值 | 区分不同材质、去除噪声点 |
| 法向量 (normal) | 点所在局部表面的朝向 | 平面检测、边缘提取、平滑滤波 |
| RGB颜色 | 从相机映射过来的颜色 | 语义分割、可视化 |
强度值特别有意思。我在做道路检测时发现,沥青路面的强度值通常在80-120之间,而车道线的强度值能到200以上。利用这个差异,可以轻松滤掉路面噪声。你想想看,如果只靠坐标滤波,这些信息就全浪费了。
法向量不是直接采集的,需要从邻域点估算。常用的方法有PCA(主成分分析)和最小二乘拟合。估算法向量时,邻域半径的选择很关键——半径太小,噪声大;半径太大,细节丢失。我一般先试0.1米,再根据效果微调。
1.4 常用点云库简介:PCL vs Open3D
做点云处理,离不开两个库:PCL和Open3D。我两个都用,但场景不同。
PCL(Point Cloud Library):老牌库,功能极其全面。从滤波、配准到分割、识别,几乎什么都有。但缺点也很明显——编译麻烦,文档老旧,API设计偏C++风格。如果你做工业级应用,PCL是首选。我最早的项目就是用PCL做的,那时候Open3D还没出生呢。
Open3D:后起之秀,Python接口友好,安装简单(一行pip搞定)。可视化做得特别好,适合快速原型开发和教学。但功能深度不如PCL,一些高级算法(比如ICP的多种变体)需要自己实现。
我的建议是:
- 做研究、快速验证 → 用Open3D
- 做产品、追求稳定 → 用PCL
- 两个都学,不冲突
1.5 本章知识体系
下面这张图,是我梳理的点云数据基础的知识结构。你可以把它当作一张地图,后面每学一个新概念,都回来看看它属于哪个模块。
这张图把本章内容串起来了。你看到没?四个分支最终都指向同一个核心——理解你的数据。数据结构决定了你怎么读数据,坐标系统决定了数据在空间中的位置,点云属性决定了你能用哪些信息,而常用库决定了你用什么工具。
好了,第一章就到这里。记住一句话:调参数之前,先读懂你的点云。下一章我们开始讲具体的滤波算法,到时候你会感谢今天打下的基础。
📌 本章要点回顾:
- PCD带头部信息,PLY支持面片,XYZ最简但缺元数据
- 坐标系搞混 = 数据白做,务必明确标注
- 强度值和法向量是滤波的好帮手,别只用坐标
- PCL适合产品,Open3D适合快速验证,两个都学