Open3D 点云的ISS关键点提取

news2024/11/9 0:06:06

目录

一、概述

1.1原理

1.2应用场景

1.3算法实现步骤

二、代码实现

2.1 完整代码

2.2关键函数

2.3关键点可视化

三、实现效果

3.1原始点云

3.2提取后点云


一、概述

1.1原理

        ISS(Intrinsic Shape Signatures)关键点提取是一种常用于三维点云的特征提取方法。其主要目的是在点云中找到具有显著几何特征的点,这些点在不同的点云扫描中具有鲁棒性和稳定性。

ISS关键点提取基于以下两个主要思想:

  1. 局部特征分析:在点云的局部区域内计算几何特征,选择在局部范围内具有显著几何变化的点。
  2. 尺度空间理论:通过分析不同尺度下的几何特征,选择具有稳定性的点。

具体来说,ISS关键点提取算法利用点云中每个点的局部邻域的协方差矩阵来分析局部几何结构。协方差矩阵的特征值可以揭示局部几何形状的显著性。通过筛选出特征值之间具有显著差异的点,ISS算法能够识别出关键点。

1.2应用场景

ISS关键点提取在许多三维点云处理应用中具有重要作用,主要应用场景包括:

  1. 三维物体识别与匹配:通过提取关键点并进行描述符匹配,可以实现三维物体的识别与匹配。
  2. SLAM(同步定位与地图构建):在SLAM系统中,关键点提取用于构建地图和进行定位,提供稳定的特征点以进行配准。
  3. 三维重建:在三维重建过程中,关键点提取用于对齐不同视角的点云数据,从而生成高质量的三维模型。
  4. 机器人导航:在机器人导航中,关键点提取用于环境感知和路径规划,帮助机器人理解和探索环境。
  5. 医学影像分析:在医学影像处理中,关键点提取用于分析和比较不同的三维扫描数据,如CT或MRI扫描结果。

1.3算法实现步骤

