使用迭代最近点 (ICP) 算法在 Open3D 中对齐点云

一、Open3D 简介及其功能

   Open3D 是一个现代库,它提供了用于处理 3D 数据的各种工具。在其功能中,它提供了高效的数据结构和算法来处理点云、网格等,使其成为在计算机视觉、机器人和图形领域工作的研究人员和从业人员的不错选择。Open3D 的特点之一是它实现了迭代最近点 (ICP) 算法,该算法用于模型对齐任务。

二、Open3D 和 ICP 入门

   迭代最近点 (ICP) 算法是用于对齐 3D 模型的基本技术。它的工作原理是迭代最小化两个点云或一个点云与 3D 模型之间的距离。该算法假设两个点云在不同的方向和/或位置表示相同的对象或场景。ICP 对于机器人和增强现实中的对象识别、定位和映射等任务特别有用。

   要在 Open3D 中使用 ICP,您首先需要安装库。您可以使用 pip 执行此操作:

pip install open3d

   Open3D 在其示例数据集中包含许多模型。安装后,我们可以导入 Open3D 并加载 Stanford Bunny 模型,这是一个用于测试 3D 算法的标准数据集:

import open3d as o3d 
# Load the Bunny mesh
bunny = o3d.data.BunnyMesh()
mesh = o3d.io.read_triangle_mesh(bunny.path)

   接下来,为了使 ICP 算法正常工作,有必要像这样计算顶点法线:

mesh.compute_vertex_normals()

   接下来,放下样本,这样我们就没有那么多点可以拟合了:

# Sample points from the mesh
pcd = mesh.sample_points_poisson_disk(number_of_points=1000)

   要在 Plotly 中将点云可视化为 3D 散点图,可以将 Open3D 点云转换为 NumPy 数组以进行 3D 绘图:

import plotly.graph_objects as go
import numpy as np# Convert Open3D point cloud to NumPy array
xyz = np.asarray(pcd.points)# Create a 3D scatter plot
scatter = go.Scatter3d(x=xyz[:, 0], y=xyz[:, 1], z=xyz[:, 2], mode='markers', marker=dict(size=1))
fig = go.Figure(data=[scatter])
fig.show()

斯坦福兔子点云
在这里插入图片描述

三、旋转模型并查找旋转矩阵

   为了演示 ICP,让我们创建一个 Bunny 模型的旋转版本,方法是将原始模型旋转 45 度,然后使用 ICP 找到原始模型和旋转模型之间的旋转矩阵:

# Apply an arbitrary rotation to the original point cloud
R = o3d.geometry.get_rotation_matrix_from_xyz((np.pi / 4, np.pi / 4, np.pi / 4))
rotated_pcd = pcd.rotate(R, center=(0, 0, 0))

查看旋转的兔子,确保一切正常:

# Convert Open3D point cloud to NumPy array
xyz_rot = np.asarray(rotated_pcd.points)# Create a 3D scatter plot
scatter = go.Scatter3d(x=xyz_rot[:, 0], y=xyz_rot[:, 1], z=xyz[:, 2], mode='markers', marker=dict(size=1.0))
fig = go.Figure(data=[scatter])
fig.show()

在这里插入图片描述
斯坦福兔子旋转 45 度

   现在,我们使用 ICP 来查找原始模型和旋转模型之间的转换矩阵。

# Use ICP to find the rotation
threshold = 0.02  # Distance threshold
trans_init = np.identity(4)  # Initial guess (identity matrix)
trans_init[:3, :3] = R  # We set the initial rotation to the known rotation
reg_p2p = o3d.pipelines.registration.registration_icp(source=rotated_pcd, target=pcd, max_correspondence_distance=threshold,init=trans_init
)# Extract the rotation matrix from the transformation matrix
estimated_rotation_matrix = reg_p2p.transformation[:3, :3]
rotation_matrix = reg_p2p.transformation[:3, :3]
print("Estimated rotation matrix:")
print(rotation_matrix)

   ​ICP发现的原始模型和旋转模型之间的旋转矩阵
在这里插入图片描述

四、验证旋转

   为了验证旋转,我们可以将估计旋转矩阵的逆函数应用于旋转模型,并将其与原始模型进行比较。通过取点之间的均方误差 (MSE),我们可以检查旋转的模型是否在指定的公差范围内恢复到其原始对齐方式:

