1. 点云数据基础
各位同学好,我是你们这门课的老朋友。咱们今天正式开篇,聊聊点云到底是什么东西。
说实话,我第一次接触点云是在一个三维重建项目里。当时甲方扔给我一个几十兆的 .pcd 文件,我打开一看——满屏密密麻麻的彩色小点,第一反应是「这玩意儿能干啥?」后来才明白,这些看似杂乱的点,其实是现实世界在数字空间里的「指纹」。
1.1 什么是点云?
点云,说白了就是一堆三维坐标点的集合。每个点通常包含 (x, y, z) 三个坐标值,有些还会带上颜色 (r, g, b) 或者反射强度 (intensity)。
你想想看,激光雷达扫一下周围环境,每束激光打到一个物体表面就返回一个点。成千上万个这样的点拼在一起,就形成了点云。它不像照片那样是二维像素阵列,而是直接记录物体表面的三维位置。
核心概念:点云是三维空间中最原始、最直接的数字化表达方式。它没有拓扑结构,只有离散的采样点。
点云有几个关键属性:
- 空间分辨率:点与点之间的平均距离,决定了细节的精细程度
- 密度:单位面积或单位体积内的点数
- 噪声水平:测量误差导致的点位置偏差
- 完整性:是否存在遮挡或缺失区域
我在做自动驾驶路测数据采集时遇到过一个问题——同一段路,晴天和雨天扫出来的点云密度能差 30% 以上。雨滴会反射激光,产生大量离群噪声点。嗯,这就是点云数据「脏」的典型表现,也是咱们这门课要解决的核心问题。
1.2 点云数据格式
市面上常见的点云格式有十几种,但咱们做工程最常打交道的就三种:.pcd、.ply 和 .las。我整理了一张对比表,方便你快速理解它们的区别。
| 格式 | 全称 | 主要用途 | 是否支持颜色 | 是否支持强度 | 文件大小 |
|---|---|---|---|---|---|
| .pcd | Point Cloud Data | PCL 原生格式,科研/算法验证 | 是 | 是 | 中等 |
| .ply | Polygon File Format | 三维模型、网格数据交换 | 是 | 否 | 中等 |
| .las | LASer | 测绘/遥感行业标准 | 是 | 是 | 较大 |
1.2.1 PCD 格式
PCD 是 Point Cloud Library (PCL) 的亲儿子。它的文件头是纯文本,点数据可以是 ASCII 或二进制。我个人习惯在调试阶段用 ASCII 格式,方便用文本编辑器直接查看;正式跑数据时转成二进制,读写速度快 5-10 倍。
一个典型的 PCD 文件长这样:
# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z rgb
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 16711680
0.234 0.567 0.890 65280
...
小技巧:PCD 的 VIEWPOINT 字段很多人忽略,但它对点云配准非常关键。我曾经因为忘记设置这个字段,导致两个点云对齐时差了半米,排查了整整一下午。
1.2.2 PLY 格式
PLY 格式比 PCD 更通用,Blender、MeshLab 这些工具都原生支持。它最大的特点是既能存点云,也能存三角网格。如果你做三维重建,最后输出模型时大概率会用 PLY。
PLY 文件分 ASCII 和二进制两种,头部用 element 和 property 描述数据结构。注意一点:PLY 的强度信息不是标准字段,需要自己定义 property float intensity,但很多软件读不了自定义字段。
1.2.3 LAS 格式
LAS 是测绘行业的硬通货。它由美国摄影测量与遥感学会 (ASPRS) 制定,专门为机载激光雷达数据设计。LAS 格式对点分类有严格定义——地面点、植被点、建筑物点、电力线点等等,每个点都有一个分类编码。
我参与过一个电力巡线项目,甲方要求必须用 LAS 格式交付。因为他们的 GIS 系统只认 LAS 的分类字段,用来自动提取电力线和塔杆。如果你做测绘相关的工作,LAS 格式是绕不开的。
注意:LAS 格式有版本差异(1.2、1.3、1.4),不同版本支持的字段数量不同。LAS 1.4 支持最多 256 个分类,而 LAS 1.2 只有 32 个。读取时一定要检查版本号,否则可能解析出错。
1.3 点云开源库概览
工欲善其事,必先利其器。做点云处理,选对工具库能省一半力气。我主要用三个:PCL、Open3D 和 CloudCompare。它们各有侧重,我画了张图帮你理清关系。
1.3.1 PCL (Point Cloud Library)
PCL 是点云处理界的「老大哥」。它用 C++ 写的,算法覆盖了滤波、配准、分割、特征提取、表面重建等几乎所有领域。如果你要做工业级应用,PCL 是首选。
PCL 的模块化设计很清晰:
- filters:各种滤波算法(直通滤波、体素滤波、统计滤波等)
- registration:点云配准(ICP、NDT 等)
- segmentation:点云分割(区域生长、RANSAC 等)
- features:特征描述子(PFH、FPFH、SHOT 等)
- surface:表面重建(泊松重建、移动立方体等)
不过 PCL 也有缺点——编译麻烦,依赖多。我第一次编译 PCL 1.8 时,光解决依赖冲突就花了两天。后来学乖了,直接用 vcpkg 或者 Docker 镜像。
1.3.2 Open3D
Open3D 是后来居上的新秀。它用 Python 和 C++ 双语言接口,对 Python 用户特别友好。我平时做算法原型验证,90% 的情况用 Open3D。
Open3D 的优势在于:
- 安装简单:
pip install open3d一行搞定 - 可视化交互好:鼠标拖拽旋转、缩放,按 Ctrl+C 复制点坐标
- 与深度学习框架集成方便:直接转 NumPy 数组
举个例子,用 Open3D 读取并显示一个点云,只需要几行代码:
import open3d as o3d
# 读取点云
pcd = o3d.io.read_point_cloud("example.pcd")
# 可视化
o3d.visualization.draw_geometries([pcd])
个人经验:Open3D 的 draw_geometries 函数支持键盘快捷键。按 K 可以切换背景色,按 R 重置视角。调试时非常方便,不用每次都写代码调整视角参数。
1.3.3 CloudCompare
CloudCompare 是个「另类」——它是个 GUI 工具,不是库。但它在点云处理工作流中不可或缺。我经常用它做三件事:
- 数据质量检查:打开点云,肉眼看看有没有异常点
- 手动裁剪:框选删除不需要的区域
- 格式转换:在 PCD、PLY、LAS、TXT 之间互转
CloudCompare 还有一个杀手锏——M3C2 距离计算。做变形监测时,两期点云之间的变化量用 M3C2 算,比 ICP 误差分析直观得多。
避坑指南:CloudCompare 默认会改变点云的坐标系。我曾经把 LAS 文件拖进去再导出,结果坐标偏移了 0.001 度(约 100 米)。后来发现是导出时坐标系设置没勾选「保持原始」。切记:导出前检查坐标设置。
1.4 如何选择?
说了这么多,你可能想问:那我到底该用哪个?
我的建议是:
- 做算法开发、写 C++ 工程 → PCL
- 做快速原型、Python 用户 → Open3D
- 做数据检查、手动编辑 → CloudCompare
- 实际项目中 → 三个配合使用
我自己在自动驾驶项目中的典型工作流是:CloudCompare 先检查数据质量 → Open3D 写预处理脚本 → PCL 做核心配准算法。各取所长,效率最高。
好了,第一章的内容就到这里。点云的基础概念、三种主流格式、三个核心工具库,咱们都过了一遍。这些是后续所有章节的基石,建议你动手装一下 Open3D 和 CloudCompare,找个点云文件打开看看,感受一下「三维世界」是什么样的。