iss关键点检测以及ICP粗配准

2024-02-28 05:28
文章标签 检测 配准 icp 关键点 iss

本文主要是介绍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
  1. point_cloud:输入的点云数据,即待提取关键点的点云。

  2. salient_radius:ISS 关键点提取中用于确定关键点区域大小的参数。它定义了在计算局部表面特征时所考虑的邻域半径大小。增加此值将导致更大的关键点区域,可能会检测到更多的关键点,但也可能导致关键点之间的冗余。

  3. non_max_radius:ISS 关键点提取中的非极大值抑制半径。在关键点检测后,该参数用于消除局部极大值,以便保留局部最显著的关键点。增加此值可能会导致更多的关键点被保留,但也可能导致关键点密度较低的区域保留过多的关键点。

  4. gamma_21:它用于确定 ISS 曲率比率特征中的曲率阈值。曲率比率是通过对局部特征的 Hessian 矩阵进行特征值分解来计算的,而gamma_21是曲率比率的最小允许值。增加此值将导致更多的点被认为是关键点,但也可能会引入更多的噪声或冗余关键点。

  5. gamma_32:它用于确定 ISS 曲率比率特征中的曲率阈值。与gamma_21类似,gamma_32​​ 是曲率比率的最大允许值。增加此值将导致更多的点被认为是关键点,但也可能会引入更多的噪声或冗余关键点。

  6. 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()

 

  1. def keypoints_show(point)::这是一个函数定义,它接受一个参数 point,表示待可视化的点云数据。

  2. point.paint_uniform_color([0, 1, 0]):将点云中的所有点都涂成绿色。这是为了使关键点在可视化中以绿色显示。

  3. vis = o3d.visualization.Visualizer():创建一个 Open3D 的可视化对象。

  4. vis.create_window(window_name="ISS", width=1200, height=1200):创建一个窗口用于显示可视化结果,并设置窗口的名称和大小。

  5. vis.get_render_option().background_color = [0, 0, 0]:设置可视化背景颜色为黑色。这影响了可视化结果的外观。

  6. vis.add_geometry(point):将点云数据添加到可视化对象中,以便显示。

  7. vis.run():运行可视化循环,显示点云和关键点。

  8. 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)

 

  1. keypoints_scene:待配准的源点云的关键点。

  2. keypoints_target:目标点云的关键点,即需要将源点云配准到的点云。

  3. 60:ICP算法的最大配准距离,即允许的最大匹配距离。超过这个距离的点将被忽略。这个值的设置会影响配准的结果,过大可能导致匹配不准确,过小可能导致匹配失败。

  4. trans_init:初始的变换矩阵,用于初始化配准过程。通常是根据某些先验信息估计出来的初始变换矩阵。

  5. o3d.pipelines.registration.TransformationEstimationPointToPoint():指定了配准时所采用的变换估计方法。在这里使用的是点对点的变换估计方法。

  6. o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration=5000):设置了ICP算法的收敛准则,即迭代的最大次数。在这里设置为5000次迭代。这个值的设置会影响算法的运行时间和最终的配准结果。

  7. reg_p:返回的配准结果对象,包括了最终的变换矩阵等信息。

  8. print(reg_p.transformation):打印出配准后得到的最优变换矩阵,即将源点云配准到目标点云时所需的变换。

  9. keypoints_scene.transform(reg_p.transformation):将源点云按照得到的最优变换矩阵进行变换,以实现将其配准到目标点云的效果。

这段代码的作用是将源点云(keypoints_scene)配准到目标点云(keypoints_target),并输出最终的配准结果。配准的过程会根据设定的参数进行迭代,直到满足收敛准则为止。

结果:

输入点云的关键点

目标点云的关键点 

 输入点云的关键点和输入点云

  目标点云的关键点和目标点云

 

配准结果 

这篇关于iss关键点检测以及ICP粗配准的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/754490

相关文章

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

Temu官方宣导务必将所有的点位材料进行检测-RSL资质检测

关于饰品类产品合规问题宣导: 产品法规RSL要求 RSL测试是根据REACH法规及附录17的要求进行测试。REACH法规是欧洲一项重要的法规,其中包含许多对化学物质进行限制的规定和高度关注物质。 为了确保珠宝首饰的安全性,欧盟REACH法规规定,珠宝首饰上架各大电商平台前必须进行RSLReport(欧盟禁限用化学物质检测报告)资质认证,以确保产品不含对人体有害的化学物质。 RSL-铅,

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机