CPD点云配准

一、CPD点云配准

Python

这是github上一位大佬写的Python包,链接:neka-nat/probreg: Python package for point cloud registration using probabilistic model (Coherent Point Drift, GMMReg, SVR, GMMTree, FilterReg, Bayesian CPD) (github.com)你要安装open3d、probreg和cupy

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


def view_show(point1, point2):
    # 关键点绿色
    point1.paint_uniform_color([0, 1, 0])
    # 点云红色
    point2.paint_uniform_color([1, 0, 0])
    # 可视化
    vis = o3d.visualization.Visualizer()
    vis.create_window(window_name="CPD", width=1200, height=1200)

    # 设置背景颜色
    vis.get_render_option().background_color = [0, 0, 0]  # 白色背景

    # 添加点云到Visualizer
    vis.add_geometry(point1)
    vis.add_geometry(point2)

    # 运行可视化循环
    vis.run()
    vis.destroy_window()


if __name__ == "__main__":
    # 读取点云文件
    source = o3d.io.read_point_cloud('data/pig_view1.pcd')
    target = o3d.io.read_point_cloud('data/pig_view2.pcd')
    # 去除无效点
    source.remove_non_finite_points()
    target.remove_non_finite_points()
    # 下采样
    source = source.voxel_down_sample(voxel_size=15)
    target = target.voxel_down_sample(voxel_size=15)
    view_show(target, source)
    # CPD配准
    tf_param, _, _ = cpd.registration_cpd(source=source,
                                          target=target,
                                          tf_type_name="rigid",
                                          w=0.0,
                                          maxiter=30,
                                          tol=0.001)
    # 方法一,使用自带方法
    # source.points = tf_param.transform(source.points)

    # 方法二,使用该类的属性
    rotation_matrix = tf_param.rot  # 3x3 numpy格式旋转矩阵
    translation_vector = tf_param.t  # 3x1 numpy格式平移矩阵
    scale_factor = tf_param.scale  # 缩放因子

    # 缩放后的旋转矩阵
    scaled_rotation_matrix = rotation_matrix * scale_factor
    # 创建最终变换矩阵
    transformation_matrix = np.eye(4)  # Create a 4x4 identity matrix
    transformation_matrix[:3, :3] = scaled_rotation_matrix  # Set the top-left to the scaled rotation matrix
    transformation_matrix[:3, 3] = translation_vector  # Set the top-right to the translation vector
    source.transform(transformation_matrix)

    view_show(target, source)

关键代码解析:

from probreg import cpd
import open3d as o3d
tf_param, _, _ = cpd.registration_cpd(source=source,
                                          target=target,
                                          tf_type_name="rigid",
                                          w=0.0,
                                          maxiter=30,
                                          tol=0.001)

source.points = tf_param.transform(source.points)

这段代码是使用 probreg 库中的 CPD(Coherent Point Drift)算法进行点云配准(registration)的过程。点云配准是将两个或多个点云之间进行空间转换,使它们在某种度量下对齐的过程。

让我逐行解析代码并解释每个参数的设置以及可能产生的影响:

  1. from probreg import cpd: 这行代码导入了 probreg 库中的 CPD 模块,使我们可以使用其中的函数和类。

  2. import open3d as o3d: 这行代码导入了 Open3D 库,并将其重命名为 o3d。Open3D 是一个用于处理 3D 数据的现代库,其中包含了许多用于点云处理和可视化的功能。

  3. tf_param, _, _ = cpd.registration_cpd(source=source, target=target, tf_type_name="rigid", w=0.0, maxiter=30, tol=0.001): 这行代码调用了 cpd.registration_cpd 函数,执行 CPD 点云配准。参数如下:

    • source: 源点云,即需要配准的原始点云。
    • target: 目标点云,即源点云需要配准到的目标点云。
    • tf_type_name="rigid": 指定了配准的变换类型。在这里,设置为 "rigid" 表示使用刚体变换,即平移和旋转。
    • w=0.0: CPD 算法的权重参数,控制了两个点云之间的对应关系。当 w 设置为 0 时,表示不考虑点云之间的对应关系,仅通过点云的空间分布来进行配准。
    • maxiter=30: CPD 算法的最大迭代次数,即算法将尝试寻找最佳解的最大次数。
    • tol=0.001: CPD 算法的收敛容差,当迭代过程中的变化小于此值时,算法将停止迭代。

    函数的返回值 tf_param 包含了配准后的变换参数。

  4. source.points = tf_param.transform(source.points): 这行代码将源点云根据配准得到的变换参数进行变换,从而得到最终的配准结果。这里假设 source.points 是一个 numpy 数组,表示源点云的点坐标。通过 tf_param.transform 方法,将源点云进行变换,使其与目标点云对齐。

