目录
一、概述
1.1原理
1.2应用场景
1.3算法实现步骤
二、代码实现
2.1 完整代码
2.2关键函数
2.3关键点可视化
三、实现效果
3.1原始点云
3.2提取后点云
一、概述
1.1原理
ISS(Intrinsic Shape Signatures)关键点提取是一种常用于三维点云的特征提取方法。其主要目的是在点云中找到具有显著几何特征的点,这些点在不同的点云扫描中具有鲁棒性和稳定性。
ISS关键点提取基于以下两个主要思想:
- 局部特征分析:在点云的局部区域内计算几何特征,选择在局部范围内具有显著几何变化的点。
- 尺度空间理论:通过分析不同尺度下的几何特征,选择具有稳定性的点。
具体来说,ISS关键点提取算法利用点云中每个点的局部邻域的协方差矩阵来分析局部几何结构。协方差矩阵的特征值可以揭示局部几何形状的显著性。通过筛选出特征值之间具有显著差异的点,ISS算法能够识别出关键点。
1.2应用场景
ISS关键点提取在许多三维点云处理应用中具有重要作用,主要应用场景包括:
- 三维物体识别与匹配:通过提取关键点并进行描述符匹配,可以实现三维物体的识别与匹配。
- SLAM(同步定位与地图构建):在SLAM系统中,关键点提取用于构建地图和进行定位,提供稳定的特征点以进行配准。
- 三维重建:在三维重建过程中,关键点提取用于对齐不同视角的点云数据,从而生成高质量的三维模型。
- 机器人导航:在机器人导航中,关键点提取用于环境感知和路径规划,帮助机器人理解和探索环境。
- 医学影像分析:在医学影像处理中,关键点提取用于分析和比较不同的三维扫描数据,如CT或MRI扫描结果。
1.3算法实现步骤
ISS关键点提取算法的主要步骤如下:
- 计算局部协方差矩阵:对于每个点,计算其局部邻域的协方差矩阵。
- 计算协方差矩阵的特征值:对协方差矩阵进行特征值分解,获得三个特征值(通常标记为 λ1, λ2, λ3)。
- 特征值筛选:根据特征值之间的关系,筛选出具有显著几何特征的点。一般通过设置阈值来筛选特征值之间差异显著的点。
- 尺度分析:在不同的尺度下重复上述过程,选择在多个尺度下具有稳定性的点。
- 去冗余:通过非最大抑制(NMS,Non-Maximum Suppression)去除冗余的关键点,保留最显著的点。
二、代码实现
2.1 完整代码
# 将提取的特征点变大 便于区分
def keypoints_to_spheres(keypoints):
spheres = o3d.geometry.TriangleMesh()
for keypoint in keypoints.points:
sphere = o3d.geometry.TriangleMesh.create_sphere(radius=1)
sphere.translate(keypoint)
spheres += sphere
spheres.paint_uniform_color([1.0, 0.0, 0.0])
# sphere.translate((1,0,0))
return spheres
pcd = o3d.io.read_point_cloud("gargo50K.pcd")
print(pcd)
tic = time.time()
# --------------------ISS关键点提取的相关参数---------------------
keypoints = o3d.geometry.keypoint.compute_iss_keypoints(pcd,
salient_radius=5,
non_max_radius=5,
gamma_21=0.5,
gamma_32=0.5)
toc = 1000 * (time.time() - tic)
print("ISS Computation took {:.0f} [ms]".format(toc))
print("Extract",keypoints)
pcd.paint_uniform_color([0.0, 1.0, 0.0])
o3d.visualization.draw_geometries([keypoints_to_spheres(keypoints), pcd],width=800,height=800)
2.2关键函数
keypoints = o3d.geometry.keypoint.compute_iss_keypoints(pcd,
salient_radius=5,
non_max_radius=5,
gamma_21=0.5,
gamma_32=0.5)
- salient_radius 和 non_max_radius:这两个参数用于定义用于计算曲率和局部表面变化的邻域大小。较大的值可以捕捉更大范围内的局部几何信息,但也可能导致关键点的数量增加。
- gamma_21 和 gamma_32:这两个参数是 ISS 算法中用来控制曲率比率阈值的参数。它们影响关键点的选择,较小的值可以产生更多但可能更松散的关键点集合,而较大的值则会限制关键点的数量和密度。
2.3关键点可视化
函数 keypoints_to_spheres 的目的是将一组关键点(假设为 Open3D 中的 PointCloud 对象)转换成一组球体,每个球体都表示一个关键点。这些球体会被放置在对应关键点的位置,并且统一涂成红色,最后返回一个包含所有球体的TriangleMesh 对象。
keypoints_to_spheres 函数会将 PointCloud 中的每个关键点转换成一个球体,并返回一个包含所有球体的 TriangleMesh 对象。然后可以使用 Open3D 的可视化工具将这些球体显示出来。
# 将提取的特征点变大 便于区分
def keypoints_to_spheres(keypoints):
spheres = o3d.geometry.TriangleMesh()
for keypoint in keypoints.points:
sphere = o3d.geometry.TriangleMesh.create_sphere(radius=1)
sphere.translate(keypoint)
spheres += sphere
spheres.paint_uniform_color([1.0, 0.0, 0.0])
# sphere.translate((1,0,0))
return spheres