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

news2024/11/16 16:20:03

目录

一、概述

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粗配准后点云

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

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

相关文章

03 _ 类型基础(2):动态类型与静态类型

静态类型语言与动态类型语言 通俗定义 静态类型语言:在编译 阶段确定所有变量的类型 动态类型语言:在执行阶段确定所有变量的类型 Javascript 与 C 对比 静态类型与动态类型对比 其他定义 强类型语言:不允许程序在发生错误后继续执行 语…

【小贪】项目实战——Zero-shot根据文字提示分割出图片目标掩码

目标描述 给定RGB视频或图片,目标是分割出图像中的指定目标掩码。我们需要复现两个Zero-shot的开源项目,分别为IDEA研究院的GroundingDINO和Facebook的SAM。首先使用目标检测方法GroundingDINO,输入想检测目标的文字提示,可以获得…

primetime中cell和net的OCV

文章目录 前言一、Cell OCV1. POCV coefficient file2. POCV Slew-Load Table in Liberty Variation Format(LVF lib) 二、Net OCV三、如何check OCV是否已加上?总结 前言 在生产中,外界环境的各种变化,比如PVT&#…

grpc学习golang版( 六、服务器流式传输 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、拷贝任意文件进项目四、编写serve…

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…

为什么越来越多的人选择做债务重组?

说到债务重组,很多人可能一头雾水。但简单来说,就是帮你优化债务结构,减轻还款压力。 为什么现在这么多人会选择做债务重组? 保护工作和名声:有些在好单位上班的人,怕债务问题影响工作,不想让单…

解决Python用xpath爬取不到数据的一个思路

前言 最近在学习Python爬虫的知识,既然眼睛会了难免忍不住要实践一把。 不废话直接上主题 代码不复杂,简单的例子奉上: import requests from lxml import etreecookie 浏览器F12网络请求标头里有 user_agent 浏览器F12网络请求标头里有…

论文翻译 | (DSP)展示-搜索-预测:为知识密集型自然语言处理组合检索和语言模型

摘要 检索增强式上下文学习已经成为一种强大的方法,利用冻结语言模型 (LM) 和检索模型 (RM) 来解决知识密集型任务。现有工作将这些模型结合在简单的“检索-读取”流程中,其中 RM 检索到的段落被插入到 LM 提示中。 为了充分发挥冻结 LM 和 RM 的…

API-本地存储

学习目标: 掌握本地存储 学习内容: 本地存储介绍本地存储分类存储复杂数据类型 本地存储介绍: 以前我们页面写的数据一刷新页面就没有了,是不是? 随着互联网的快速发展,基于网页的应用越来越普遍,同时也…

反向沙箱技术:安全隔离上网

在信息化建设不断深化的今天,业务系统的安全性和稳定性成为各公司和相关部门关注的焦点。面对日益复杂的网络威胁,传统的安全防护手段已难以满足需求。深信达反向沙箱技术,以其独特的设计和强大的功能,成为保障政务系统信息安全的…

MSPG3507——蓝牙接收数据显示在OLED,滴答定时器延时500MS

#include "ti_msp_dl_config.h" #include "OLED.h" #include "stdio.h"volatile unsigned int delay_times 0;//搭配滴答定时器实现的精确ms延时 void delay_ms(unsigned int ms) {delay_times ms;while( delay_times ! 0 ); } int a0; …

MySQL-数据操作类型的角度理解 S锁 X锁

文章目录 1、S锁和S锁互相兼容2、S锁和X锁互斥3、X锁和X锁也互斥4、X锁和S锁也互斥5、select * from account for update;6、select * from account for update nowait;7、select * from account for update skip locked; 1、S锁和S锁互相兼容 2、S锁和X锁互斥 3、X锁和X锁也互…

换天空背景的软件有哪些?摄影师必备,让背景从灰暗到绚烂

在摄影的世界里,背景往往能够为照片增添一种难以言喻的情感色彩。 有时,一个简单的天空背景更换,就能让整张照片焕发出全新的生命力,表达出摄影师想要传达的情感和故事。 如今,随着科技的发展,一些换天空…

开源205W桌面充电器,140W+65W升降压PD3.1快充模块(2C+1A口),IP6557+IP6538

开源一个基于IP6557和IP6538芯片的205W升降压快充模块(140W65W),其中一路C口支持PD3.1协议,最高输出28V5A,另一路是A口C口,最高输出65W(20V3.25A),可搭配一个24V10A的开关…

LLM对程序员的冲击和影响

1LLM 在软件开发过程中的单点提效 我这里罗列一些更多的可能用途: 智能代码提示代码片段智能生成SQL 语句的智能生成与调优更高效更精准的静态代码检查与自动修复(非 rule-based)智能辅助的代码评审与代码重构单元测试和接口测试代码的自动…

ARM功耗管理软件之时钟电源树

安全之安全(security)博客目录导读 思考:功耗管理软件栈及示例?WFI&WFE?时钟&电源树?DVFS&AVS? 目录 一、时钟&电源树简介 二、时钟树示例 三、电源树示例 一、时钟&电源树简介 时钟门控与自…

炎黄数智人:国家体育总局冬运中心——AI裁判与教练“观君”赋能冰雪运动新篇章

在科技创新的浪潮下,国家体育总局冬季运动管理中心(以下简称“冬运中心”)揭开了人工智能在体育领域应用的新篇章。隆重宣布推出革命性的AI裁判与教练系统——“观君”,该系统将在冰雪运动项目中大放异彩,为运动员的训…

【Kaggle】Telco Customer Churn 电信用户流失预测案例

⭐️前言:案例学习说明与案例建模流程 我们将围绕Kaggle中的电信用户流失数据集(Telco Customer Churn)进行用户流失预测。在此过程中,将综合应用此前所介绍的各种方法与技巧,并在实践中提炼总结更多实用技巧。 ⭐️对…

prometheus 安装node_exporter, node_exporter 安装最新版 普罗米修思安装监控服务器client

1. 本文介绍两种安装方式,一种安装为service,使用systemctl start node_exporter管理,第二种为安装docker内 容器内使用。 1.1 安装到系统内: 1.1.1 github地址: Releases prometheus/node_exporter GitHub ​ 1.1.2 下载命…

基于移动端的助农电商系统的设计与实现08655

基于移动端的助农电商系统的设计与实现 XXX专业XX级XX班:XXX 指导教师:XXX 摘要 近年来,电子商务的快速发展引起了行业和学术界的高度关注。基于移动端的助农电商系统旨在为用户提供一个简单、高效、便捷的农产品购物体验,它不…