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提取后点云
热门推荐
消息队列中的消息延时如何测量
造成ping 值不稳定的可能因素及解决措施
历史上真正的陈友谅:一位性格鲜明的枭雄
世界十大最高山峰,巍峨壮观、秀丽多姿,成为无数登山爱好者向往的圣地
鹰嘴豆的功能和疗效
恢复建文帝名号有多难?靖难之后两百年,他才得到了个谥号
银行财务报表分析:方法与技巧详解
什么是空投?空投如何运作?如何安全参与加密货币空投?
货币基金是什么?一文看清收费、风险及跟定期存款的分别
《三角洲行动》全面战场模式A点进攻战术详解
如何高效利用Markdown有序多级标题提升文档结构与可读性?
中国空间站与国际空间站的差异为何如此巨大?
相机标定解析
如何向教育局反映校园欺凌事件
win10多版本应该如何选择?Windows 10各版本区别对比介绍
四季如何调养助力孩子鼻梁发育?
许姓起源与发展:历史名人、分布现状
连州地下河景区:喀斯特地貌与人文风情的完美融合
当他人对你过度关心时,该如何应对?
加压水泵安装指南:类型、使用年限与安装要点详解
超级食物「木瓜」功效与禁忌、超强吃法公开!丰富维生素A、钾帮助消水肿、提升免疫力
世界上最好的团队是《西游记》唐僧团队
有福之人必有天相,一个人有没有福气,看3个地方就知道了
高考数学辅导书推荐:精选教辅资料助你一臂之力
不给予立案的案件:法律规定与实务分析
乳齿象和猛犸象在冰河时代如何共存
租房成本高如何应对?这些应对策略如何帮助你节省开支?
蓝白色绣球花的花语,开花季节
如何判断宇宙不是一场模拟游戏?
从马斯克到雷军:科技大佬们的"人设营销"正在重塑行业认知