Open3D 点云的ISS关键点提取
创作时间:
作者:
@小白创作中心
Open3D 点云的ISS关键点提取
引用
1
来源
1.
http://www.mzph.cn/web/33961.shtml
目录
一、概述
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
三、实现效果
3.1原始点云
3.2提取后点云
热门推荐
冬日西湖:雪中的诗意天堂
西湖秋日徒步打卡指南:九溪十八涧到北山街,这些绝美路线不容错过
赏花必备,牡丹开花时间及观赏技巧(春风满园,牡丹艳丽绽放)
牡丹花开:西安探访牡丹最佳赏花地点有哪些?
初三期末考:如何破解数学题陷阱?
闪能公考:行测数学陷阱大揭秘!
杭州夜游攻略:西湖夜景+茶馆体验
杭州三大历史文化地标深度游:西湖、河坊街、大运河
铜陵犁桥水镇:夜游打卡必去的网红胜地!
铜陵犁桥水镇:最美夜色里的江南水乡
铜陵犁桥水镇:古韵江南的打卡胜地
冯巩:我不仅是师出名门的相声奇才,还是受人爱戴的“老戏骨”
瘦西湖:园林艺术的巅峰之作
温州夜游新选择:塘河夜画vs瓯江夜游,谁更值得打卡?
五马街和九山公园:温州必打卡网红地!
2024龙年新春祝福语大集合:传统、创意、科技、环保,总有一款适合你!
千图网新年祝福文案大放送!
让拜年更有新意更有温度:创意方式、礼物选择与祝福语全攻略
国庆打卡西湖,预约攻略全在这!
用AI制作拜年视频,给亲友送上创意祝福!
鼋头渚:无锡人的悠闲度假胜地
鼋头渚樱花节:徐霞客的春天之旅
鼋头渚摄影攻略:捕捉最美樱花瞬间
垫江:湿地公园美如画 文旅兴旺活力足
人民日报推荐:固表粥抗过敏,6种中医食疗方案助力缓解过敏症状
秋冬过敏季,中医有妙招!
白虎汤:中医经典方剂的临床应用与过敏治疗辨析
秋冬打卡西湖十景,摄影技巧大揭秘!
断桥残雪:西湖十景的文化瑰宝
赵本山回忆《一代宗师》拍摄趣事:从东北到香港的艺术碰撞