Open3D 点云快速全局配准FGR算法(粗配准)

目录

一、概述

1.1原理和步骤

1.2关键技术和优势

1.3应用场景

二、代码实现

2.1 关键代码

2.1.1.函数:execute_fast_global_registration

2.1.2调用registration_fgr_based_on_feature_matching函数

2.2完整代码

三、实现效果

3.1原始点云

3.2粗配准后点云


一、概述

        Open3D中的Fast Global Registration(快速全局配准)是一种基于特征匹配的快速点云配准算法,旨在有效地将两个点云快速对齐,以提供初步的配准结果。以下是Fast Global Registration的原理和关键步骤:

1.1原理和步骤

1.特征计算:

        对输入的源点云和目标点云计算全局特征描述符。通常使用的特征包括FPFH(Fast Point Feature Histograms)或SHOT(Signature of Histograms of Orientations)。
特征描述符捕捉了点云局部几何结构的信息,对点云的形状和曲率变化有很好的描述能力。
2.特征匹配:
        利用计算得到的全局特征描述符进行点云之间的特征匹配。这一步旨在找到源点云和目标点云中具有相似局部几何结构的点对。
3.快速全局配准:
        使用匹配到的特征点对进行快速全局配准。Open3D中的Fast Global Registration算法实现了一种高效的配准策略,可以在短时间内获得粗略但有效的全局配准结果。
4.优化:
        为了进一步提升配准精度,可以在快速全局配准的基础上进行后续的优化步骤,如ICP(Iterative Closest Point)算法或更精确的局部优化。

1.2关键技术和优势

  • 高效性:Fast Global Registration算法在保证一定配准质量的前提下,尽可能地减少计算时间,适合于处理大规模点云数据。
  • 特征描述符:利用全局特征描述符可以有效地捕捉点云的局部特征信息,避免了传统方法中对全局搜索的依赖,加快了配准过程。
  • RANSAC:算法内部可能会使用RANSAC(随机采样一致性)算法来估计初始的变换参数,以应对部分匹配或噪声的影响。

1.3应用场景

        Fast Global Registration适用于需要快速处理大规模点云数据并获得初步对齐结果的场景,例如机器人感知、三维重建、虚拟现实和增强现实等领域。它为后续更精细的点云配准和分析提供了良好的初始对齐结果,有助于提升整体系统的效率和准确性。

二、代码实现

2.1 关键代码

这段代码实现了基于特征匹配的快速全局配准(Fast Global Registration,FGR)过程:

# --------------------------------------------FastGlobalRegistration配准----------------------------------------------
def execute_fast_global_registration(source, target, source_fpfh, target_fpfh):  # 传入两个点云和点云的特征
    distance_threshold = 0.5  # 设定距离阈值
    print(":: Apply fast global registration with distance threshold %.3f" \
          % distance_threshold)
    result = o3d.pipelines.registration.registration_fgr_based_on_feature_matching(
        source, target, source_fpfh, target_fpfh,
        o3d.pipelines.registration.FastGlobalRegistrationOption(
            maximum_correspondence_distance=distance_threshold))
    return result

2.1.1.函数:execute_fast_global_registration

def execute_fast_global_registration(source, target, source_fpfh, target_fpfh):
    distance_threshold = 0.5  # 设定距离阈值
    print(":: Apply fast global registration with distance threshold %.3f" % distance_threshold)

参数:

  • source:源点云对象。
  • target:目标点云对象。
  • source_fpfh:源点云的FPFH特征。
  • target_fpfh:目标点云的FPFH特征。

2.1.2调用registration_fgr_based_on_feature_matching函数

result = o3d.pipelines.registration.registration_fgr_based_on_feature_matching(
    source, target, source_fpfh, target_fpfh,
    o3d.pipelines.registration.FastGlobalRegistrationOption(
        maximum_correspondence_distance=distance_threshold))

参数解释:

  • source 和 target:需要配准的源点云和目标点云。
  • source_fpfh 和 target_fpfh:源点云和目标点云的FPFH特征。
  • FastGlobalRegistrationOption:指定了快速全局配准的参数选项。
  • maximum_correspondence_distance:最大对应点距离阈值。该阈值用于筛选特征匹配点对,超过该距离的点对将被忽略。

2.2完整代码

import open3d as o3d
import time
import copy


# ----------------------------------------------传入点云数据,计算FPFH-------------------------------------------------
def fpfh_compute(pcd):
    radius_normal = 0.01  # kdtree参数,用于估计法线的半径,
    print(":: Estimate normal with search radius %.3f." % radius_normal)
    pcd.estimate_normals(
        o3d.geometry.KDTreeSearchParamHybrid(radius=radius_normal, max_nn=30))
    # 估计法线的1个参数,使用混合型的kdtree,半径内取最多30个邻居
    radius_feature = 0.025  # kdtree参数,用于估计FPFH特征的半径
    print(":: Compute FPFH feature with search radius %.3f." % radius_feature)
    # 计算FPFH特征,搜索方法kdtree
    pcd_fpfh = o3d.pipelines.registration.compute_fpfh_feature(pcd,
                                                               o3d.geometry.KDTreeSearchParamHybrid
                                                               (radius=radius_feature, max_nn=50))
    return pcd_fpfh  # 返回FPFH特征


