作者 by Tianzhi Jia / 2022-05-13 / 暂无评论 / 1145 个足迹
draw_registration_result
在配准过程中可视化对齐。在本教程中,我们展示了两个ICP变体,即点到点ICP和点到面ICP[Rusinkiewicz2001]def draw_registration_result(source, target, transformation):
source_temp = copy.deepcopy(source)
target_temp = copy.deepcopy(target)
source_temp.paint_uniform_color([1, 0.706, 0])
target_temp.paint_uniform_color([0, 0.651, 0.929])
source_temp.transform(transformation)
o3d.visualization.draw_geometries([source_temp, target_temp],
zoom=0.4459,
front=[0.9288, -0.2951, -0.2242],
lookat=[1.6784, 2.0612, 1.4451],
up=[-0.3402, -0.9189, -0.1996])
注意:由于函数transform
和paint_uniform_color
改变点云,我们调用copy.deepcopy
来制作副本并保护原始点云。
注意:初试对齐通常通过全局配准算法获得。有关实例,请参阅全局配准。
demo_icp_pcds = o3d.data.DemoICPPointClouds()
source = o3d.io.read_point_cloud(demo_icp_pcds.paths[0])
target = o3d.io.read_point_cloud(demo_icp_pcds.paths[1])
threshold = 0.02
trans_init = np.asarray([[0.862, 0.011, -0.507, 0.5],
[-0.139, 0.967, -0.215, 0.7],
[0.487, 0.255, 0.835, -1.4], [0.0, 0.0, 0.0, 1.0]])
draw_registration_result(source, target, trans_init)
evaluate_registration
计算两个主要指标:fitness
,用于测量重叠区域(内嵌对应关系的数目/目标中的点数)。越高越好。inlier_rmse
,它测量所有内嵌对应关系的RMSE。越低越好。print("Initial alignment")
evaluation = o3d.pipelines.registration.evaluate_registration(
source, target, threshold, trans_init)
print(evaluation)
TransformationEstimationPointToPoint
提供了用于计算点到点ICP目标的残差和雅克比矩阵的函数。该函数registration_icp
将其作为参数,运行点到点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)
fitness
分数从0.174723增加到0.372450。inlier_rmse
从0.011771降低到0.007760。默认情况下,registration_icp
运行直到收敛或达到最大迭代次数(默认为30次)。可以更改它以允许更多的计算时间并进一步改进结果。reg_p2p = o3d.pipelines.registration.registration_icp(
source, target, threshold, trans_init,
o3d.pipelines.registration.TransformationEstimationPointToPoint(),
o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration=2000))
print(reg_p2p)
print("Transformation is:")
print(reg_p2p.transformation)
draw_registration_result(source, target, reg_p2p.transformation)
fitness
提高到0.621123。inlier_rmse
减少到0.006583。registration_icp
使用不同的参数TransformationEstimationPointToPlane
调用。在内部,该类实现了函数来计算点到面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)
fitness
得分为0.620972,inlier_rmse
得分为0.006581)。点到面ICP算法使用法向量。在本教程中,我们将从文件加载法向量。如果未给出法向量,则可以使用顶点法向量估计来计算他们。
独特见解