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

news2024/11/17 17:55:19

目录

一、概述

二、代码实现

2.1关键函数

2.2完整代码

三、实现效果

3.1原始点云

3.2配准后点云


一、概述

        在Open3D中,CPD(Coherent Point Drift,一致性点漂移)算法是一种经典的点云配准方法,适用于无序点云的非刚性(非刚体)配准问题。CPD算法通过建模点云之间的概率关系,以最大化对应点对之间的一致性来实现配准。以下是CPD算法的详细原理介绍:

CPD算法通过以下步骤来实现点云的非刚性配准:
1.问题建模:
        假设有两个点云:源点云(source)和目标点云(target)。目标是找到一个概率转移矩阵和变换矩阵,将源点云的点映射到目标点云上,同时考虑点之间的一致性和概率分布。
2.概率分布建模:
        - 假设每个源点在目标点云上的对应位置服从高斯分布。
        - 建立概率转移矩阵P来表示每个源点对目标点的概率。
3.优化目标:
        CPD算法通过最大化点云之间的一致性来优化配准结果。具体来说,它最小化源点云与目标点云之间的KL散度(Kullback-Leibler divergence),以确定最佳的变换和对应关系。
4.迭代优化:
        CPD算法使用迭代方法来逐步优化变换矩阵和概率转移矩阵。每次迭代包括两个主要步骤:
        - E步骤(Expectation):更新每个源点的对应概率,基于当前的变换矩阵和目标点云的位置。
        - M步骤(Maximization):更新变换矩阵,将源点云映射到目标点云上,最大化对应点对之间的一致性。
5.收敛判据:
        CPD算法通常会设定迭代次数或者设定一个收敛准则来终止迭代过程,例如KL散度变化小于某个阈值或者达到最大迭代次数。

二、代码实现

2.1关键函数

def registration_cpd(source, target, tf_type_name='rigid',
                     w=0.0, maxiter=50, tol=0.001,
                     callbacks=[], **kargs):
  • tf_type_name (str, optional):转换类型(‘刚性’,‘仿射’,‘非刚性’)
  • w (float, optional):均匀分布的权重,0 < ’ w ’ < 1。
  • maxitr (int, optional):EM算法的最大迭代次数。
  • tol (float, optional): 停止迭代的最小容忍偏差

2.2完整代码

import open3d as o3d
import numpy as np
from probreg import cpd
import time
import copy


#  --------------------读取点云数据------------------
source = o3d.io.read_point_cloud("..//..//standford_cloud_data//Horse.pcd")
target = o3d.io.read_point_cloud("..//..//standford_cloud_data//Horse_trans.pcd")

source = source.uniform_down_sample(every_k_points=10)
target = target.uniform_down_sample(every_k_points=10)

# 点云上色
source.paint_uniform_color([0, 0, 1])
target.paint_uniform_color([0, 1, 0])
o3d.visualization.draw_geometries([source, target], window_name="点云初始位置",
                                  width=1024, height=768,
                                  left=50, top=50,
                                  mesh_show_back_face=False)  # 可视化点云初始位置
# CPD算法进行配准
start = time.time()
tf_param, _, _ = cpd.registration_cpd(source, target,        # 源点云和目标点云
                                      tf_type_name='rigid',  # 计算变换矩阵的类型('rigid', 'affine', 'nonrigid')
                                      w=0.0,                 # 均匀分布的权重,0 < ' w ' < 1。
                                      maxiter=50,            # EM算法的最大迭代次数。
                                      tol=0.001)             # 停止迭代的最小容忍偏差
result = copy.deepcopy(source)
result.points = tf_param.transform(result.points)
print("配准用时: %.3f sec.\n" % (time.time() - start))
# 可视化配准结果
target.paint_uniform_color([1, 0, 0])
result.paint_uniform_color([0, 0, 1])
o3d.visualization.draw_geometries([target, result], window_name="CPD算法配准",
                                  width=1024, height=768,
                                  left=50, top=50,
                                  mesh_show_back_face=False)

