Open3D Ransac点云配准算法(粗配准)

目录

一、概述

1.1简介

1.2RANSAC在点云粗配准中的应用步骤

二、代码实现

2.1关键函数

2.2完整代码

2.3代码解析

2.3.1计算FPFH

1. 法线估计

2. 计算FPFH特征

2.3.2 全局配准

1.函数:execute_global_registration

2.距离阈值

3.registration_ransac_based_on_feature_matching函数

三、实现效果

3.1原始点云

3.2配准后点云


一、概述

1.1简介

        RANSAC(Random Sample Consensus)是一种迭代方法,用于从一组包含离群点的数据中估计模型参数。它特别适合处理包含大量噪声或离群点的数据。RANSAC在点云配准、图像拼接、3D重建等领域中广泛应用。

        RANSAC(Random Sample Consensus)在点云粗配准中的应用主要包括以下步骤:特征提取、特征匹配、模型拟合、内点验证和迭代优化。

1.2RANSAC在点云粗配准中的应用步骤

  1. 特征提取:从点云中提取特征点及其特征描述符。常用的特征描述符有FPFH(Fast Point Feature Histograms)等。
  2. 特征匹配:将源点云和目标点云的特征描述符进行匹配,得到初始对应关系。这些匹配关系可能包含很多误匹配。
  3. 随机采样:从匹配的特征对中随机选择一定数量的样本,用于模型拟合。样本的数量应足以确定一个唯一的变换模型。
  4. 模型拟合:使用选定的样本对估计一个变换模型(通常是一个刚体变换,包括旋转和平移)。
  5. 内点验证:使用拟合的模型对所有匹配对进行验证,计算匹配点对之间的距离,判断是否符合模型。符合模型的点对被称为内点。
  6. 评估模型:计算当前模型的内点数量,并与之前的最佳模型进行比较。如果当前模型的内点数量更多,则更新最佳模型。
  7. 迭代优化:重复上述步骤一定次数(迭代次数根据数据中的离群点比例和期望成功概率来确定),最终选择内点数量最多的模型作为最佳模型。

二、代码实现

2.1关键函数

def registration_ransac_based_on_feature_matching(source, target, 
          source_feature, target_feature, 
          max_correspondence_distance,
          estimation_method=None, *args, **kwargs):
  • source:源点云
  • target:目标点云
  • source_feature:源点云的特征描述,目前版本的open3d主要是FPFH特征描述
  • target_feature:目标点云的特征描述,目前版本的open3d主要是FPFH特征描述
  • max_correspondence_distance:对应点之间的最大距离
  • estimation_method:默认采用的是点到点的方法。有如下三种方式:(TransformationEstimationPointToPoint, TransformationEstimationPointToPlane, TransformationEstimationForColoredICP)
  • ransac_n:随机选取匹配点对的个数,也即RANSAC算法随机选取点的个数。默认值是4。
  • checkers:使用快速修剪算法来提早拒绝错误匹配。,有如下3种修剪算法:(CorrespondenceCheckerBasedOnEdgeLength, CorrespondenceCheckerBasedOnDistance, CorrespondenceCheckerBasedOnNormal)
  • criteria:定义RANSAC迭代的最大次数和验证的最大次数。这两个值越大,结果越准确,但要花费更多的时间。默认值是:max_iteration=100000, and max_validation=100。

2.2完整代码

import time
import open3d as o3d
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.02  # kdtree参数,用于估计FPFH特征的半径
    print(":: Compute FPFH feature with search radius %.3f." % radius_feature)
    pcd_fpfh = o3d.pipelines.registration.compute_fpfh_feature(pcd,
    o3d.geometry.KDTreeSearchParamHybrid(radius=radius_feature, max_nn=100))  # 计算FPFH特征,搜索方法kdtree
    return pcd_fpfh  # 返回FPFH特征


# ----------------RANSAC配准--------------------
def execute_global_registration(source, target, source_fpfh,
                                target_fpfh):  # 传入两个点云和点云的特征
    distance_threshold = 10  # 设定距离阈值
    print("we use a liberal distance threshold %.3f." % distance_threshold)
