FPFH特征匹配以及ransac粗配准

一、代码

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="FPFH", 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()if __name__ == "__main__":# 读取点云scene = o3d.io.read_point_cloud("data/pig_view1.pcd")target = o3d.io.read_point_cloud("data/pig_view2.pcd")view_show(scene, target)# 法线scene.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.5, max_nn=100))target.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.5, max_nn=100))# 使用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)}")source_fpfh = o3d.pipelines.registration.compute_fpfh_feature(keypoints_scene,o3d.geometry.KDTreeSearchParamHybrid(radius=0.5, max_nn=100))target_fpfh = o3d.pipelines.registration.compute_fpfh_feature(keypoints_target,o3d.geometry.KDTreeSearchParamHybrid(radius=0.5, max_nn=100))reg_p = o3d.pipelines.registration.registration_ransac_based_on_feature_matching(source=keypoints_scene,target=keypoints_target,source_feature=source_fpfh,target_feature=target_fpfh,mutual_filter=False,  # 确保双向过滤以提高匹配质量max_correspondence_distance=40,  # 确保这个阈值是合理的,根据你的点云的尺度来调整estimation_method=o3d.pipelines.registration.TransformationEstimationPointToPoint(False),ransac_n=3,  # 使用默认值即可checkers=[  # 根据需要调整对应检查器# o3d.pipelines.registration.CorrespondenceCheckerBasedOnEdgeLength(0.8),o3d.pipelines.registration.CorrespondenceCheckerBasedOnDistance(90)],criteria=o3d.pipelines.registration.RANSACConvergenceCriteria(9000000, 0.999))print(reg_p.transformation)keypoints_scene.transform(reg_p.transformation)# 可视化配准结果view_show(keypoints_scene, keypoints_target)

关键代码解析:

    scene.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.5, max_nn=100))target.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.5, max_nn=100))
  1. radius(半径):定义在估算法向量时用于搜索邻近点的半径。对于每个点,算法将在以该点为中心、半径为radius的球体内搜索其他点。如果点云的密度较大,你可能需要选择较小的半径,以确保只考虑附近的点。如果点云的密度较小,你可能需要选择较大的半径,以确保找到足够的邻近点用于法向量估计。

  2. max_nn(最大邻近点数):定义在搜索中考虑的最大邻近点数量。对于每个点,算法将找到最多max_nn个邻近点,并使用它们来估计法向量。选择适当的邻近点数量取决于点云的性质和应用场景。如果点云比较密集,你可能需要较大的值,而在点云比较稀疏的情况下,可以选择较小的值。

    source_fpfh = o3d.pipelines.registration.compute_fpfh_feature(keypoints_scene,o3d.geometry.KDTreeSearchParamHybrid(radius=0.05, max_nn=100))target_fpfh = o3d.pipelines.registration.compute_fpfh_feature(keypoints_target,o3d.geometry.KDTreeSearchParamHybrid(radius=0.05, max_nn=100))
  1. keypoints_scenekeypoints_target:这是两个输入点云中提取的关键点的集合。通常,在计算点云特征时,为了降低计算复杂度,会选择提取一些具有代表性的点作为关键点。这些关键点通常是点云中的显著特征点。

  2. o3d.geometry.KDTreeSearchParamHybrid:这是用于构建KD树以进行最近邻搜索的参数对象。这里的radiusmax_nn参数影响了在计算FPFH特征时考虑的邻域范围和最大邻近点数。

    • radius(半径):定义了在计算FPFH特征时用于搜索邻域点的半径。只有距离小于半径的点才会被考虑在内。选择适当的半径与你的数据集和任务有关。较小的半径可以更细致地捕捉局部几何结构,但也可能更敏感于噪声;较大的半径可以平滑局部结构,但可能忽略小尺度的特征。

    • max_nn(最大邻近点数):定义在搜索中考虑的最大邻近点数量。选择适当的最大邻近点数取决于点云的密度和特征的复杂性。较大的值可以捕获更丰富的局部信息,但也增加了计算成本。

