4. 点云配准基础:ICP算法原理与变体
点云配准,说白了就是把不同位置拍到的点云拼到一起。你拿着激光扫描仪绕物体转一圈,每站扫到的点云都在自己的坐标系里,怎么把它们对齐到同一个坐标系?这就是配准要解决的问题。
ICP(Iterative Closest Point)是这里面最经典的算法。我从2015年开始做三维重建,前前后后调过不下十种ICP变体。说实话,很多项目最后能跑通,靠的就是把ICP吃透了。
4.1 ICP的核心思想
ICP的思路很直观:
- 找两个点云之间的对应点对
- 根据这些对应关系算一个变换矩阵
- 把源点云变换过去
- 重复直到收敛
嗯,这里要注意——ICP要求两个点云已经有粗略的对齐。如果初始位置差太远,它很容易掉进局部最优。我在项目里吃过这个亏,后面会讲怎么避坑。
4.2 点对点ICP(Point-to-Point ICP)
这是最原始的版本。它的目标函数是:
min(R,t) Σ || R·p_i + t - q_i ||²
其中p_i是源点云中的点,q_i是目标点云中对应的最近点。说白了就是让对应点之间的距离平方和最小。
求解方法:
- 用SVD分解算旋转矩阵R
- 用质心对齐算平移向量t
- 交替迭代直到收敛
我记得第一次自己手写ICP时,SVD分解那步卡了很久。后来发现OpenCV和Eigen都有现成的函数,但理解原理还是很重要——至少你知道什么时候该用哪个变体。
4.3 点对面ICP(Point-to-Plane ICP)
点对点ICP只考虑点的位置,忽略了局部几何信息。点对面ICP改进了这一点——它让源点到目标点云对应点所在切平面的距离最小化。
目标函数变成:
min(R,t) Σ [ (R·p_i + t - q_i) · n_i ]²
其中n_i是目标点云中q_i点的法向量。
为什么更好?
- 允许点在切平面上滑动,收敛更快
- 对平坦区域的配准更鲁棒
- 迭代次数通常比点对点少30%-50%
我曾经在一个室内场景重建项目里对比过两种方法。点对点ICP跑了80次迭代还没稳定,换成点对面ICP,25次就收敛了。差距就是这么明显。
4.4 ICP的变体
实际项目中,标准ICP往往不够用。这里介绍两个我常用的变体。
4.4.1 Sparse ICP
标准ICP用L2范数(平方误差),对离群点非常敏感。Sparse ICP改用L1范数或Huber损失,说白了就是让大误差的权重降低。
目标函数:
min(R,t) Σ ρ( ||R·p_i + t - q_i|| )
其中ρ是鲁棒核函数。
适用场景:
- 点云有大量离群点
- 部分重叠率低(低于50%)
- 动态场景中有移动物体
我做过一个隧道扫描的项目,点云里有很多飞点(激光打到水雾上产生的噪声)。标准ICP完全跑偏,换成Sparse ICP后结果就对了。嗯,这里的关键是核函数参数要调——太敏感等于没用,太鲁棒又收敛慢。
4.4.2 Generalized ICP
Generalized ICP把点对点和点对面统一到了一个框架里。它用协方差矩阵来描述每个点的局部几何特性:
- 如果点是平面上的点(法向量明确),用点对面约束
- 如果点是角点或边缘(法向量不确定),用点对点约束
- 自动根据局部几何结构分配权重
说白了就是让算法自己判断该用哪种方式。我在做室外大场景重建时特别喜欢用这个变体——场景里既有墙面(平面)又有树干(圆柱),Generalized ICP能自动适配。
| 特性 | 点对点ICP | 点对面ICP | Generalized ICP |
|---|---|---|---|
| 收敛速度 | 慢 | 快 | 快 |
| 对噪声鲁棒性 | 低 | 中 | 高 |
| 对离群点鲁棒性 | 低 | 低 | 中 |
| 需要法向量 | 否 | 是 | 是 |
| 实现复杂度 | 低 | 中 | 高 |
4.5 配准评价指标
配准做完了,怎么知道结果好不好?不能光靠肉眼瞅。我一般用以下几个指标:
4.5.1 均方根误差(RMSE)
RMSE = sqrt( (1/N) Σ ||R·p_i + t - q_i||² )
这个指标最常用。但要注意——它只计算了有对应关系的点对。如果两个点云重叠率低,RMSE可能虚低。
4.5.2 对应点距离中位数(Median Error)
比RMSE更鲁棒。离群点对中位数影响小。我一般两个都看,如果RMSE和中位数差距很大,说明有离群点没处理好。
4.5.3 重叠率(Overlap Ratio)
Overlap = (距离小于阈值的对应点对数) / 总点数
阈值一般取点云平均间距的2-3倍。重叠率低于30%的配准基本不可靠。
4.5.4 旋转误差与平移误差
如果有真值(比如仿真数据或高精度标定),可以单独算:
- 旋转误差:R_est和R_gt之间的角度差
- 平移误差:t_est和t_gt之间的欧氏距离
4.6 ICP的知识体系
下面这张图总结了ICP的核心脉络:
4.7 避坑指南
最后分享几个我踩过的坑:
- 初始对齐太差: 我曾经直接把两站相距10米的点云丢进ICP,结果跑了200次迭代还是错的。后来先用FPFH特征匹配做粗配准,再用ICP精配准,问题就解决了。
- 点云密度不均匀: 近处点密、远处点稀,ICP会偏向密集区域。建议做均匀降采样,或者用体素滤波让密度均匀。
- 对称结构误导: 圆柱、球体这类对称物体,ICP可能收敛到错误的角度。我遇到过把圆柱转了180度还自认为配准成功的情况。解决办法是加入几何约束或人工标记点。
- 迭代次数设太少: 默认50次不一定够。我一般设100-200次,加一个early stopping——如果连续5次误差变化小于1e-6就提前退出。