# 2个点云,两个点云的特征,距离阈值,一个函数,4,
# 一个list[0.9的两个对应点的线段长度阈值,两个点的距离阈值],
# 一个函数设定最大迭代次数和最大验证次数
    result = o3d.pipelines.registration.registration_ransac_based_on_feature_matching(
        source, target, source_fpfh, target_fpfh, True, distance_threshold,
        o3d.pipelines.registration.TransformationEstimationPointToPoint(False),
        4, [
            o3d.pipelines.registration.CorrespondenceCheckerBasedOnEdgeLength(
                0.9),
            o3d.pipelines.registration.CorrespondenceCheckerBasedOnDistance(
                distance_threshold)
        ], o3d.pipelines.registration.RANSACConvergenceCriteria(4000000, 500))
    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=1200, height=900)


# ----------------读取点云数据--------------
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)
# -----------------计算的FPFH---------------
source_fpfh=FPFH_Compute(source)
target_fpfh=FPFH_Compute(target)
# ---------------调用RANSAC执行配准------------
start = time.time()
result_ransac = execute_global_registration(source, target,
                                            source_fpfh, target_fpfh)
print("Global registration took %.3f sec.\n" % (time.time() - start))
print(result_ransac)  # 输出RANSAC配准信息
Tr = result_ransac.transformation
draw_registration_result(source, target, Tr) 

2.3代码解析

2.3.1计算FPFH

        这段代码的主要作用是为输入的点云(pcd对象)进行法线估计和FPFH特征计算。法线估计通过指定半径和最大最近邻点数来计算每个点的法向量,而FPFH特征计算则基于这些法向量和局部邻域信息,生成描述点云局部几何特征的特征向量。这些特征在点云处理中常用于配准、识别和分割等任务,有助于捕捉点云的几何结构和局部特征信息

# -------------传入点云数据,计算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.02  # kdtree参数,用于估计FPFH特征的半径
    print(":: Compute FPFH feature with search radius %.3f." % radius_feature)
    pcd_fpfh = o3d.pipelines.registration.compute_fpfh_feature(pcd,
    o3d.geometry.KDTreeSearchParamHybrid(radius=radius_feature, max_nn=100))  # 计算FPFH特征,搜索方法kdtree
    return pcd_fpfh  # 返回FPFH特征
1. 法线估计
radius_normal = 0.01
pcd.estimate_normals(
    o3d.geometry.KDTreeSearchParamHybrid(radius=radius_normal, max_nn=30))

作用:

  • 法线估计是指在点云中为每个点计算法向量,法向量在计算机视觉和几何处理中很重要,用于描述点云表面的方向和曲率。
  • KD树是一种数据结构,用于快速查询最近邻的点。KDTreeSearchParamHybrid参数指定了法线估计算法中的搜索半径和最大最近邻点数。
2. 计算FPFH特征
radius_feature = 0.02
pcd_fpfh = o3d.pipelines.registration.compute_fpfh_feature(
    pcd, o3d.geometry.KDTreeSearchParamHybrid(radius=radius_feature, max_nn=100))

作用:

  • FPFH特征(Fast Point Feature Histograms)是一种用于描述点云局部几何结构的特征描述符。它对点云中每个点的邻域进行建模,捕捉了点云的表面形状和曲率信息。
  • compute_fpfh_feature函数计算点云的FPFH特征,需要指定点云对象和用于搜索的KD树参数(搜索半径和最大最近邻点数)。

2.3.2 全局配准

        这段代码实现了全局点云配准的过程,使用了RANSAC(Random Sample Consensus)算法基于特征匹配来寻找最优的刚体变换(旋转和平移),使得源点云与目标点云尽可能对齐。

# ----------------RANSAC配准--------------------
def execute_global_registration(source, target, source_fpfh,
                                target_fpfh):  # 传入两个点云和点云的特征
    distance_threshold = 10  # 设定距离阈值
    print("we use a liberal distance threshold %.3f." % distance_threshold)
# 2个点云,两个点云的特征,距离阈值,一个函数,4,
# 一个list[0.9的两个对应点的线段长度阈值,两个点的距离阈值],
# 一个函数设定最大迭代次数和最大验证次数
    result = o3d.pipelines.registration.registration_ransac_based_on_feature_matching(
        source, target, source_fpfh, target_fpfh, True, distance_threshold,
        o3d.pipelines.registration.TransformationEstimationPointToPoint(False),
        4, [
            o3d.pipelines.registration.CorrespondenceCheckerBasedOnEdgeLength(
                0.9),
            o3d.pipelines.registration.CorrespondenceCheckerBasedOnDistance(
                distance_threshold)
        ], o3d.pipelines.registration.RANSACConvergenceCriteria(4000000, 500))
    return result