以上是代码的解析和参数设置的影响。根据具体的应用场景和需求,您可以调整参数来获得更好的配准结果。例如,通过调整 maxitertol 参数可以控制算法的精度和速度;通过调整 w 参数可以控制对点云之间对应关系的考虑程度。

    rotation_matrix = tf_param.rot  # 3x3 numpy格式旋转矩阵
    translation_vector = tf_param.t  # 3x1 numpy格式平移矩阵
    scale_factor = tf_param.scale  # 缩放因子

    # 缩放后的旋转矩阵
    scaled_rotation_matrix = rotation_matrix * scale_factor
    # 创建最终变换矩阵
    transformation_matrix = np.eye(4)  # Create a 4x4 identity matrix
    transformation_matrix[:3, :3] = scaled_rotation_matrix  # Set the top-left to the scaled rotation matrix
    transformation_matrix[:3, 3] = translation_vector  # Set the top-right to the translation vector
    source.transform(transformation_matrix)

这种转换方法是根据其属性来计算变换矩阵实现的,这是源码的截图

 

这是变换矩阵计算公式

 

  1. rotation_matrix (旋转矩阵):

    • rotation_matrix 是一个3x3的NumPy数组,表示旋转矩阵。通常,旋转矩阵用于描述物体的旋转变换。这个矩阵包含了绕坐标轴的旋转信息。
  2. translation_vector (平移矩阵):

    • translation_vector 是一个3x1的NumPy数组,表示平移矩阵。它包含了物体在三个坐标轴上的平移信息。
  3. scale_factor (缩放因子):

    • scale_factor 是缩放因子,用于控制物体的缩放比例。它是一个标量值,表示将物体沿着每个坐标轴进行缩放的比例。
  4. scaled_rotation_matrix (缩放后的旋转矩阵):

    • scaled_rotation_matrix 是通过将原始旋转矩阵 rotation_matrix 与缩放因子 scale_factor 相乘得到的。这样可以实现在旋转的基础上进行缩放。
  5. transformation_matrix (最终变换矩阵):

    • transformation_matrix 是一个4x4的单位矩阵,用于表示仿射变换矩阵。在这个矩阵的左上角(3x3的子矩阵)存放了经过缩放后的旋转矩阵,而在右上角的第1至第3行、第4列存放了平移向量。
  6. source.transform(transformation_matrix):

    • 通过调用其 transform 方法,将应用变换矩阵 transformation_matrix 对其进行变换。这会导致源对象相应地发生旋转、缩放和平移。

结果:

配准前

配准后,十分出色

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

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

相关文章

深入理解与应用工厂方法模式

文章目录 一、模式概述**二、适用场景****三、模式原理与实现****四、采用工厂方法模式的原因****五、优缺点分析****六、与抽象工厂模式的比较**总结 一、模式概述 ​ 工厂方法模式是一种经典的设计模式,它遵循面向对象的设计原则,特别是“开闭原则”&…

EasyX的使用(详解版)

EasyX的基础概念&#xff1a; 图形化——EasyX的安装-CSDN博客 创建图形化窗口 #include<graphics.h> #include<conio.h> int main() {//创建绘图窗口&#xff0c;大小为100x100像素。//更改为大窗口&#xff0c;像素增大&#xff1b;更改为小窗口&#xff0c;像素…

华为数通方向HCIP-DataCom H12-821题库(单选题:481-500)

第481题 以下关于基于SD-WAN思想的EVPN互联方案的描述,错误的是哪一项? A、通过部署独立的控制面,将网络转发和控制进行了分离,从而实现了网络控制的集中化 B、通过对WAN网络抽象和建模,将上层网络业务和底层网络具体实现架构进行解耦,从而实现网络自动化 C、通过集中的…

上位机图像处理和嵌入式模块部署(当前机器视觉新形态)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 过去的机器视觉处理&#xff0c;大部分都是集中在上位机、或者是服务器领域&#xff0c;这种形式维持了很长的时间。这种业务形态下&#xff0c;无…

javaee教程郑阿奇课后答案,三年经验月薪50k我是怎么做到的

个人背景 如标题所示&#xff0c;我的个人背景非常简单&#xff0c;Java开发经验1年半&#xff0c;学历普通&#xff0c;2本本科毕业&#xff0c;毕业后出来就一直在Crud&#xff0c;在公司每天重复的工作对我的技术提升并没有什么帮助&#xff0c;但小镇出来的我也深知自我努…

这一步一步爬的伤痕累累

一、网安专业名词解释 ① CTF CTF&#xff08;Capture The Flag&#xff09;中文一般译作夺旗赛&#xff0c;在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会&#xff0c;以代替之前黑客们通过互相发起真实攻击进…

数据结构-----再谈String,字符串常量池,String对象的创建、intern方法的作用

文章目录 1.字符串常量池1.1. 创建对象的思考2.2. 字符串常量池(StringTable)1.3. 再谈String对象创建1.4. intern方法 1.字符串常量池 1.1. 创建对象的思考 下面两种创建String对象的方式相同吗&#xff1f; public static void main(String[] args) {String s1 "hel…

Jmeter系列(5)线程数到底能设置多大

