Open3D 点对面的ICP算法配准(精配准)

目录

一、概述

1.1核心思想

1.2实现步骤

二、代码实现

2.1关键函数

2.2完整代码

三、实现效果

3.1原始点云

3.2配准后点云

3.3计算数据


一、概述

        基于点对面的ICP(Iterative Closest Point)配准算法是ICP的一种变体,它通过最小化源点云中每个点到目标点云表面的距离来实现配准。与传统的点对点ICP算法相比,点对面ICP可以在某些情况下提供更好的配准精度,特别是当目标点云具有复杂的几何形状时。

1.1核心思想

点对面ICP配准算法的核心思想是:

  1. 对于源点云中的每个点,找到目标点云中的最近面。
  2. 计算源点到该面的垂直距离。
  3. 通过最小化这些垂直距离来估计刚体变换(旋转和平移),使源点云与目标点云对齐。

1.2实现步骤

具体步骤如下:

  1. 初始化:选择一个初始变换(通常是单位变换)将源点云与目标点云进行初步对齐。
  2. 最近面配对:对于源点云中的每个点,找到目标点云中最近的面(通常由三角形网格表示)。这一步通常通过最近邻搜索来实现。
  3. 计算误差:计算源点到目标面之间的垂直距离(误差)。
  4. 最小化误差:通过最小化这些垂直距离来估计新的刚体变换。
  5. 迭代:应用计算得到的刚体变换,并重复以上步骤,直到误差收敛或达到最大迭代次数。

二、代码实现

2.1关键函数

1、该类TransformationEstimationPointToPlane()提供用于计算点对面的ICP目标函数的残差和雅可比矩阵的函数。函数registration_icp将其作为参数并运行点对面的ICP以获得结果。

2、该函数evaluate_registration计算两个主要指标。fitness计算重叠区域(内点对应关系/目标点数)。越高越好。inlier_rmse计算所有内在对应关系的均方根误差RMSE。越低越好。

3、由于函数transformand paint_uniform_color会更改点云,可视化部分调用copy.deepcoy进行复制并保护原始点云。

2.2完整代码

import copy
import open3d as o3d
import numpy as np
# -------------------读取点云数据--------------------
source = o3d.io.read_point_cloud("hand.pcd")
target = o3d.io.read_point_cloud("hand_trans.pcd")
# --------------------计算法向量---------------------
source.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30))
target.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30))
# ----------------可视化点云初始位置-----------------
o3d.visualization.draw_geometries([source, target], width=600, height=600, mesh_show_back_face=False)
threshold = 1 # 距离阈值
trans_init = np.asarray([[ 0.98194534, -0.18295687, -0.04806395,  0.65088957],
                        [ 0.11626176,  0.78413388, -0.60960419,  4.19087836],
                        [ 0.14921985,  0.59300999,  0.79124749,  0.42555584],
                            [ 0,          0,          0,          1        ]])  # 初始变换矩阵,一般由粗配准提供
print("Initial alignment")
evaluation = o3d.pipelines.registration.evaluate_registration(source, target, threshold, trans_init)
print(evaluation)  # 这里输出的是初始位置的 fitness和RMSE
print("Apply point-to-plane ICP")
icp_p2plane = o3d.pipelines.registration.registration_icp(
        source, target, threshold, trans_init,
        o3d.pipelines.registration.TransformationEstimationPointToPlane(),    # 执行点对面的ICP算法
        o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration=30))  # 设置最大迭代次数
print(icp_p2plane)  # 输出ICP相关信息
print("Transformation is:")
print(icp_p2plane.transformation) # 输出变换矩阵


# -----------------可视化配准结果---------------------
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_source1.pcd", source_temp)  # 保存点云
    o3d.visualization.draw_geometries([source_temp, target_temp], width=600, height=600, mesh_show_back_face=False)


draw_registration_result(source, target, icp_p2plane.transformation)

三、实现效果

3.1原始点云

3.2配准后点云

3.3计算数据

Initial alignment
RegistrationResult with fitness=1.000000e+00, inlier_rmse=1.838722e-01, and correspondence_set size of 327323
Access transformation to get result.
Apply point-to-plane ICP
RegistrationResult with fitness=1.000000e+00, inlier_rmse=1.660569e-07, and correspondence_set size of 327323
Access transformation to get result.
Transformation is:
[[ 1.00000001e+00  3.24158871e-10  5.54218013e-09 -3.07668001e-08]
 [ 1.41976912e-09  7.07106784e-01 -7.07106783e-01  4.99999999e+00]
 [-7.42239601e-10  7.07106783e-01  7.07106780e-01  1.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00  1.00000000e+00]]

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

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

相关文章

骏网一卡通之类的游戏卡有什么用?

感觉现在打端游的人越来越少了 而且游戏充值卡显得就很鸡肋,在家里整理东西,翻出来好多骏网一卡通,但是我又不打游戏 想着把这卡送给有需要的朋友,不然也是浪费,问了一圈送不出去 还好最后在收卡云上卖掉了&#xf…

H桥驱动器芯片详解

H桥驱动器芯片详解 上一篇文章讲解了H桥驱动器的控制原理,本文以汽车行业广泛应用的DRV8245芯片为例,详细讲解基于集成电路的H桥驱动器芯片。 1.概述 DRV824x-Q1系列器件是德州仪器(TI)的一款专为汽车应用设计的全集成H桥驱动器…

【本地docker启动私有大模型】

一、最终效果 中英文对话 生成代码 二、资源配置 本文选择的模型运行内存需要 4G,因此宿主机建议内存大于8G,CPU建议 6 核以上; 参考博主该mac配置可以相对流畅运行。只需要 CPU资源,不需要 GPU。 三、搭建步骤 启动docker容…

