点云基础与 3D 重建 - 从采集到处理
什么是点云数据 - 3D 空间的离散表示
点云是 3D 空间中大量点的集合,每个点包含 (x, y, z) 坐标,可选附加颜色 (RGB)、法线向量、强度等属性。它是 3D 世界最直接的数字化表示形式。
点云的特点:
- 无序性:点之间没有固定的拓扑连接关系
- 密度不均:近处密集,远处稀疏
- 噪声:传感器误差导致的离群点
- 数据量大:单次扫描可产生数百万到数十亿个点
常见文件格式:
- PLY:灵活的多边形文件格式,支持 ASCII 和二进制
- PCD: PCL (Point Cloud Library) 的原生格式
- LAS/LAZ: LiDAR 行业标准,LAZ 为压缩版本
- E57: 3D 扫描数据的开放标准
应用领域:自动驾驶 (环境感知)、建筑测量 (BIM)、文化遗产数字化、机器人导航、地形测绘、工业检测。
数据格式与体积量级:PLY (Polygon File Format) 是最通用的点云格式,同时支持 ASCII 与二进制两种形式。体积上需要有量级概念:1 亿点的点云存为 PLY 二进制约 2.4GB,改用 LAZ 压缩后约 400MB。
点云数据的四个固有特性:无结构 (不像图像那样具有网格结构,点的排列顺序不带含义)、密度不均 (随传感器距离与入射角变化)、含噪声 (测量误差使部分点偏离真实表面)、规模大 (一次扫描即可产生数百万到数十亿点)。测量与建筑领域常把点云与 BIM (Building Information Modeling) 流程联动,文化遗产领域用于遗迹和雕塑的数字归档,制造业则用于零件尺寸检查与逆向工程。
点云采集 - LiDAR、深度相机和 SfM
点云数据可通过多种传感器和算法获取,各有不同的精度、范围和成本特征。
LiDAR (激光雷达):
- 发射激光脉冲,测量反射时间计算距离
- 精度:毫米级 (地面扫描仪) 到厘米级 (机载)
- 范围:数米到数百米
- 代表设备:Velodyne (自动驾驶), Leica (测量), iPhone Pro (消费级)
深度相机:
- 结构光:投射已知图案,从变形推算深度 (Intel RealSense, Kinect v1)
- ToF (飞行时间):测量光往返时间 (Kinect v2, iPad Pro)
- 范围:0.3-10m,适合室内
SfM (运动恢复结构):
- 从多张普通照片重建 3D 点云
- 无需特殊硬件,仅需相机
- 工具:COLMAP, Meshroom, OpenMVG
- 精度取决于图像质量和数量
LiDAR (Light Detection and Ranging) 的四类设备:LiDAR 发射激光,由反射光的往返时间 (ToF) 换算距离。地面式 (TLS) 如 Leica RTC360,精度 ±1mm、量程 130m、每秒 200 万点,单台日本区售价为 500 万至 1500 万日元;机载式 (ALS) 搭载于无人机或飞机,精度 ±3cm,适合大范围测量;车载式 (MLS) 如 Velodyne VLP-16,每秒 30 万点、360° 扫描;iPhone LiDAR 内置于 iPad Pro 与 iPhone Pro,精度 ±1cm、量程 5m,适合轻量的 3D 扫描。
深度相机 (RGB-D) 与 Structure from Motion:深度相机同时获取彩色图像与深度图像。Intel RealSense D435 采用双目红外方式,适合室内;Microsoft Azure Kinect 采用 ToF 方式,精度 ±11mm@1m,已用于工业级 3D 扫描仪。Structure from Motion (SfM) 则从多视角的 2D 照片恢复 3D 点云,用 100 张图像可生成数百万点,精度随拍摄条件变化,约为 ±1-5cm。
点云预处理 - 去噪与降采样
原始点云通常包含噪声和冗余数据,预处理是后续分析的必要步骤。
统计离群点去除:计算每个点到其 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 近邻或固定半径内的点拟合平面,平面法向量即为法线。法线对于网格重建和渲染至关重要。
两种离群点移除:统计离群点移除 (SOR) 先算出每个点到 k 个近邻的平均距离,再把超过 “全体平均距离 + n × 标准差” 的点判为离群点,k=20、n=2.0 是常见设定,一般会移除点云的 1-5%。半径离群点移除 (ROR) 移除半径 r 内近邻点数不足阈值的点,例如 pcd.remove_radius_outlier(nb_points=16, radius=0.05) 会移除半径 5cm 内不足 16 个点的孤立点。
体素尺寸的选择与法线估计:体素尺寸按场景规模选择,室内场景取 0.5-2cm、室外场景取 5-20cm、城市规模取 50cm-1m;1 亿点用 1cm 体素降采样后约剩 500 万点,相当于减少 95%。法线估计用 pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30)),即从半径 10cm 内最多 30 个点拟合法线;再用 pcd.orient_normals_consistent_tangent_plane(k=15) 保证法线朝向的一致性。
点云配准 - 整合多次扫描
将多次扫描获得的点云对齐到统一坐标系,是完整场景重建的关键步骤。
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 实现。
ICP 的接口与初始位姿:Open3D 的调用形式为 o3d.pipelines.registration.registration_icp(source, target, max_distance, init_transform, estimation_method),点到平面的变体比点到点收敛快 5-10 倍。由于 ICP 属于局部优化方法,初始位姿离真解太远时不会收敛,因此需要先做粗配准。
粗配准与全局配准:常用做法是 FPFH + RANSAC,即用 Fast Point Feature Histograms 计算局部特征、再由 RANSAC 推定对应点,Open3D 中对应 registration_ransac_based_on_feature_matching();也可以手动指定 3 组以上对应点直接算出初始变换。多视图配准则用位姿图优化同时优化全部扫描,100 次扫描整合后仍可把累积误差控制在 1cm 以内。
网格重建 - 从点云到表面模型
将离散点云转换为连续的三角网格表面,用于可视化、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)
Poisson 与 Ball Pivoting 的取舍:3D 打印、CAD、渲染等用途需要把点云重建成三角网格。Poisson Surface Reconstruction 利用法线信息估计隐式表面函数,再抽取等值面,depth 参数一般取 8-12,depth=9 时处理 100 万点约需 10 秒,缺点是会在没有数据的区域也生成表面 (过度插值)。Ball Pivoting Algorithm (BPA) 让虚拟球在点云上滚动、在同时接触 3 点的位置生成三角形,接口为 o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(pcd, radii),球半径通常设为平均点间距的 1-3 倍。
深度学习的重建路线:NeRF (Neural Radiance Fields) 与 3D Gaussian Splatting 从图像集合学习隐式的 3D 表示,可渲染任意视角。3D Gaussian Splatting 用 100 张图像约 30 分钟训练,即可得到可实时渲染的 3D 场景。
实用点云处理 - 工具与流水线构建
构建实用的点云处理流水线所需的工具、库和最佳实践。
主要工具库:
- 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 并行处理
建筑建模的处理流水线示例:多视角 LiDAR 扫描取得点云 → SOR 与体素降采样完成前处理 → FPFH 与 ICP 完成多次扫描的配准 → 法线估计与 Poisson 重建生成网格 → 纹理映射得到最终模型。工具方面,PCL 与 ROS 的联动最为成熟,CloudCompare 是图形界面的点云处理软件,专长于 LAS/LAZ 的读写。
超大规模与 GPU 加速:10 亿点以上的点云放不进内存,需要用空间划分 (八叉树) 管理、只载入需要的区域,即 Out-of-Core 处理。GPU 方面,基于 CUDA 的点云库 (cuPCL、kaolin) 可让 ICP 与体素化比 CPU 快 10-50 倍:1 亿点的 ICP 在 CPU 上需 30 秒,在 GPU 上可缩短到 1 秒以内。