第一章 点云数据基础:从零认识你的数据

做点云处理这些年,我见过太多人一上来就调滤波参数,结果越调越懵。为什么?说白了,你连手里拿的是什么数据都没搞清楚。这一章,我们就从最基础的东西说起——点云到底是什么,它长什么样,怎么存,怎么读。

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标准)

你想想看,如果坐标系搞混了,滤波出来的点云可能直接飞到天上去。我建议你在代码开头就明确标注当前数据用的是哪个坐标系,别偷懒。

⚠️ 我曾经犯过的错: 有一次把Velodyne的激光雷达数据当成相机坐标系处理,结果地面点全变成了墙面点。排查了整整两天才发现是坐标系转换没做。从那以后,我每条数据进来第一件事就是打印坐标系信息。

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
  • 两个都学,不冲突
💡 小技巧: 如果你用PCL,记得开启多线程编译(cmake -DCMAKE_BUILD_TYPE=Release -DPCL_ENABLE_SSE=ON),编译速度能快3倍。我第一次编译PCL时等了40分钟,后来才发现这个选项。

1.5 本章知识体系

下面这张图,是我梳理的点云数据基础的知识结构。你可以把它当作一张地图,后面每学一个新概念,都回来看看它属于哪个模块。

点云数据基础 数据结构 PCD / PLY / XYZ 有序 vs 无序 坐标系统 世界 / 传感器 / 相机 坐标系转换 点云属性 坐标 / 强度 / 法向量 RGB颜色 常用点云库 PCL (C++) Open3D (Python) 核心思路:先搞清楚数据格式和坐标系,再谈滤波参数 数据是死的,参数是活的 —— 理解数据,才能调好参数

这张图把本章内容串起来了。你看到没?四个分支最终都指向同一个核心——理解你的数据。数据结构决定了你怎么读数据,坐标系统决定了数据在空间中的位置,点云属性决定了你能用哪些信息,而常用库决定了你用什么工具。

好了,第一章就到这里。记住一句话:调参数之前,先读懂你的点云。下一章我们开始讲具体的滤波算法,到时候你会感谢今天打下的基础。

📌 本章要点回顾:

  • PCD带头部信息,PLY支持面片,XYZ最简但缺元数据
  • 坐标系搞混 = 数据白做,务必明确标注
  • 强度值和法向量是滤波的好帮手,别只用坐标
  • PCL适合产品,Open3D适合快速验证,两个都学
可可精品资料库