本文主要是介绍iss关键点检测以及ICP粗配准,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、代码
Python
import open3d as o3d
import numpy as npdef extract_points(point_cloud, salient_radius=5, non_max_radius=5, gamma_21=0.95, gamma_32=0.95, min_neighbors=6):keypoints = o3d.geometry.keypoint.compute_iss_keypoints(point_cloud,salient_radius=salient_radius,non_max_radius=non_max_radius,gamma_21=gamma_21,gamma_32=gamma_32,min_neighbors=min_neighbors)return keypointsdef view_show(point1, point2):# 关键点绿色point1.paint_uniform_color([0, 1, 0])# 点云红色point2.paint_uniform_color([1, 0, 0])# 可视化方法1# 可视化关键点和原始点云# o3d.visualization.draw_geometries([point1, point2],# window_name="ISS",# point_show_normal=True,# mesh_show_back_face=True)# 可视化方法2vis = o3d.visualization.Visualizer()vis.create_window(window_name="ISS", width=1200, height=1200)# 设置背景颜色vis.get_render_option().background_color = [0, 0, 0] # 白色背景# 添加点云到Visualizervis.add_geometry(point1)vis.add_geometry(point2)# 运行可视化循环vis.run()vis.destroy_window()def keypoints_show(point):# 关键点绿色point.paint_uniform_color([0, 1, 0])# 可视化方法1# 可视化关键点和原始点云# o3d.visualization.draw_geometries([point1, point2],# window_name="ISS",# point_show_normal=True,# mesh_show_back_face=True)# 可视化方法2vis = o3d.visualization.Visualizer()vis.create_window(window_name="ISS", width=1200, height=1200)# 设置背景颜色vis.get_render_option().background_color = [0, 0, 0] # 白色背景# 添加点云到Visualizervis.add_geometry(point)# 运行可视化循环vis.run()vis.destroy_window()if __name__ == "__main__":# 读取点云scene = o3d.io.read_point_cloud("data/cow01.pcd")target = o3d.io.read_point_cloud("data/cow02.pcd")# 使用ISS关键点检测算法keypoints_scene = extract_points(scene)keypoints_target = extract_points(target)# 打印关键点个数print(f"scene点的个数:{len(scene.points)}")print(f"keypoints_scene点的个数:{len(keypoints_scene.points)}")print(f"target点的个数:{len(target.points)}")print(f"keypoints_target点的个数:{len(keypoints_target.points)}")# 可视化关键点keypoints_show(keypoints_scene)keypoints_show(keypoints_target)# 可视化关键点和原点云view_show(keypoints_scene, scene)view_show(keypoints_target, target)trans_init = np.eye(4)# 260这是猪的参数# reg_p = o3d.pipelines.registration.registration_icp(# keypoints_scene, keypoints_target, 260, trans_init,# o3d.pipelines.registration.TransformationEstimationPointToPoint(),# o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration=5000)# )# 60这是羊的参数reg_p = o3d.pipelines.registration.registration_icp(keypoints_scene, keypoints_target, 60, trans_init,o3d.pipelines.registration.TransformationEstimationPointToPoint(),o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration=5000))print(reg_p.transformation)keypoints_scene.transform(reg_p.transformation)# 可视化配准结果view_show(keypoints_target, keypoints_scene)
关键代码解析:
def extract_points(point_cloud, salient_radius=5, non_max_radius=5, gamma_21=0.95, gamma_32=0.95, min_neighbors=6):keypoints = o3d.geometry.keypoint.compute_iss_keypoints(point_cloud,salient_radius=salient_radius,non_max_radius=non_max_radius,gamma_21=gamma_21,gamma_32=gamma_32,min_neighbors=min_neighbors)return keypoints
-
point_cloud
:输入的点云数据,即待提取关键点的点云。 -
salient_radius
:ISS 关键点提取中用于确定关键点区域大小的参数。它定义了在计算局部表面特征时所考虑的邻域半径大小。增加此值将导致更大的关键点区域,可能会检测到更多的关键点,但也可能导致关键点之间的冗余。 -
non_max_radius
:ISS 关键点提取中的非极大值抑制半径。在关键点检测后,该参数用于消除局部极大值,以便保留局部最显著的关键点。增加此值可能会导致更多的关键点被保留,但也可能导致关键点密度较低的区域保留过多的关键点。 -
gamma_21
:它用于确定 ISS 曲率比率特征中的曲率阈值。曲率比率是通过对局部特征的 Hessian 矩阵进行特征值分解来计算的,而gamma_21
是曲率比率的最小允许值。增加此值将导致更多的点被认为是关键点,但也可能会引入更多的噪声或冗余关键点。 -
gamma_32
:它用于确定 ISS 曲率比率特征中的曲率阈值。与gamma_21
类似,gamma_32
是曲率比率的最大允许值。增加此值将导致更多的点被认为是关键点,但也可能会引入更多的噪声或冗余关键点。 -
min_neighbors
:ISS 关键点提取中用于过滤关键点的最小邻居数。它指定了一个关键点周围必须存在的最小邻居数。增加此值将导致更严格的过滤,仅保留周围邻居较多的关键点,而减少此值可能会导致保留更多的关键点,即使它们的邻居较少。
def keypoints_show(point):# 关键点绿色point.paint_uniform_color([0, 1, 0])# 可视化方法1# 可视化关键点和原始点云# o3d.visualization.draw_geometries([point1, point2],# window_name="ISS",# point_show_normal=True,# mesh_show_back_face=True)# 可视化方法2vis = o3d.visualization.Visualizer()vis.create_window(window_name="ISS", width=1200, height=1200)# 设置背景颜色vis.get_render_option().background_color = [0, 0, 0] # 白色背景# 添加点云到Visualizervis.add_geometry(point)# 运行可视化循环vis.run()vis.destroy_window()
-
def keypoints_show(point):
:这是一个函数定义,它接受一个参数point
,表示待可视化的点云数据。 -
point.paint_uniform_color([0, 1, 0])
:将点云中的所有点都涂成绿色。这是为了使关键点在可视化中以绿色显示。 -
vis = o3d.visualization.Visualizer()
:创建一个 Open3D 的可视化对象。 -
vis.create_window(window_name="ISS", width=1200, height=1200)
:创建一个窗口用于显示可视化结果,并设置窗口的名称和大小。 -
vis.get_render_option().background_color = [0, 0, 0]
:设置可视化背景颜色为黑色。这影响了可视化结果的外观。 -
vis.add_geometry(point)
:将点云数据添加到可视化对象中,以便显示。 -
vis.run()
:运行可视化循环,显示点云和关键点。 -
vis.destroy_window()
:在可视化结束后销毁窗口,释放资源。
这段代码的主要作用是将点云数据和其关键点可视化出来,以便用户观察和分析。通过设置背景颜色、点云颜色等参数,可以调整可视化结果的外观,以适应不同的需求
reg_p = o3d.pipelines.registration.registration_icp(keypoints_scene, keypoints_target, 60, trans_init,o3d.pipelines.registration.TransformationEstimationPointToPoint(),o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration=5000))print(reg_p.transformation)keypoints_scene.transform(reg_p.transformation)
-
keypoints_scene
:待配准的源点云的关键点。 -
keypoints_target
:目标点云的关键点,即需要将源点云配准到的点云。 -
60
:ICP算法的最大配准距离,即允许的最大匹配距离。超过这个距离的点将被忽略。这个值的设置会影响配准的结果,过大可能导致匹配不准确,过小可能导致匹配失败。 -
trans_init
:初始的变换矩阵,用于初始化配准过程。通常是根据某些先验信息估计出来的初始变换矩阵。 -
o3d.pipelines.registration.TransformationEstimationPointToPoint()
:指定了配准时所采用的变换估计方法。在这里使用的是点对点的变换估计方法。 -
o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration=5000)
:设置了ICP算法的收敛准则,即迭代的最大次数。在这里设置为5000次迭代。这个值的设置会影响算法的运行时间和最终的配准结果。 -
reg_p
:返回的配准结果对象,包括了最终的变换矩阵等信息。 -
print(reg_p.transformation)
:打印出配准后得到的最优变换矩阵,即将源点云配准到目标点云时所需的变换。 -
keypoints_scene.transform(reg_p.transformation)
:将源点云按照得到的最优变换矩阵进行变换,以实现将其配准到目标点云的效果。
这段代码的作用是将源点云(keypoints_scene
)配准到目标点云(keypoints_target
),并输出最终的配准结果。配准的过程会根据设定的参数进行迭代,直到满足收敛准则为止。
结果:
输入点云的关键点
目标点云的关键点
输入点云的关键点和输入点云
目标点云的关键点和目标点云
配准结果
这篇关于iss关键点检测以及ICP粗配准的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!