1.函数:execute_global_registration
def execute_global_registration(source, target, source_fpfh, target_fpfh):

参数:

  • source:源点云对象。
  • target:目标点云对象。
  • source_fpfh:源点云的FPFH特征。
  • target_fpfh:目标点云的FPFH特征。
2.距离阈值
distance_threshold = 10
print("we use a liberal distance threshold %.3f." % distance_threshold)

距离阈值:

  • distance_threshold:设定的距离阈值,用于判断匹配点对的有效性。
3.registration_ransac_based_on_feature_matching函数
result = o3d.pipelines.registration.registration_ransac_based_on_feature_matching(
    source, target, source_fpfh, target_fpfh, True, distance_threshold,
    o3d.pipelines.registration.TransformationEstimationPointToPoint(False),
    4, [
        o3d.pipelines.registration.CorrespondenceCheckerBasedOnEdgeLength(0.9),
        o3d.pipelines.registration.CorrespondenceCheckerBasedOnDistance(
            distance_threshold)
    ], o3d.pipelines.registration.RANSACConvergenceCriteria(4000000, 500))

参数解释:

  • source 和 target:待配准的源点云和目标点云。
  • source_fpfh 和 target_fpfh:源点云和目标点云的FPFH特征。
  • True:表示进行全局配准。
  • distance_threshold:距离阈值,用于判断匹配点对的有效性。
  • TransformationEstimationPointToPoint(False):使用点到点的变换估计方法。
  • 4:RANSAC算法的迭代次数。
  • [...]:用于检查对应关系的有效性的列表,包括基于边长和距离的检查器。
  • RANSACConvergenceCriteria(4000000, 500):设定RANSAC的最大迭代次数和最大验证次数。

三、实现效果

3.1原始点云

3.2配准后点云

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

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

相关文章

二维码中的文件如何列表排列?轻松在线做文件活码的简单技巧

现在二维码是常用来展示文件的手段之一,将文件生成二维码之后扫码就能够快速在手机上查看文件内容,减少了下载内存占用及传输的时间,通过这种方式可以更加方便快捷的获取文件内容。怎么把多个文件用列表的方式来扫码展示呢? 多个…

汽车电子行业知识:什么是电子后视镜

文章目录 1.什么是电子后视镜2.有哪些汽车用到了电子后视镜3.电子后视镜的原理及算法4.电子后视镜的优点5.电子后视镜的未来市场将继续增长 1.什么是电子后视镜 电子后视镜是一种集成了电子元件和显示屏的汽车后视镜,用于替代传统的机械后视镜。它通过内置的摄像头捕…

[吃瓜教程]南瓜书第4章决策树

1.决策树的算法原理 从逻辑角度,条件判断语句的组合;从几何角度,根据某种准则划分特征空间; 是一种分治的思想,其最终目的是将样本约分约纯,而划分的核心是在条件的选择或者说是**特征空间的划分标准 ** …

编写一个程序,实现字符串大小写的转换并倒序输出。

编写一个程序,实现字符串大小写的转换并倒序输出。要求如下: (1)使用for循环将字符串“ITcastHeiMa”从最后一个字符开始遍历。 (2)遍历的当前字符如果是大写字符,就使用toLowerCase()方法将其转换为小写字符&#xff…

2024-07-01_外语学习

文章目录 前言1、Los Angeles至于单个los 是什么意思?我们可以逐词翻译这个西班牙语句子 2. Extraneous non-props attributes (style) were passed to component but could not be automatically inherited because component renders fragment or text root nodes…

鸿蒙3.0WebView网络错误问题

