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。它们各有侧重,我画了张图帮你理清关系。

点云开源库生态概览 点云数据 PCL C++ 工业级算法库 Open3D Python 快速原型 CloudCompare 可视化 & 手动编辑 滤波 / 配准 / 分割 特征提取 / 表面重建 SLAM 后端优化 快速可视化 / 交互 深度学习数据预处理 教学演示 数据质量检查 手动裁剪 / 标注 格式转换 选库建议 算法开发用 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 工具,不是库。但它在点云处理工作流中不可或缺。我经常用它做三件事:

  1. 数据质量检查:打开点云,肉眼看看有没有异常点
  2. 手动裁剪:框选删除不需要的区域
  3. 格式转换:在 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,找个点云文件打开看看,感受一下「三维世界」是什么样的。