点云基础与 3D 重建 - 从采集到处理
什么是点云数据 - 3D 空间的离散表示
点云是 3D 空间中大量点的集合,每个点包含 (x, y, z) 坐标,可选附加颜色 (RGB)、法线向量、强度等属性。它是 3D 世界最直接的数字化表示形式。
点云的特点:
- 无序性: 点之间没有固定的拓扑连接关系
- 密度不均: 近处密集,远处稀疏
- 噪声: 传感器误差导致的离群点
- 数据量大: 单次扫描可产生数百万到数十亿个点
常见文件格式:
- PLY: 灵活的多边形文件格式,支持 ASCII 和二进制
- PCD: PCL (Point Cloud Library) 的原生格式
- LAS/LAZ: LiDAR 行业标准,LAZ 为压缩版本
- E57: 3D 扫描数据的开放标准
应用领域: 自动驾驶 (环境感知)、建筑测量 (BIM)、文化遗产数字化、机器人导航、地形测绘、工业检测。
点云采集 - LiDAR、深度相机和 SfM
点云数据可通过多种传感器和算法获取,各有不同的精度、范围和成本特征。
LiDAR (激光雷达):
- 发射激光脉冲,测量反射时间计算距离
- 精度: 毫米级 (地面扫描仪) 到厘米级 (机载)
- 范围: 数米到数百米
- 代表设备: Velodyne (自动驾驶), Leica (测量), iPhone Pro (消费级)
深度相机:
- 结构光: 投射已知图案,从变形推算深度 (Intel RealSense, Kinect v1)
- ToF (飞行时间): 测量光往返时间 (Kinect v2, iPad Pro)
- 范围: 0.3-10m,适合室内
SfM (运动恢复结构):
- 从多张普通照片重建 3D 点云
- 无需特殊硬件,仅需相机
- 工具: COLMAP, Meshroom, OpenMVG
- 精度取决于图像质量和数量
点云预处理 - 去噪与降采样
原始点云通常包含噪声和冗余数据,预处理是后续分析的必要步骤。
统计离群点去除: 计算每个点到其 K 个最近邻的平均距离。距离超过全局平均值 + N 倍标准差的点视为离群点。Open3D: pcd.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0)
半径离群点去除: 在指定半径内邻居数少于阈值的点被移除。适合去除孤立噪点。Open3D: pcd.remove_radius_outlier(nb_points=16, radius=0.05)
体素降采样: 将空间划分为均匀的体素网格,每个体素内的点取质心作为代表点。有效减少点数同时保持整体形状。Open3D: pcd.voxel_down_sample(voxel_size=0.01)
法线估计: 为每个点估计局部表面法线方向。基于 K 近邻或固定半径内的点拟合平面,平面法向量即为法线。法线对于网格重建和渲染至关重要。
点云配准 - 整合多次扫描
将多次扫描获得的点云对齐到统一坐标系,是完整场景重建的关键步骤。
ICP (Iterative Closest Point):
- 经典配准算法,迭代寻找最近点对并最小化距离
- 需要较好的初始对齐 (否则陷入局部最优)
- 变体: Point-to-Point ICP, Point-to-Plane ICP (收敛更快)
- Open3D:
o3d.pipelines.registration.registration_icp()
全局配准:
- 不需要初始对齐的方法
- FPFH 特征 + RANSAC: 提取局部几何特征,匹配对应点
- Fast Global Registration: 比 RANSAC 快一个数量级
多视图配准: 将所有扫描同时优化对齐 (位姿图优化)。避免逐对配准的误差累积。Open3D 提供 multiway_registration 实现。
网格重建 - 从点云到表面模型
将离散点云转换为连续的三角网格表面,用于可视化、3D 打印和仿真。
Poisson 重建:
- 将法线场视为指示函数的梯度,求解泊松方程得到隐式表面
- 产生光滑、封闭的网格
- 需要准确的法线估计
- Open3D:
o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd, depth=9)
Ball Pivoting Algorithm (BPA):
- 模拟一个球在点云表面滚动,球接触的三个点形成三角形
- 保留原始点位置 (不平滑)
- 对噪声敏感,需要预处理
Alpha Shapes:
- Delaunay 三角化的子集,通过 alpha 参数控制细节级别
- 适合非封闭表面
- Open3D:
o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha=0.03)
实用点云处理 - 工具与流水线构建
构建实用的点云处理流水线所需的工具、库和最佳实践。
主要工具库:
- Open3D: Python/C++ 库,功能全面,API 友好。推荐首选
- PCL (Point Cloud Library): C++ 库,功能最丰富但学习曲线陡峭
- CloudCompare: 开源 GUI 工具,适合可视化和交互式处理
- PDAL: 点云数据抽象库,适合 GIS 和 LiDAR 数据流水线
可视化:
- Open3D:
o3d.visualization.draw_geometries([pcd]) - Web: Three.js + BufferGeometry 渲染百万级点云
- Potree: 基于 Web 的大规模点云查看器 (支持数十亿点)
性能优化:
- 使用八叉树 (Octree) 或 KD-Tree 加速空间查询
- 大规模点云使用分块处理 (tiling)
- GPU 加速: CUDA 或 OpenCL 并行处理