# Extract the rotation matrix from the transformation matrix
estimated_rotation_matrix = reg_p2p.transformation[:3, :3]# Apply the inverse of the estimated rotation to the rotated point cloud
inverse_rotation_matrix = np.linalg.inv(estimated_rotation_matrix)
rotated_back_pcd = rotated_pcd.rotate(inverse_rotation_matrix, center=(0, 0, 0))# Compare the original point cloud to the one rotated back to its original state
# We can use the mean squared error (MSE) between corresponding points as a metric
original_points = np.asarray(pcd.points)
rotated_back_points = np.asarray(rotated_back_pcd.points)
mse = np.mean(np.linalg.norm(original_points - rotated_back_points, axis=1) ** 2)# Check if the MSE is below a certain tolerance
tolerance = 1e-6
if mse < tolerance:print(f"Test passed: MSE = {mse}")
else:print(f"Test failed: MSE = {mse}")

   假设一切顺利,您应该会看到测试通过的结果,表明点云已重新对齐。

在这里插入图片描述
   显示 ICP 算法的演示到此结束:

   1 在两个未对齐的模型之间查找旋转,以及
   2 使用这些结果将旋转的模型重新对齐回原始方向。

五、使用 ICP 的局限性

   虽然 ICP 是用于模型对齐的强大工具,但它也有其局限性:

  •    ICP 需要良好的初始猜测才能收敛到正确的解决方案,尤其是对于具有大旋转或平移的点云。
  •    该算法可能在对称或无特征的表面上遇到困难,在这些表面上建立正确的对应关系具有挑战性。
  •    异常值和噪声会显著影响 ICP 的性能,从而导致不正确的对齐方式。
  •    ICP 不处理点云之间的尺度差异,因为它假定点云已经处于相同的尺度。
       尽管存在这些局限性,但 ICP 仍然是 3D 数据处理中广泛使用的算法,Open3D 提供了一个用户友好的界面,可将 ICP 应用于各种对齐问题。通过仔细的预处理和参数调整,ICP 可以成为对齐 3D 模型的可靠解决方案。

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

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

相关文章

2023 N1CTF Junior pwn 顶级签到

文章目录 参考make_pairstring_view和stringstd::string 的内部实现和特点std::string_view 的内部实现和特点例子说明 SSO(Short String Optimization)和堆分配源码思路exp 参考 https://zqy.ink/2023/05/12/dingjiqiandao/ make_pair 该函数的作用是解析用户输入的登录信息…

力扣--最大子数组和

给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a;…

头歌处理机调度与死锁--银行家算法第1关:安全性检查

测试说明 平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 输入格式说明: 第1行是系统的进程数N 第2行是系统的资源类别数M 第3行是系统的资源总数,一共有M个数值,每个数值是一类资源的总数。 第4行开始一共有N行,…

2024 年最新安装MAC-vue教学包括常见错误

花了一上午时间终于将 vue 的工程文件安装好了&#xff0c;本教材是傻瓜式操作&#xff0c;按着教程一步一步操作最后就可以看到页面了。 安装Node 1.在线地址&#xff1a; https://nodejs.org/en 2、点击 Download Node.js下载即可&#xff0c;下载完成后&#xff0c;傻瓜式的…

primeflex Display盒模型显示相关样式实战案例

01 Display盒子模式相关样式 基础样式 ClassPropertieshiddendisplay: none;blockdisplay: block;inlinedisplay: inline;inline-blockdisplay: inline-block;flexdisplay: flex;inline-flexdisplay: inline-flex; 样式说明&#xff1a; hidden&#xff1a;隐藏&#xff0c…

c# 学习教程

打印语句 折叠代码 变量 整形 浮点型 特殊类型

林业调查具体是做些什么?

林业调查是对森林资源进行系统的信息收集和处理的过程。 林业调查涵盖了对林木、林地以及林区内生长的动植物及其环境条件的全面评估&#xff0c;旨在及时掌握森林资源的数量、质量和生长消亡的动态规律。这种调查不仅关注森林本身&#xff0c;还包括与之相关的自然环境和经济…

游戏心理学Day01

心理学 心理学是一门研究心理过程和行为及其如何受有机体的生理&#xff0c;心理状态和外部影响的科学 心理学不是常识的代名词&#xff0c;心理学分为基础&#xff0c;心理学和应用心理学基础&#xff0c;心理学研究的目的在于描述&#xff0c;解释&#xff0c;预测和控制行…

网络协议学习笔记

HTTP协议 简单介绍 HTTP属于应用层 HTTP可以简单的理解成类似json一样的文本封装&#xff0c;但是这是超文本&#xff0c;所以可以封装的不止有文本&#xff0c;还有音视频、图片等 请求方法 HTTP报文格式 三大部分 起始行&#xff1a;描述请求或响应的基本信息头部字段…

