Open3d:点对点ICP配准,点对面ICP配准
1.点对点ICP配准
print("Apply point-to-point ICP")
reg_p2p = o3d.pipelines.registration.registration_icp(source, target, threshold, trans_init,o3d.pipelines.registration.TransformationEstimationPointToPoint())
print(reg_p2p)
print("Transformation is:")
print(reg_p2p.transformation)
draw_registration_result(source, target, reg_p2p.transformation)
2.点对面ICP配准
print("Apply point-to-plane ICP")
reg_p2l = o3d.pipelines.registration.registration_icp(source, target, threshold, trans_init,o3d.pipelines.registration.TransformationEstimationPointToPlane())
print(reg_p2l)
print("Transformation is:")
print(reg_p2l.transformation)
draw_registration_result(source, target, reg_p2l.transformation)
3.分析
import open3d as o3d
import numpy as np# 读取点云
source = o3d.io.read_point_cloud("source.pcd")
target = o3d.io.read_point_cloud("target.pcd")# 计算法线(必需步骤)
source.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
#保持法线一致性, 使得法线均朝gu帽上方
source.orient_normals_towards_camera_location([0, 0, 0])target.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
#保持法线一致性, 使得法线均朝gu帽上方
target.orient_normals_towards_camera_location([0, 0, 0])# 设置ICP参数
max_correspondence_distance = 0.05
init_transformation = np.identity(4)# 创建Point-to-Plane估计器
estimation_method = o3d.pipelines.registration.TransformationEstimationPointToPlane()# 设置收敛准则
criteria = o3d.pipelines.registration.ICPConvergenceCriteria()
criteria.relative_fitness = 1e-6
criteria.relative_rmse = 1e-6
criteria.max_iteration = 100# 执行ICP配准
result = o3d.pipelines.registration.registration_icp(source, target, max_correspondence_distance,init_transformation, estimation_method, criteria
)print("变换矩阵:\n", result.transformation)
print("拟合度:", result.fitness)
print("内点RMSE:", result.inlier_rmse)
p2p-icp
p2l-icp
总结对比表:
方法类型 | 目标函数 | 优化目标 | 收敛速度 | 是否需要法向量 |
---|---|---|---|---|
Point-to-point | 最小化点对之间的欧氏距离 | 点对齐 | 较慢 | 否 |
Point-to-plane | 最小化点到对应点切平面的距离 | 点落在局部平面 | 较快 | 是 |
Point-to-plane ICP 精度更高的核心原因
比较维度 | Point-to-point | Point-to-plane |
---|---|---|
对齐方式 | 强制点对重合 | 允许滑移到局部平面,避免过拟合 |
对噪声的鲁棒性 | 差(点对误差会被平方放大) | 好(法向约束平滑误差) |
对初始误差容忍度 | 低 | 高 |
局部最优陷阱 | 容易陷入 | 更不易陷入 |
需要法向量 | 否 | 是(但这也是它能更准的前提) |
但需要注意:
-
精度高的前提是法向量必须准确。如果法向量估计不准,Point-to-plane 反而可能更差。
-
Point-to-point 在某些低曲率或平面区域反而可能更稳定,因为没有法向量误差。
✅ 实际建议(工程经验):
-
有可靠法向量 → 用 Point-to-plane
-
法向量不可靠或无 → 用 Point-to-point 或先做平滑处理
📌 总结一句话:
在法向量准确的前提下,Point-to-plane ICP 的配准精度更高、更鲁棒。
参考资料:
1.ICP备案 - Open3D 0.19.0 文档
2.kimi.ai
3.deepseek.ai