羊大师:探索羊奶奥秘,解锁免疫力提升新篇章

在浩瀚的自然界中,羊奶以其独特的营养价值和健康益处,悄然成为提升免疫力的新宠。自古以来,羊奶就被视为珍贵的滋补佳品,而今,随着科学的深入探索,其提升免疫力的奥秘正逐渐揭开面纱。 羊奶中富含的免疫球蛋…

MQTT教程--服务器使用EMQX和客户端使用MQTTX

什么是MQTT MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备…

字典树(Tire树)

字典树(Tire树) 字典树是一种多叉树,又称为前缀树。核心思想是利用字符串的公共前缀。 字典树的根节点为空,从根节点到某一节点路径上的字符连接起来构成字符串,完整的字符串在链上而非结点上,一个节点的所有子节点都具有相同公…

用Vue3和Plotly.js绘制交互式3D散点图

本文由ScriptEcho平台提供技术支持 项目地址:传送门 使用 Plotly.js 创建 2D 密度图 应用场景介绍 密度图是一种可视化数据分布的图表,它显示了数据点的密度在不同区域的变化情况。在许多科学和工程领域中,密度图被广泛用于探索和分析数据…

产品经理/项目经理管理项目使用最多的12款项目软件对比

盘点不同行业、项目类型的下的12款主流的项目管理软件:PingCode、Worktile、Teambition、TAPD、广联达、Asana、Basecamp、Jira、Microsoft Project、ClickUp、Redmine、Trello。 在这个项目管理工具层出不穷的时代,选择一个合适的软件似乎成了一个令许多…

当CNN遇上Mamba,高性能与高效率通通拿下!

传统视觉模型在处理大规模或高分辨率图像时存在一定限制,为解决这个问题,研究者们就最近依旧火热的Mamba,提出了Mamba结合CNN的策略。 这种结合可以让Mamba在处理长序列数据时既能够捕捉到序列中的时间依赖关系,又能够利用CNN的局…

工业一体机为数字化工厂带来高效作业指导

随着工业4.0的浪潮席卷全球,数字化工厂的概念深入人心。在这一背景下,工业一体机作为数字化转型的重要一环,凭借其强大的功能和灵活的应用,为工厂实现高效作业指导提供了强大的助力。 一、工业一体机的优势:赋能数字化…

3102. 最小化曼哈顿距离——leetcode

给你一个下标从 0 开始的数组 points ,它表示二维平面上一些点的整数坐标,其中 points[i] [xi, yi] 。 两点之间的距离定义为它们的曼哈顿距离。 请你恰好移除一个点,返回移除后任意两点之间的 最大 距离可能的 最小 值。 示例&#xff1…

计算机的核心工作机制

前言 本篇不介绍代码,主要是理解计算机的一些核心工作机制。想了解更多请跳转-->【【计算机科学速成课】[40集全/精校] - Crash Course Computer Science】 冯诺依曼体系结构 由计算机之父之一冯诺依曼提出的计算机内部构造的基本组成,而现在大多数…

向github远程仓库中push,要求使用token登录

Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. 如上,当向github远程仓库push时,输入github的用户名和密码出现如上错误,要求使用token登录,此时只需要用户…

智慧光伏一站式解决方案

光伏电站智慧化管理平台,将现代先进的数字信息技术、通信技术、互联网技术、云计算技术、大数据挖掘技术与光伏技术高度融合而形成。可以满足光伏企业对电站的高发电量、低初始投资、低运维成本等需求,从开发到运维的25年生命周期内,实现高收…

短视频矩阵搭建,用云微客获客更方便

你的同行都爆单了,你还在问什么是矩阵?让我来告诉你。短视频矩阵是短视频获客的一种全新玩法,是以品牌宣传、产品推广为核心的一个高端布局手段,也是非常省钱的一种方式。 1.0时代,一部手机一个账号;2.0时代…

【多媒体】Java实现MP4和MP3音视频播放器【JavaFX】【更多功能的播放器】【音视频播放】

在Java中播放视频可以使用多种方案,最常见的是通过Swing组件JFrame和JLabel来嵌入JMF(Java Media Framework)或Xuggler。不过,JMF已经不再被推荐使用,而Xuggler是基于DirectX的,不适用于跨平台。而且上述方案都需要使用第三方库。…

Linux系统备份工具TimeShift

Linux系统备份 Linux系统备份工具TimeShift Linux系统备份工具TimeShift 0. 前言1. 安装2. 启动3. 使用法一、图形界面操作(方便)法二、终端命令操作(高端) Linux系统备份工具TimeShift Linux系统备份工具TimeShift 0. 前言 Time…

SpringMVC--获取请求参数

1、通过的ServletAPI获取 只需要在控制器的方法的形参位置设置HTTPRequest request 类型的形参就i可以在控制器方法种使用request对象获取请求参数 RequestMapping("/servletAPI")public String getByServletAPI(HttpServletRequest request){HttpSession session…

【论文速读】| 用于安全漏洞防范的人工智能技术

本次分享论文:Artificial Intelligence Techniques for Security Vulnerability Prevention 基本信息 原文作者:Steve Kommrusch 作者单位:Colorado State University, Department of Computer Science, Fort Collins, CO, 80525 USA 关键…

硬盘分区读不出来的危机与数据拯救指南

在数字时代,硬盘作为我们存储珍贵数据的“保险箱”,其稳定性和可访问性至关重要。然而,当硬盘分区突然读不出来时,这份安全感瞬间化为泡影,让人心急如焚。本文将深入探讨硬盘分区读不出来的原因、提供两种实用的数据恢…