reg_p = o3d.pipelines.registration.registration_ransac_based_on_feature_matching(source=keypoints_scene,target=keypoints_target,source_feature=source_fpfh,target_feature=target_fpfh,mutual_filter=False,  # 确保双向过滤以提高匹配质量max_correspondence_distance=40,  # 确保这个阈值是合理的,根据你的点云的尺度来调整estimation_method=o3d.pipelines.registration.TransformationEstimationPointToPoint(False),ransac_n=3,  # 使用默认值即可checkers=[  # 根据需要调整对应检查器# o3d.pipelines.registration.CorrespondenceCheckerBasedOnEdgeLength(0.8),o3d.pipelines.registration.CorrespondenceCheckerBasedOnDistance(90)],criteria=o3d.pipelines.registration.RANSACConvergenceCriteria(9000000, 0.999))
  1. sourcetarget:分别是源点云和目标点云,用于进行配准的两个点云。

  2. source_featuretarget_feature:分别是源点云和目标点云的特征,通常是通过FPFH等方法计算得到的局部特征描述子。

  3. mutual_filter:一个布尔值,指定是否进行双向过滤以提高匹配质量。如果设置为True,将考虑源点云到目标点云和目标点云到源点云的匹配,以减少错误匹配。

  4. max_correspondence_distance:最大对应距离,用于过滤不合格的匹配对。只有距离小于该阈值的匹配才会被认为是有效的。该值的设置应根据点云的尺度来调整,确保它适当地覆盖了预期的点云之间的距离。

  5. estimation_method:指定了用于估计变换的方法。在这里,TransformationEstimationPointToPoint(False)表示使用点到点的变换估计方法。该参数影响了配准的精度和速度。

  6. ransac_n:RANSAC算法中随机抽样的次数。在大多数情况下,使用默认值即可。

  7. checkers:一个列表,包含用于过滤匹配对的检查器。在这里,CorrespondenceCheckerBasedOnDistance(90)指定了一个基于距离的检查器,它将过滤掉距离大于90的匹配对。你可以根据需要添加其他检查器或调整参数。

  8. criteria:RANSAC算法的收敛标准。RANSACConvergenceCriteria指定了RANSAC迭代的最大迭代次数和收敛阈值。在这里,它设置为最大迭代次数为9000000,收敛阈值为0.999。这些值可能需要根据你的数据集和配准的要求进行调整。

结果: 

配准前

配准后,改了很多次参数,感觉效果依然很差

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB源码-第151期】基于matlab的开普勒化算法(KOA)无人机三维路径规划,输出做短路径图和适应度曲线。

操作环境: MATLAB 2022a 1、算法描述 开普勒优化算法(Kepler Optimization Algorithm, KOA)是一个虚构的、灵感来自天文学的优化算法,它借鉴了开普勒行星运动定律的概念来设计。在这个构想中,算法模仿行星围绕太阳的…

Windows下查看端口占用以及关闭该端口程序

打开命令窗口 windowsR 输入 cmd 查看所有运行端口 netstat -ano 该命令列出所有端口的使用情况。 在列表中我们观察被占用的端口,比如是 80,首先找到它。 查看被占用端口对应的 PID netstat -aon|findstr "80" 回车执行该命令&#xff…

StarRocks——Stream Load 事务接口实现原理

目录 前言 一、StarRocks 数据导入 二、StarRocks 事务写入原理 三、InLong 实时写入StarRocks原理 3.1 InLong概述 3.2 基本原理 3.3 详细流程 3.3.1 任务写入数据 3.3.2 任务保存检查点 3.3.3 任务如何确认保存点成功 3.3.4 任务如何初始化 3.4 Exactly Once 保证…

windows安装部署node.js并搭建Vue项目

一、官网下载安装包 官网地址:https://nodejs.org/zh-cn/download/ 二、安装程序 1、安装过程 如果有C/C编程的需求,勾选一下下图所示的部分,没有的话除了选择一下node.js安装路径,直接一路next 2、测试安装是否成功 【winR】…

Python 实现Excel自动化办公(中)

在上一篇文章的基础上进行一些特殊的处理,这里的特殊处理主要是涉及到了日期格式数据的处理(上一篇文章大家估计也看到了日期数据的处理是不对的)以及常用的聚合数据统计处理,可以有效的实现你的常用统计要求。代码如下&#xff1…

kotlin与java的相互转换

Kotlin转java 将kotlin代码反编译成java Tools -> Kotlin -> Show Kotlin Bytecode 然后点击 【Decompile】 生成java代码 java转kotlin Code -> Convert Java File To Kotlin File

在Node.js中如何实现用户身份验证和授权

当涉及到构建安全的应用程序时,用户身份验证和授权是至关重要的一环。在Node.js中,我们可以利用一些流行的库和技术来实现这些功能,确保我们的应用程序具有所需的安全性。本篇博客将介绍如何在Node.js中实现用户身份验证和授权。 用户身份验…

[数据集][目标检测]狗狗表情识别VOC+YOLO格式3971张4类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3971 标注数量(xml文件个数):3971 标注数量(txt文件个数):3971 标注…

“智农”-农业一体化管控平台

大棚可视化|设施农业可视化|农业元宇宙|农业数字孪生|大棚物联网|大棚数字孪生|农业一体化管控平台|智慧农业可视化|智农|农业物联网可视化|农业物联网数字孪生|智慧农业|大棚三维可视化|智慧大棚可视化|智慧大棚|农业智慧园区|数字农业|数字大棚|农业大脑|智慧牧业数字孪生|智…

从零开始学习Netty - 学习笔记 -Netty入门-ChannelFuture

5.2.2.Channel Channel 的基本概念 在 Netty 中,Channel 是表示网络传输的开放连接的抽象。它提供了对不同种类网络传输的统一视图,比如 TCP 和 UDP。 Channel 的生命周期 Channel 的生命周期包括创建、激活、连接、读取、写入和关闭等阶段。Netty 中…

机器学习-02-机器学习算法分类以及在各行各业的应用

总结 本系列是机器学习课程的第02篇,主要介绍机器学习算法分类以及在各行各业的应用 本门课程的目标 完成一个特定行业的算法应用全过程: 定义问题(Problem Definition) -> 数据收集(Data Collection) -> 数据分割(Data…

harbor配置目录被误删后救援

我司微服务产品的业务镜像,在客户现场上云安全检测中发现需要打补丁;放在角落、时不常用一次的harbor镜像仓库需要用到了:将加固后的基础镜像上传以备份,方便其他同学拉取使用。 然鹅,启动后harbor-db频繁重启 harbo…