疑惑 一台设备的线程数到底可以设置多大&#xff1f; 线程数设置 经过一番搜索找到了这样的答案&#xff1a; Linux下&#xff0c;2g的 java内存&#xff0c;1m 的栈空间&#xff0c;最大启动线程数2000线程数建议不超过1000jmeter 能启动多少线程&#xff0c;由你的堆内存…

Decision Transformer

DT个人理解 emmm, 这里的Transformer 就和最近接触到的whisper一样,比起传统Transformer,自己还设计了针对特殊情况的tokens。比如whisper里对SOT,起始时间,语言种类等都指定了特殊tokens去做Decoder的输入和输出。 DT这里的作为输入的Tokens由RL里喜闻乐见的历史数据:…

docker save 命令 docker load 命令 快速复制容器

docker save 命令 docker load 命令 1、docker save 命令2、docker load 命令 1、docker save 命令 docker save 命令用于在系统上把正在使用的某个容器镜像 导出成容器镜像文件保存下载&#xff0c;以便在其他系统上导入这个容器镜像文件 以便快速在其他服务器上启动相同的容…

(正规api接口代发布权限)短视频账号矩阵系统实现开发--技术全自动化saas营销链路生态

短视频账号矩阵系统实现开发--技术全自动化saas营销链路生态源头开发&#xff08;本篇禁止抄袭复刻&#xff09; 一、短视频矩阵系统开发者架构 云罗短视频矩阵系统saas化系统&#xff0c;开发层将在CAP原则基础上使用分布式架构,对此网站的整体架构采用了基于B/S三层架构模式…

使用全局事件总线实现任意组件间的通讯

本文以vue2中爷孙组件通讯为例&#xff0c;需求是点击孙组件的按钮&#xff0c;实现关闭爷组件的弹窗。 全局事件总线是通过Vue实例的事件系统来实现组件之间的通讯&#xff0c;可以方便地在任何组件中进行事件的触发和监听。 以下是使用全局事件总线实现爷孙组件通讯的步骤&a…

33. 【Linux教程】Linux 用户组

前面小节介绍了 Linux 用户相关的增删改查&#xff0c;本小节介绍 Linux 用户组&#xff0c;Linux 系统中采取了一种安全机制&#xff08;即用户组&#xff09;&#xff0c;用户组可以允许多个 Linux 用户共享同一种权限。 1. 用户组介绍 Linux 是多任务多用户的操作系统&…

Vite 构建的 Vue3 项目如何整合 Monaco Editor 代码编辑器

目录 &#x1f981; 一. 前言&#x1f981; 二. 探索过程2.1 安装2.2 配置 Monaco Editor2.3 编写 Monaco Editor 代码编辑器2.3.1 创建 Coding Editor 组件2.3.2 父组件使用 CodingEditor 组件 2.4 效果展示 三. 总结 &#x1f981; 一. 前言 各位好&#xff01;我是&#x1…

什么是智能运维产品线和服务线

智能运维产品线和服务线涵盖了一系列自动化和智能化的技术和服务&#xff0c;旨在提升IT运维的效率和有效性。智能运维&#xff08;AIOps&#xff09;利用大数据、分析技术和机器学习能力来自动执行和简化运营工作流程&#xff0c;包括收集和汇总多源IT基础架构组件的数据、应用…

1、docker 基础命令

1、docker 运行镜像 docker run image tag 2、创建dockerfile&#xff08;构建容器的相关命令&#xff09; vim DockerFile 3、docker 构建容器镜像 docker build -t <image_name> . 4、docker 分层 5、查看镜像 docker images 6、docker 执行 docker run --name &…

【重要公告】BSV区块链协会全新推出“网络访问规则NAR”

​​发表时间&#xff1a;2024年2月15日 BSV区块链协会正式宣布已为BSV区块链推出一套全新的网络访问规则&#xff08;Network Access Rules&#xff0c;以下简称“NAR”&#xff09;。 NAR是一整套规则&#xff0c;用于规范BSV协会与BSV网络节点之间的关系。它基于比特币最初…

2024年怎么选类目?最容易起店的类目推荐,细分类目蕴含机会

大家好&#xff0c;我是电商花花。 做抖音小店选什么类目一直都是我们新手做店的一个大难题。 类目选对了&#xff0c;对于我们店铺就很容易出单&#xff0c;起店&#xff0c;如果选错了&#xff0c;店铺不出单或者没流量也是一个常见的事情。 而选品选类目本身就没有什么捷…

SikuliX使用介绍

1.SikuliX基本介绍 Sikuli 是 2009 年由 Tsung-Hsiang Chang 和 Tom Yeh在麻省理工学院用户界面设计小组的一个开源研究项目。1 年&#xff0c;两人都离开了 Sikuli-X-0.3rc2012 的项目&#xff0c;RaiMan决定接管开发和支持&#xff0c;并将其命名为 SikuliX。 S…

Pyhton的组合数据类型

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 生命对某些人来说是美丽的&#xff0c…