一、点云世界初探:什么是点云?
说实话,我第一次接触点云的时候,脑子里冒出来的第一个念头是——这不就是一堆密密麻麻的星星吗?
后来做项目多了才明白,点云其实就是三维空间里一群点的集合。每个点都带着自己的坐标信息(X, Y, Z),有时候还带着颜色、强度之类的附加属性。你想想看,我们平时看到的3D模型是由三角形网格组成的,而点云呢?它就是最原始、最纯粹的三维数据形态——只有点,没有面。
我在做激光雷达数据处理时,经常把点云比作「三维世界的照片」。普通照片记录的是像素颜色,点云记录的是空间位置。一张照片有1920×1080个像素,一个点云可能有几百万甚至上亿个点。
核心概念:点云 = 三维空间中的离散点集,每个点至少包含 (x, y, z) 坐标信息。
点云从哪里来?
常见的点云获取方式有这么几种:
- 激光雷达(LiDAR)——我最常用的方式。车载激光雷达一秒钟能扫出几十万个点,精度能到厘米级。
- 深度相机——比如Kinect、RealSense,消费级产品,精度一般但便宜。
- 摄影测量——用多张照片通过算法重建三维点云,我在做古建筑数字化时用过这招。
- 结构光扫描——工业级应用,精度极高,但扫描范围有限。
嗯,这里要注意:不同来源的点云,密度、精度、噪声水平天差地别。我踩过最大的坑就是拿消费级深度相机的数据直接套用激光雷达的处理流程,结果一塌糊涂。
二、点云数据格式:PCD、PLY、LAS
做点云处理,绕不开文件格式。我这些年跟三种格式打交道最多:PCD、PLY、LAS。每种格式都有自己的脾气。
1. PCD格式——PCL的亲儿子
PCD是Point Cloud Data的缩写,由PCL库(后面会讲)主导推广。它的设计思路很纯粹——专门为点云而生。
一个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 0.5
0.234 0.567 0.890 0.6
...
我个人习惯用PCD做中间格式。为什么?因为它读写快,而且PCL原生支持,不需要额外转换。但要注意,PCD在工业界(尤其是测绘领域)的普及度不如LAS。
小技巧:PCD支持ASCII和二进制两种存储方式。数据量小的时候用ASCII方便调试,数据量大(超过100万点)一定要用二进制,速度能快10倍以上。
2. PLY格式——带网格的选手
PLY(Polygon File Format)是斯坦福大学搞出来的老牌格式。它最大的特点是既能存点云,又能存三角网格。
我在做三维重建项目时,经常先用PLY存点云,等重建完网格后直接追加到同一个文件里,省事。
ply
format ascii 1.0
element vertex 8
property float x
property float y
property float z
element face 6
property list uchar int vertex_indices
end_header
0 0 0
1 0 0
1 1 0
0 1 0
0 0 1
1 0 1
1 1 1
0 1 1
4 0 1 2 3
4 4 5 6 7
...
PLY的缺点?文件头信息比较冗长,而且不同软件对属性字段的解析方式不太一样。我曾经被PLY的颜色编码坑过——有的软件用RGB,有的用BGRA,转换起来很头疼。
3. LAS格式——测绘界的标准
LAS是American Society for Photogrammetry and Remote Sensing(ASPRS)制定的标准格式,主要用于机载激光雷达数据。
如果你做测绘、林业、电力巡检,大概率绕不开LAS。它的特点是:
- 支持分类(地面、建筑、植被等)
- 支持强度信息(Intensity)
- 支持回波次数(Return Number)
- 文件结构高度标准化
说实话,LAS格式的规范文档有上百页,但日常用到的字段其实就十来个。我建议初学者先掌握最基本的点坐标和分类字段就够了。
| 格式 | 主要用途 | 优点 | 缺点 |
|---|---|---|---|
| PCD | 通用点云处理 | 读写快,PCL原生支持 | 工业普及度一般 |
| PLY | 三维重建、可视化 | 支持网格,格式灵活 | 属性解析容易出问题 |
| LAS | 测绘、遥感 | 标准化程度高,带分类 | 文件结构复杂 |
三、点云处理库:PCL vs Open3D
选库就像选工具——没有最好的,只有最顺手的。我两个库都用过,说说我的真实感受。
PCL——老牌劲旅
PCL(Point Cloud Library)是点云处理界的元老,C++编写,功能极其全面。从滤波、配准、分割到识别,几乎你能想到的点云算法它都有。
我记得刚入行时,导师扔给我一本PCL教程,说「看完这个你就能干活了」。结果看了两周,发现光是编译PCL就折腾了三天——依赖库太多了(Boost、Eigen、FLANN、VTK...)。
PCL的典型用法:
// 读取PCD文件
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("input.pcd", *cloud);
// 体素滤波
pcl::VoxelGrid<pcl::PointXYZ> filter;
filter.setInputCloud(cloud);
filter.setLeafSize(0.01f, 0.01f, 0.01f);
filter.filter(*cloud_filtered);
// 保存结果
pcl::io::savePCDFileASCII("output.pcd", *cloud_filtered);
PCL的优势是算法全、社区大、文档多。劣势是编译麻烦、API设计偏老、Python支持不够好。
Open3D——后起之秀
Open3D是Intel实验室搞出来的,主打易用性和现代感。它原生支持Python,API设计非常Pythonic,几行代码就能完成复杂的处理任务。
我最近两年越来越喜欢用Open3D做原型验证。为什么?因为快。从读数据到可视化,五分钟搞定。
import open3d as o3d
# 读取点云
pcd = o3d.io.read_point_cloud("input.pcd")
# 体素滤波
downpcd = pcd.voxel_down_sample(voxel_size=0.01)
# 可视化
o3d.visualization.draw_geometries([downpcd])
Open3D的杀手锏是可视化——交互式窗口、旋转缩放、点选标注,体验比PCL好太多。但它的算法覆盖面不如PCL广,一些冷门算法(比如特定的配准变体)可能找不到。
避坑指南:我曾经在项目里用Open3D做点云配准,结果发现它对大规模点云(超过500万点)的内存管理不如PCL稳定。后来我养成了习惯——小数据用Open3D快速验证,大数据用PCL做工程落地。
四、知识体系总览
说了这么多,咱们用一张图把本章的核心内容串起来:
这张图把本章的知识结构理清楚了。说白了,点云处理就三步:理解数据是什么 → 选对存储格式 → 用合适的库去处理。每一步都有坑,但走通了之后,你会发现点云世界其实挺有意思的。
我的建议:初学者先从Open3D入手,用Python快速跑通一个读取→滤波→可视化的流程,建立感性认识。等需要做大规模处理或工程部署时,再深入学习PCL。两条腿走路,走得更稳。
公众号:蓝海资料掘金营,微信deep3321