企业级win10电脑下同时存在Python3.11.7Python3.6.6,其中Python3.6.6是后装的【过程与踩坑复盘】

背景&#xff1a; 需要迁移原始服务器的上的Python3.6.6Flask项目到一个新服务器上&#xff0c; 新服务器上本身存在一个Python3.11.7, 所以这涉及到了一个电脑需要装多个Python版本的问题 过程&#xff1a; 1-确定新电脑版本【比如是32还是64位】 前面开发人员存留了两个…

Python 点云生成高程模型图(DSM)

点云生成高程模型图 一、什么是DSM?二、python代码三、结果可视化一、什么是DSM? DSM(Digital Surface Model)是一种数字高程模型,通常用于描述地表地形的数字化表示。它是由一系列离散的高程数据点组成的三维地形模型,其中每个点都具有其相应的高程值。   DSM主要用于…

算法练习第26天|46.全排列、47全排列II

46.全排列 46. 全排列 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/permutations/description/ 题目描述&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a;…

HTML、ASP.NET、XML、Javascript、DIV+CSS、JQuery、AJax的起源与简介

目录 HTML简介: 起源&#xff1a; ASP.NET简介&#xff1a; 起源: XML简介: 起源: JavaScript简介&#xff1a; 起源: DIVCSS简介: 起源&#xff1a; JQuery简介: 起源: AJax简介&#xff1a; HTML简介: HTML(Hyper Text Markup Language&#xff0c;超文本标记语言…

STM32 | 超声波实战

​01、上节回顾 STM32 | HC-SR04 超声波测距模块 | DHT11数字温湿度传感器(第七天)STM32 | 数字温湿度传感器DHT11STM32 | HC-SR04 超声波测距模块STM32 | DHT11数字温湿度传感器实战02、超声波图示 03、超声波头文件 #ifndef __SR04_H#define __SR04_H​#include "stm…

在鸿蒙中身份校验的手势密码的实现

在harmony中它提供了默认的组件PatternLock()&#xff1b; 这个就能直接显示九宫格密码验证 并且他有两个主要的回调事件 .onDotConnect密码输入选中宫格圆点时触发该回调 .onPatternComplete&#xff1a;密码输入结束时触发该回调 //如代码实现 PatternLock().sideLength(32…

OceanBase 内存研究(OceanBase 3.2.4.5)

内存结构 从官网的结构图可以看出&#xff0c;一台observer可使用的总内存(memory_limit)包括 系统内存(system_memory) 和 租户内存(sys租户与普通租户) 系统内存 系统内存system_memory 属于 observer 的内部内存&#xff0c;允许其它租户共享使用该内存资源 (root10.0.0.…

vmware 正版免费下载

Broadcom 已经收购了 vmware 并且对普通用户提供免费服务. 那么我们怎么去获取这个玩意呢, 注册完之后打开就是这么个狗屎 , 根本不知道在哪里下载&#xff0c;注册的时候还不能用国内邮箱更是超级狗屎 转到 dashboard 搜索 workstation Pro你会搜索到这么一个奇怪的网址然后…

SSM与Mamba模型学习

transformer的缺陷 自注意力机制的计算范围只限于窗口内&#xff0c;不能直接处理窗口外的元素&#xff0c;不能照顾到整个序列。 由于计算复杂度随着窗口的长度呈几何平方式增长&#xff0c;所以不能一味地增加窗口长度来解决。 Transformer本质上是通过位置编码将序列数据空…

计算机网络工程师需要掌握的知识点

网络基础 网络协议OSI参考模型TCP/IP 体系结构广域网与接入网技术&#xff1a;HDLC、PPP。xDSL、HFCIEEE802标准、以太网技术。网桥、交换机、无线局域网&#xff08;WLAN&#xff09;、VLAN、TRUNK、GVRP、STP、综合布线系统IP地址、子网划分、CIDR、ARP、ICMP、IPV6、TCP、UD…

AI在线UI代码生成,不需要敲一行代码,聊聊天,上传图片,就能生成前端页面的开发神器

ioDraw的在线UI代码生成器是一款开发神器&#xff0c;它可以让您在无需编写一行代码的情况下创建前端页面。 主要优势&#xff1a; 1、极简操作&#xff1a;只需聊天或上传图片&#xff0c;即可生成响应式的Tailwind CSS代码。 2、节省时间&#xff1a;自动生成代码可以节省大…