背景,荣耀9x,混淆才会出这个问题。 [ERROR:ssl_client_socket_impl.cc(981)] handshake failed; returned -1, SSL error code 1, net_error -2 NetError.java int SSLClientSocketImpl::DoHandshake() {crypto::OpenSSLErrStackTracer err_tracer(FRO…

【深入浅出 】——【Python 字典】——【详解】

目录 1. 什么是 Python 字典? 1.1 字典的基本概念 1.2 字典的用途 1.3 字典的优势 2. 字典的基本特点 2.1 键的唯一性 2.2 可变性 2.3 无序性 3. 如何创建字典? 3.1 使用 {} 符号 3.2 使用 dict() 工厂方法 3.3 使用 fromkeys() 方法 4. 字…

优盘有盘符显示0字节:故障解析与数据恢复策略

一、优盘有盘符显示0字节现象描述 在使用优盘的过程中,我们有时会遇到一种令人困惑的情况:插入优盘后,电脑能正常识别到优盘的盘符,但当我们尝试访问其中的数据时,却发现优盘的容量显示为0字节,无法读取或…

武汉星起航:自运营团队精准把握亚马逊红利,引领跨境电商新潮流

在全球化的浪潮下,跨境电商行业蓬勃发展,为众多企业带来了前所未有的机遇。武汉星起航电子商务有限公司便是其中的佼佼者,其自运营团队凭借对亚马逊平台的深入了解和丰富的运营经验,成功抓住了亚马逊的流量红利,为公司…

[leetcode]squares-of-a-sorted-array. 有序数组的平方

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> sortedSquares(vector<int>& nums) {int n nums.size();vector<int> ans(n);for (int i 0, j n - 1, pos n - 1; i < j;) {if (nums[i] * nums[i] > nums[j] *…

asp.net的承载环境的配置与应用

[S1513]基于环境变量的配置初始化 应用启动的时候会将当前的环境变量作为配置源来创建承载最初配置数据的IConfiguration对象&#xff0c;但它只会选择名称以“ASPNETCORE_”为前缀的环境变量&#xff08;通过静态类型Host的CreateDefaultBuilder方法创建的HostBuilder默认选择…

Es结合springboot(笔记回忆)

导包 <!--导入es--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency><groupId>org.springframework.boot<…

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

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

操作系统真象还原:进一步完善内核

第12章-进一步完善内核 12.1 Linux系统调用浅析 系统调用就是让用户进程申请操作系统的帮助&#xff0c;让操作系统帮其完成某项工作&#xff0c;也就是相当于用户进程调用了操作系统的功能&#xff0c;因此“系统调用”准确地来说应该被称为“操作系统功能调用”。 Linux 系…

【必看】卖惨营销

经常卖惨的人到底是什么心理&#xff1f; Berry Ni同学说&#xff1a; 吸引别人的注意力。想要得到关注。 让你降低对他的期待。 让你能够在他做好一件小事的情况下就表扬他。 控制你对他的想法认知。 ​ 浪矢心理同学说&#xff1a; 1&#xff0c;求关注。他觉得买惨有好处&…

64.WEB渗透测试-信息收集- WAF、框架组件识别(4)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;63.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;3&#xff09;-CSDN博客 我们在…

Stable Diffusion用AI绘画古诗文视频副业项目,轻松涨粉10W+,项目拆解分享给你【附详细玩法教程】

项目介绍 古诗文自古以来就有着广泛的受众&#xff0c;特别是在短视频平台上&#xff0c;它不仅有很高的流量潜力&#xff0c;还能给观众带来美的享受和教育意义。通过使用AI绘画工具&#xff0c;创作者能够将古诗文中的场景生动地呈现出来&#xff0c;制作出有艺术性、有教育…

测评:【AI办公】版本更迭与AI加持下的最新ONLYOFFICE桌面编辑器8.1

你是否还在为没有一款合适的在线桌面编辑器而苦恼&#xff1f;你是否还在因为办公软件的选择过少而只能使用WPS或者office&#xff1f;随着办公需求的不断变化和发展&#xff0c;办公软件也在不断更新和改进。ONLYOFFICE 作为一款全功能办公软件&#xff0c;一直致力于为用户提…

代理设计模式和装饰器设计模式的区别

代理设计模式: 作用:为目标(原始对象)增加功能(额外功能,拓展功能) 三种经典应用场景: 1&#xff1a;给原始对象增加额外功能(spring添加事务,Mybatis通过代理实现缓存功能等等) 2&#xff1a;远程代理&#xff08;网络通信&#xff0c;输出传输&#xff08;RPC&#xff0c;D…