ISS关键点提取算法的主要步骤如下:

  1. 计算局部协方差矩阵:对于每个点,计算其局部邻域的协方差矩阵。
  2. 计算协方差矩阵的特征值:对协方差矩阵进行特征值分解,获得三个特征值(通常标记为 λ1, λ2, λ3)。
  3. 特征值筛选:根据特征值之间的关系,筛选出具有显著几何特征的点。一般通过设置阈值来筛选特征值之间差异显著的点。
  4. 尺度分析:在不同的尺度下重复上述过程,选择在多个尺度下具有稳定性的点。
  5. 去冗余:通过非最大抑制(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提取后点云

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1861545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

清九野小红盾舒敏牙刷,我的口腔护理新体验

我最近发现一款很舒服的牙刷,叫做清九野小红盾舒敏牙刷,很适合牙龈敏感的朋友,如果刷牙时常感到不适,不妨试试这款既能有效清洁牙齿,又不会刺激牙龈的牙刷。 ## 🌟 独特设计,双重植毛 首先&…

PR素材库,这里应有尽有!

Premiere简称PR,操作简单,容易上手,功能丰富,因此做为后期必备软件之一。如果进行视频剪辑,去哪里找合适的素材呢,其实国内外都有不少专业的渠道。 一、视频素材 01.摄图视频 传送门:https://…

面向遥感图像的小目标检测最新方法 FFCA-YOLO

论文简介 在遥感图像中,小目标检测面临着特征表示不足和背景混淆等挑战,特别是当算法需要在有限计算资源的约束下进行实时处理时,对准确性和速度的优化要求尤为严格。为解决这些问题,本文提出了一种高效的目标检测器——特征增强、…

用vite 打包之后项目不能在本地查看

安装插件 npm i vitejs/plugin-legacy 在vite.config.js 中配置 重新打包就可以正常访问了(注意vite 和 vitejs/plugin-legacy的版本要匹配,否则会打包失败)

什么是CDN?CDN的工作原理是怎样的?

1.什么是CDN? CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容&am…

React hydrateRoot如何实现

React 服务器渲染中,hydrateRoot 是核心,它将服务器段的渲染与客户端的交互绑定在一起,我们知道 React 中 Fiber Tree 是渲染的的核心,那么 React 是怎么实现 hydrateRoot 的呢?首先我们验证一下,hydrateRo…

2024广东省职业技能大赛云计算赛项实战——集群部署GitLab Runner

集群部署GitLab Runner 前言 题目如下: 部署GitLab Runner 将GitLab Runner部署到gitlab-ci命名空间下,Release名称为gitlab-runner,为GitLab Runner创建持久化构建缓存目录/home/gitlab-runner/ci-build-cache以加速构建速度,并将其注册到…

Spark SQL 血缘解析方案

背景 项目背景建设数据中台,往往数据开发人员首先需要能够通过有效的途径检索到所需要的数据,然后根据检索的数据模型进行业务加工然后得到一些中间模型,最后再通过数据抽取工具或者OLAP分析工具直接将数据仓库中加工好的公共模型输出到应用层。这里我不在去介绍数据仓库为…

在操作系统中,background通常指的是运行于后台的进程或任务

在计算机中,"background"一词具有多种含义,以下是一些主要的解释和相关信息: 计算机视觉中的背景(Background): 在计算机视觉中,background指的是图像或视频中的背景部分,…

【TOOL】ceres学习笔记(一) —— 教程练习

文章目录 一、Ceres Solver 介绍二、Ceres 使用基本步骤1. 构建最小二乘问题2. 求解最小二乘问题 三、使用案例1. Ceres Helloworld2. Powell’s Function3. Curve Fitting4. Robust Curve Fitting 一、Ceres Solver 介绍 Ceres-solver 是由Google开发的开源C库,用…

接口测试代码和工具

通过python的requests给接口发送请求进行测试 #coding:utf-8 import requests class TestApi(): url_login "https://legend-sit.omodaglobal.com/api/auth/oauth2/token" url_topic_b "https://legend-sit.omodaglobal.com/api/community/topic_b/page?…

12 学习总结:操作符

目录 一、操作符的分类 二、二进制和进制转换 (一)概念 (二)二进制 (三)进制转换 1、2进制与10进制的互换 (1)2进制转化10进制 (2)10进制转化2进制 2…

React useId Hook

React 中有一个 useId hook,可以生成一个唯一 ID,这个有什么用处呢,用个 UUID 是不是可以替代呢?如果我们只考虑客户端,那么生成唯一 Id 的方法比较简单,我们在 State 中保存一个计数器就好,但是…

第二天的课根本跟不上啊 难难难啊

编程实现三个数求最大 编程实现求解一元二次方程 传参问题 直接使用返回值 复制控制 复制控制是指在C中控制对象复制行为的机制, 包括拷贝构造函数(copy constructor)、 赋值操作符(copy assignment operator)、 …

Win10可用的VC6.0绿色版及辅助插件assist_X

VC6.0,作为微软的经典开发工具,承载着无数开发者的青春与回忆。它曾是Windows平台上软件开发的重要基石,为开发者们提供了稳定且强大的编程环境,尤其是其MFC(Microsoft Foundation Classes)库,为…

STM32HAL库--DMA实验(速记版)

本章利用 DMA 来实现串口数据传送,并在LCD 模块上显示当前的传送进度。 DMA 简介 DMA,全称为:Direct Memory Access,即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场…

微服务中不同服务使用openfeign 相互调用

首先 我们上文 已经知道了 nacos 的注册服务,现在 我们 在不同服务中相互调用就可以使用openfeign 直接调用,而不是 再写冗余的调用代码啦 首先 我们的微服务组件如下 因为我这个微服务是我在 员工登录demo 中 拆出来的,在userlogin模块中…

2024年不可错过的12个Web程序设计语言!

Web开发行业出现以来,通过各种形式和渠道不断发展壮大。随着5g时代的到来,Web开发在移动互联网领域不断出现新的开发场景,也是最受欢迎的技能之一。掌握Web程序设计语言是在Web开发领域大放异彩的必要条件之一。接下来,即时设计选…

[论文笔记]Mixture-of-Agents Enhances Large Language Model Capabilities

引言 今天带来一篇多智能体的论文笔记,Mixture-of-Agents Enhances Large Language Model Capabilities。 随着LLMs数量的增加,如何利用多个LLMs的集体专业知识是一个令人兴奋的开放方向。为了实现这个目标,作者提出了一种新的方法&#xf…