# --------------------------------------------FastGlobalRegistration配准----------------------------------------------
def execute_fast_global_registration(source, target, source_fpfh, target_fpfh):  # 传入两个点云和点云的特征
    distance_threshold = 0.5  # 设定距离阈值
    print(":: Apply fast global registration with distance threshold %.3f" \
          % distance_threshold)
    result = o3d.pipelines.registration.registration_fgr_based_on_feature_matching(
        source, target, source_fpfh, target_fpfh,
        o3d.pipelines.registration.FastGlobalRegistrationOption(
            maximum_correspondence_distance=distance_threshold))
    return result


# ---------------------------------------------------可视化配准结果----------------------------------------------------
def draw_registration_result(source, target, transformation):
    source_temp = copy.deepcopy(source)  # 由于函数transformand paint_uniform_color会更改点云,
    target_temp = copy.deepcopy(target)  # 因此调用copy.deepcoy进行复制并保护原始点云。
    source_temp.paint_uniform_color([1, 0, 0])  # 点云着色
    target_temp.paint_uniform_color([0, 1, 0])
    source_temp.transform(transformation)
    # o3d.io.write_point_cloud("trans_of_source.pcd", source_temp)  # 保存配准后的点云
    o3d.visualization.draw_geometries([source_temp, target_temp], width=600, height=600, mesh_show_back_face=False)


if __name__ == "__main__":
    #  --------------------读取点云数据------------------
    source = o3d.io.read_point_cloud("..//..//standford_cloud_data//hand_trans.pcd")
    target = o3d.io.read_point_cloud("..//..//standford_cloud_data//hand.pcd")
    source = source.uniform_down_sample(every_k_points=10)
    target = target.uniform_down_sample(every_k_points=10)
    start = time.time()
    #  -----------计算源点云和目标点云的FPFH-------------
    source_fpfh = fpfh_compute(source)
    target_fpfh = fpfh_compute(target)
    # ------------------调用FGR执行粗配准----------------
    result_fast = execute_fast_global_registration(source, target,
                                                   source_fpfh, target_fpfh)
    print("Fast global registration took %.3f sec.\n" % (time.time() - start))
    print(result_fast)
    draw_registration_result(source, target, result_fast.transformation)  # 源点云旋转平移到目标点云

三、实现效果

3.1原始点云

3.2粗配准后点云

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

写代码,为什么还需要作图?

引言 古人云 :一图胜千言,闲人说:无图无真相。 在日常的聊天工具当中,无论是使用微信,还是钉钉。使用图片或表情包的频次越来越高,那是为什么呢?其实在互联网没有那么发达的时候,我…

算法题笔记

主要记录python的力扣题解 参考的优质网站: 算法通关手册(LeetCode) | 算法通关手册(LeetCode) (itcharge.cn) 代码随想录 (programmercarl.com) 2024.6.28 题目:轮转数组 官网连接:189. …

Linux环境安装配置nginx服务流程

Linux环境的Centos、麒麟、统信操作系统安装配置nginx服务流程操作: 1、官网下载 下载地址 或者通过命令下载 wget http://nginx.org/download/nginx-1.20.2.tar.gz 2、上传到指定的服务器并解压 tar -zxvf nginx-1.20.1.tar.gzcd nginx-1.20.1 3、编译并安装到…

武汉星起航:跨境电商流量红利爆发,2023年出海企业迎突破增长

在数字时代的浪潮中,中国跨境电商以惊人的爆发力崭露头角,成为全球贸易的璀璨新星。2023年数据显示,跨境电商出口额高达1.83万亿元,同比增长19.6%,这一显著增速不仅刷新纪录,更为众多出海企业带来了前所未有…

vscode搭建suricata调试环境

一、环境 windows10 wsl2 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.2 LTS Release: 20.04 Codename: focal二、编译 2.1 下载源码 wget https://www.openinfosecfoundation.org/download/suri…

配电智能网关赋能电力系统智能化运行维护

随着智能电网和物联网技术的不断发展,两者之间的融合应用成为电力行业的重要趋势。配电智能网关作为连接两者的关键设备,在智能电网的物联网应用中发挥着重要作用。 配电智能网关能够实现对电力系统的实时监控、数据采集、远程控制等功能,为…

【Vue】微信禁止打开,可弹出提示:请用360、搜狗浏览器的极速模式打开。

需求 某网站链接,使用微信端打开,某些材料自动下载会造成泄密。所以添加限制:微信禁止打开,可弹出提示:请用360、搜狗浏览器的极速模式打开。 处理前 微信访问该链接,点击【继续访问】可直接跳转到该网站 处…

