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]]

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

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

相关文章

【Ty CLI】一个开箱即用的前端脚手架

目录 资源链接基础命令模板创建命令帮助选择模板开始创建开发模板 开发背景npm 发布流程问题记录模板创建超时 更新日志 资源链接 文档:https://ty.cli.vrteam.top/ 源码:https://github.com/bosombaby/ty-cli 基础命令 1. npm 全局安装 npm i ty-cli…

Zabbix Sia Zabbix 逻辑漏洞(CVE-2022-23134)

前言 CVE-2022-23134是一个中等严重度的漏洞,影响Zabbix Web前端。这个漏洞允许未经身份验证的用户访问setup.php文件的某些步骤,这些步骤通常只对超级管理员开放。利用这个漏洞,攻击者可以通过跳过某些步骤来重新配置Zabbix前端&#xff0c…

Redis-Jedis连接池\RedisTemplate\StringRedisTemplate

Redis-Jedis连接池\RedisTemplate\StringRedisTemplate 1. Jedis连接池1.1 通过工具类1.1.1 连接池:JedisConnectionFactory:1.1.2 test:(代码其实只有连接池那里改变了) 2. SpringDataRedis(lettuce&#…

十五、小型电脑没有数字键及insert,怎么解决IDEA快速插入getset构造这些方法

🌻🌻目录 一、小型电脑没有数字键及insert,怎么解决IDEA快速插入getset构造这些方法 一、小型电脑没有数字键及insert,怎么解决IDEA快速插入getset构造这些方法 解决: 1.winR打开搜索 2.osk回车 屏幕就出现了这样的一…

CC7利用链分析

分析版本 Commons Collections 3.2.1 JDK 8u65 环境配置参考JAVA安全初探(三):CC1链全分析 分析过程 CC7,6,5都是在CC1 LazyMap利用链(引用)的基础上。 只是进入到LazyMap链的入口链不同。 CC7这个链有点绕,下面顺着分析一下利用链。 入口类是Hashtable&…

前端入门知识分享:如何在HTML或CSS文件中引用CSS文件。

阅读提示:本文仅仅仅适用于刚刚接触HTML和CSS的小白从业者,新人爱好者。自觉身份不符的老鸟们,尽快绕行吧! 什么是CSS?什么是CSS文件。 CSS,全称为Cascading Style Sheets(层叠样式表&#xff…

分布式IO模块软件配置

组态接口模块 1、打开网络视图 2、拖拽出ET200SP 3、双击ET200SP的图片,进入从站配置 总线适配器的组态更换 关于IO地址分配,需要建立好子网通信后,在主机上配置。 可以看到IP 和设备名 设备与控制器的Profinet连接 先找到设备名称再找…

HarmonyOS鸿蒙DevEco Studio无法连接本地模拟器

使用DevEcoStudio 5.0.3.403版本 发现无法选择模拟器 解决方法: 1、打开模拟器 2、关闭DevEco Studio,(不要关闭模拟器) 3、重新打开DevEco Studio。

四道经典算法JAVA

1.爬楼地 爬20个台阶的爬法:f(19)f(18) 经典斐波拉契数列问题 public class demo4 {//爬楼梯问题public static void main(String[] args) {System.out.println(getSum(20));}public static int getSum(int n) {if (n 1)return 1;if (n 2)return 2;return getSum(n - 1) …

SpringBoot:SpringBoot中如何实现对Http接口进行监控

一、前言 Spring Boot Actuator是Spring Boot提供的一个模块,用于监控和管理Spring Boot应用程序的运行时信息。它提供了一组监控端点(endpoints),用于获取应用程序的健康状态、性能指标、配置信息等,并支持通过 HTTP …

关于Python的类的一些理解

才发现python的类对象只能调用类方法 我想使用对类对象a使用系统调用的len方法就会报错 2.类对象a是什么? 答:是所有的带有self的成员变量 举例说明:红色的就是a里面的东西 class A:def __init__(self,data):self.datadataself.b1self.d{a…

解读‘‘不要卷模型,要卷应用‘‘

前言 2024 年 7 月 4 日,世界人工智能大会暨人工智能全球治理高级别会议全体会议在上海世博中心举行。百度创始人李彦宏在产业发展主论坛上发言,呼吁不要卷模型,要卷应用。 目录 四个要点 积极的观点 不合理性 总结 四个要点 李彦宏的呼吁…

多模态:Nougat详解

文章目录 前言一、模型结构1. encoder2. decoder3. set 二、数据增强三、数据splitting the pages 四、实验评估repetitions during inference 五、代码1. 环境安装2. Dataset(dataset.py)3. Model(model.py) 总结 前言 科学知识…

一网统管/视频汇聚/安防监控平台EasyCVR启动后无法访问是什么原因?

智慧城市/一网统管/视频汇聚/安防监控平台EasyCVR兼容性强,支持多协议接入,包括国标GB/T 28181协议、GA/T 1400协议、部标JT808协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等,并能对外分…

接口测试课程结构

课程大纲 如图,接下来的阶段课程,依次专项讲解如下专题,能力级别为中级,进阶后基本为中高级: 1.接口基础知识; 2.抓包工具; 3.接口工具; 4.mock服务搭建(数据模拟服务&am…

Git使用——首次创建本地仓库、配置、初始化、关联远程仓库

1、安装 Git软件 官网:git-scm.com 有时候官网打不开,这里留存个之前下载过的安装包: https://download.csdn.net/download/weixin_43908355/89502977 2、配置本地仓库 在准备建仓库的文件夹里,右键点击:Git Bash …

鸿蒙系统创建签名文件及使用创建签名文件打包并安装

* 第一步 第二步:创建.p12文件,点击New如果有的话就Choose Existing 填好下面信息 点击Next进入到下面界面 开始生成csr文件如下图 点击OK–>Finish 文件保存在了下面目录 第三步 1.访问华为开发者平台,登录开发者账号,进…

【linux服务器篇】-Redis-RDM远程连接redis

redis desktop manager 使用远程连接工具RDM连接redis 市面上比较常见的其中一款工具redis desktop manager 简单的说: Redis Desktop Manager 简单的来讲就是Redis可视化工具,可以让我们看到Redis中存储的内容。 redis desktop manager是一款功能强…

【面试八股总结】面向对象三大特性、虚函数、纯虚函数、虚继承

参考资料:阿秀 一、面向对象三大特性 封装:将数据和代码捆绑在一起,避免外界干扰和不确定性访问 继承:让某种类型对象获得另一个类型对象的属性和方法 多态:同一种事务表现出不同事务的能力,即&#xf…

数据库课设---学生宿舍管理系统(sql server+C#)

1.引言 1.1 内容及要求 设计内容:设计学生宿舍管理系统。 设计要求: (1)数据库应用系统开发的需求分析,写出比较完善系统功能。 (2)数据库概念模型设计、逻辑模型设计以及物理模型设计。 …