三、实现效果

3.1原始点云

3.2配准后点云

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

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

相关文章

Python番外篇之责任转移:有关于虚拟机编程语言的往事

编程之痛 如果&#xff0c;你像笔者一样&#xff0c;有过学习或者使用汇编语言与C、C等语言的经历&#xff0c;一定对下面所说的痛苦感同身受。 汇编语言 将以二进制表示的一条条CPU的机器指令&#xff0c;以人类可读的方式进行表示。虽然&#xff0c;人类可读了&#xff0c…

Android Studio 2023版本切换DNK版本

选择自己需要的版本下载 根目录下的配置路劲注意切换 build.gradle文件下的ndkVersion也要配好对应版本

【web APIs】快速上手Day03

目录 Web APIs - 第3天全选文本框案例事件流事件捕获事件冒泡阻止冒泡解绑事件on事件方式解绑addEventListener方式解绑 注意事项-鼠标经过事件的区别两种注册事件的区别 事件委托综合案例-tab栏切换改造 其他事件页面加载事件元素滚动事件页面滚动事件-获取位置页面滚动事件-滚…

【java高级】【算法】通过子节点 反向获取 树路径父节点 且不获取无关节点

有一个奇葩需求 要求 用户配置在某选择框的选项 例如 然后在选择时显示 用户配置的选项 依旧是返回树,但是只包含 选择的子节点。 以及涉及的父节点,树路径 不返回无关节点 【一般】我们开发中都是直接通过 树节点 返回 其下子节点 这个需求的确很奇葩。 而且还要考…

生命在于学习——Python人工智能原理(3.1.1)

Python部分结束了&#xff0c;开始概率论部分 一、概率基本知识 1.1 事件与概率 1.1.1 事件的运算与关系 &#xff08;一&#xff09;基本概念 定义1 随机试验 如果一个试验满足如下条件&#xff1a; 在试验前不能断定其将发生什么结果&#xff0c;但可明确指出或说明试验…

Python系统教程01

Python 是一门解释性语言&#xff0c;相对更简单、易学&#xff0c;它可以用于解决数学问题、获取与分 析数据、爬虫爬取网络数据、实现复制数学算法等等。 1、print()函数&#xff1a; print()书写时注意所有的符号都是英文符号。print()输出内容时&#xff0c;若要输出字符…

【RabbitMQ问题踩坑】RabbitMQ设置手动ack后,消息队列有多条消息,只能消费一条,就不继续消费了,这是为什么 ?

现象&#xff1a;我发送5条消息到MQ队列中&#xff0c;同时&#xff0c;我在yml中设置的是需要在代码中手动确认&#xff0c;但是我把代码中的手动ack给关闭了&#xff0c;会出现什么情况&#xff1f; yml中配置&#xff0c;配置需要在代码中手动去确认消费者消费消息成功&…

赋能心理大模型,景联文科技推出高质量心理大模型数据库

生成式大模型作为当前发展势头最为强劲的人工智能前沿技术&#xff0c;其在临床心理学领域中的创新应用已成为社会关注和医学聚焦的热点之一。 心理大模型在落地应用过程中可能面临的痛点主要包括以下几个方面&#xff1a; 数据隐私与安全&#xff1a;确保敏感的个人信息在模型…

uniapp微信小程序电子签名

先上效果图&#xff0c;不满意可以直接关闭这页签 新建成单独的组件&#xff0c;然后具体功能引入&#xff0c;具体功能点击签名按钮&#xff0c;把当前功能页面用样式隐藏掉&#xff0c;v-show和v-if也行&#xff0c;然后再把这个组件显示出来。 【签名-撤销】原理是之前绘画时…

全球首款搭载Google Gemini和GPT-4o的智能眼镜发布

智能眼镜仍然是一个尚未完全成熟的未来概念&#xff0c;但生成式人工智能的到来显著提升了这些设备的能力。Meta 的 Ray-Ban 智能眼镜被许多人视为当今最好的选择之一&#xff0c;而现在 Solos AirGo Vision 正在为其带来竞争&#xff0c;这款眼镜还集成了 Google Gemini 支持。…