苍穹外卖项目 常用注解 + 动态sql

常用注解 常见的注解解析方法有两种: 编译期直接扫描:编译器在编译 Java 代码的时候扫描对应的注解并处理,比如某个方法使用Override 注解,编译器在编译的时候就会检测当前的方法是否重写了父类对应的方法。运行期通过反射处理&…

ROS2使用C++开发动作通信

1.开发接口节点 cd chapt4_ws/ ros2 pkg create robot_control_interfaces --build-type ament_cmake --destination-directory src --maintainer-name "joe" --maintainer-email "1027038527qq.com" mkdir -p src/robot_control_interfaces/action touch…

C#中的时间数据格式化详解与应用示例

文章目录 1、基本概念基本格式化方法 2、实用的时间格式化方法格式化日期格式化时间格式化时间戳解析日期时间字符串 3、实际应用4、应用示例结论 在软件开发中,时间数据是无处不在的。无论是用户登录时间、数据备份时间,还是日志记录,都需要…

NSE and KGE

NSE(Nash-Sutcliffe Efficiency): 解释:NSE 是衡量水文模型模拟结果与观测值之间拟合程度的指标。它计算模拟值与观测值之间的均方误差,并将其与观测值的方差进行比较。NSE 的取值范围为-∞至 1,值越接近 1…

natvicat为什么连不上linux上的mysql?

老规矩,废话不多说,直接上教程。 号外,数据库管理工具领域的知名品牌Navicat,推出其免费版本——Navicat Premium Lite,用户可从Navicat官网下载体验这款软件。 https://www.navicat.com.cn/download/navicat-premium-…

vue3 动态配置element 的table

需求 合并行、合并标题、列宽可调整、列顺序可调整、可以控制列是否显示、列布局可保存、导出excel… 参考效果 代码 引入 npm i xlsx npm install element-plus --savetable组件 <template><div><div class"table-btn"><el-tooltip conte…

开发一套java语言的智能导诊需要什么技术?java+ springboot+ mysql+ IDEA互联网智能3D导诊系统源码

开发一套java语言的智能导诊需要什么技术&#xff1f;java springboot mysql IDEA互联网智能3D导诊系统源码 医院导诊系统是一种基于互联网和3D人体的智能化服务系统&#xff0c;旨在为患者提供精准、便捷的医院就诊咨询服务。该系统整合了医院的各种医疗服务资&#xff1b;智慧…

selenium 简介以及 selenium 环境配置

文章目录 一、初识 selenium1.selenium 简介2.selenium 三大组件3.selenium工作过程和原理4.selenium自动化测试流程5.selenium优点 二、自动化测试1.UI自动化本质2.UI自动化的前提3.适用场景4.UI自动化的原则5.UI自动化的覆盖率 三、selenium 环境配置 一、初识 selenium 1.s…

Win11找不到组策略编辑器(gpedit.msc)解决

由于需要同时连接有线网络和无线网络&#xff0c;且重启后双网络都自动连接&#xff0c;因此需要配置组策略。 但是win11找不到组策略编辑器。 灵感来源&#xff1a;Win11找不到组策略编辑器&#xff08;gpedit.msc&#xff09;解决教程 - 知乎 (zhihu.com) 在Win11中&#…

安装KB5039212更新卡在25% 或者 96% 进度

系统之家7月1日消息&#xff0c;微软在6月11日的补丁星期二活动中&#xff0c;为Windows 11系统推出了KB5039212更新。然而&#xff0c;部分用户在Windows社区中反映&#xff0c;安装过程中出现失败&#xff0c;进度条在25%或96%时卡住。对于遇到此类问题的Windows 11用户&…

创意无界:探索国产创成式填充的无限潜力

在数字艺术与设计的世界中&#xff0c;创新技术不断涌现&#xff0c;而"创成式填充"无疑是其中的一颗璀璨新星。今天米兔要安利的这款国产ps插件-StartaAI拥有强大的AI功能&#xff0c;其AI扩图和局部重绘更是成为PS创成式填充的国产平替。 什么是创成式填充&#x…

Linux运维:mysql高级查询语句(2)

目 录 一、创建数据库&#xff1a; 二、创建表结构&#xff1a;DDL 2.1 学生表s&#xff1a; 2.2 成绩表sc&#xff1a; 2.3 课程表c&#xff1a; 三、录入数据&#xff1a;DML 3.1 对学生表s的数据录入&#xff1a; 3.2 对成绩表sc的数据录入&#xff1a; 3.3 对课…

Linux内核——Linux内核体系模式(二)

1 Linux系统的中断机制 Linux内核将中断分为两类&#xff1a;硬件中断和软件中断&#xff08;异常&#xff09;。每个中断是由0-255之间的一个数字进行标识。 中断int0-int31&#xff08;0x00-0x1f&#xff09;作为异常int32-int255由用户自己设定 int32-int47对应与8259A中断…