burpsuite 设置监听窗口 火狐利用插件快速切换代理状态

一、修改burpsuite监听端口 1、首先打开burpsuite&#xff0c;点击Proxy下的Options选项&#xff1a; 2、可以看到默认的监听端口为8080&#xff0c;首先选中我们想要修改的监听&#xff0c;点击Edit进行编辑 3、将端口改为9876&#xff0c;并保存 4、可以看到监听端口修改成功…

JUC基础学习

1.Java JUC简介 2.volatile关键字-内存可见性 3.原子变量-CAS算法 4.ConcurrentHashMap锁分段机制

【Unity Linux】模型导致的Unity项目崩溃

模型需勾选Strip Bones。如不勾选&#xff0c;则开启项目崩溃。 也可以删除有问题模型的.meta文件。 &#xff08;Unity默认会自动勾选&#xff0c;所以不会崩溃&#xff09; 或打开.meta文件&#xff0c;将optimizeBones的值&#xff0c;由0改为1。&#xff08;对应面板上的…

Top 5 免费 PDF 转 Word 转换工具

PDF 是可移植文档格式的缩写&#xff0c;是一种文件格式&#xff0c;用于独立于软件、硬件或操作系统可靠地呈现和交换文档。PDF 不是为编辑而设计的&#xff0c;因此如果您想更改某些内容&#xff0c;可能需要将 PDF 转换为 Word/Doc 转换器。 Top 5 免费 PDF 转 Word 转换工具…

【Python实战因果推断】12_线性回归的不合理效果2

目录 Adjusting with Regression Adjusting with Regression 为了了解回归的威力&#xff0c;让我带您回到最初的例子&#xff1a;估计信贷额度对违约的影响。银行数据通常是这样的&#xff0c;其中有很多列客户特征&#xff0c;这些特征可能表明客户的信贷价值&#xff0c;比…

1972计算机毕业设计asp.net毕业生就业信息管理系统VS开发access数据库web结构c#编程计算机网页源码项目

一、源码特点 asp.net毕业生就业信息管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 asp.net毕业生就业信息管理系统 二、功能介绍 基于ASP.NET的毕业生就业信息管理系统主要满足以下几个方面的…

SQL 注入联合查询之为什么要 and 1=2

在 SQL 注入联合查询中&#xff0c;将 id 先置为假&#xff08;如 id-1 或其他使查询结果为空的条件&#xff09;&#xff0c;通常是为了让前面的查询语句查询不到结果&#xff0c;从而使联合查询中后面的语句结果能够显示在回显位上

【数据结构】栈和队列-相互实现OJ题

前言&#xff1a; 本题目是关于栈和队列的OJ题目&#xff0c;需对栈和队列有一定了解再进行做题&#xff0c;若不了解可以根据我之前这篇文章进行学习&#xff1a;【数据结构】栈和队列-CSDN博客,题中需要的栈和队列的实现也在该文章中有源代码 目录 前言&#xff1a; 一.用…

转运机器人帮助物流行业实现无人化运输,自动分拣

在物流行业日新月异的今天&#xff0c;智能化、无人化已成为大势所趋。富唯智能转运机器人凭借其卓越的性能和广泛的应用场景&#xff0c;正引领着物流行业的新一轮变革。 1、高效转运&#xff0c;轻松应对 富唯智能转运机器人&#xff0c;拥有高达1000kg的负载能力&#xff…

django学习入门系列之第三点《BootSrap初了解》

文章目录 初识BootStrap往期回顾 初识BootStrap BootSrap是什么&#xff1f; 是别人帮我们已写好的CSS样式&#xff0c;我们如果想要使用这个BootSrap&#xff1a; 下载BootStrap使用 在页面上引入BootStrap编写HTML时&#xff0c;按照BootStrap的规定来编写 自定制 官网&…