刚性配准与非刚性配准

前言

“配准”这个词其实应用的场景很多,例如在AR设备上进行定位需要用到的图像配准,需要提前存储图像的特征信息,然后用AR设备的摄像头实时计算图像特征并进行匹配,配准成功后进行跟踪。

本文所说的“配准”,是应用于三维点云或者mesh之中的,在我看过的文献中,“配准”(registration)和“对齐”(alignment)这两个词都用于描述这个意思。

根据物体本身是否发生形变,可以分为刚性配准非刚性配准:刚性配准所有顶点共用一个变换矩阵,非刚性配准则不是。


刚性配准

假设两个点云分别用 source : X = { x 1 , . . . , x m } \text{source}:\mathbf{X}=\{\mathbf{x}_1,...,\mathbf{x}_m\} source:X={x1,...,xm} target : Y = { y 1 , . . . , y n } \text{target}:\mathbf{Y}=\{\mathbf{y}_1,...,\mathbf{y}_n\} target:Y={y1,...,yn} 表示,刚性配准的目标就是要找到最优的刚性变换 T T T,使得 T ( X ) T(\mathbf{X}) T(X) Y \mathbf{Y} Y 尽可能重合。用最优化的形式表述为:
min ⁡ R , t 1 m ∑ i = 1 m ∣ ∣ R x i + t − y ( x i ) ∣ ∣ 2 \min_{\mathbf{R},\mathbf{t}}{\frac{1}{m}\sum_{i=1}^m || \mathbf{R}\mathbf{x}_i+\mathbf{t}-\mathbf{y}(\mathbf{x}_i) ||^2} R,tminm1i=1m∣∣Rxi+ty(xi)2
其中 y ( x i ) \mathbf{y}(\mathbf{x}_i) y(xi) 为target中对应的顶点。

求解这个最优化问题最常用的方法就是迭代最近点算法(Iterative Closest Point, ICP),按照最优化形式分解为两个步骤:

  1. 最近点查找:对于 X \mathbf{X} X 中的每个顶点 x \mathbf{x} x,查找 Y \mathbf{Y} Y 中最近的顶点 y ( x ) \mathbf{y}(\mathbf{x}) y(x) 作为对应点;
  2. SVD求解最优变换:首先各自减去质心 x ^ = x − x ‾ \mathbf{\hat{x}}=\mathbf{x}-\mathbf{\overline{x}} x^=xx y ^ = y ( x ) − y ( x ) ‾ \mathbf{\hat{y}}=\mathbf{y}(\mathbf{x})-\overline{\mathbf{y}(\mathbf{x})} y^=y(x)y(x) ,令 W = ∑ x ^ i y ^ i T \mathbf{W}=\sum{\mathbf{\hat{x}_i}\mathbf{\hat{y}_i}^T} W=x^iy^iT ,然后奇异值分解 W = U D V T \mathbf{W}=\mathbf{U}\mathbf{D}\mathbf{V}^T W=UDVT,则最优变换为 R ∗ = V U T \mathbf{R}^*=\mathbf{V}\mathbf{U}^T R=VUT t ∗ = y ‾ − R ∗ x ‾ \mathbf{t}^*=\mathbf{\overline{y}}-\mathbf{R}^*\mathbf{\overline{x}} t=yRx

最近点查找往往需要耗费很多时间,常见的可以用kd-tree进行加速;在确定顶点对应关系后,最优变换就存在闭合形式的解。ICP算法就是首先确定一个初始解 R 0 , t 0 \mathbf{R}_0,\mathbf{t}_0 R0,t0,然后不断地迭代进行上面两个步骤,直至满足收敛条件。初始解例如可以人为在两个点云上标注4对对应点,然后计算得到,收敛条件可以是变换矩阵的增量小于某个阈值等等。

为了优化ICP算法的效果和速度,还有很多变种,例如:

  • 采样点集进行匹配;
  • 点对进行加权;
  • 拒绝某些特殊点对,例如距离太远的;
  • 点到点的距离,变为点到切平面的距离;

实际上从更根本的角度来看,刚性配准就是最小化一个度量函数
min ⁡ T E ( T ( X ) , Y ) \min_{T}{E(T(\mathbf{X}),\mathbf{Y})} TminE(T(X),Y)
按照我的经验,度量函数 E E E 设置为点云的 chamfer distance,直接进行迭代优化(例如在Pytorch框架下反向传播优化)也能取得不错的配准效果。


非刚性配准

相对于刚性配准,非刚性配准的点云或者mesh是可以产生形变的。变形模板(template, source)用 X = { x 1 , . . . , x m } \mathbf{X}=\{\mathbf{x}_1,...,\mathbf{x}_m\} X={x1,...,xm} 表示,配准目标(target)用 Y = { y 1 , . . . , y n } \mathbf{Y}=\{\mathbf{y}_1,...,\mathbf{y}_n\} Y={y1,...,yn} 表示,变形后的曲面用 X ^ = { x ^ 1 , . . . , x ^ m } \hat{\mathbf{X}}=\{\hat{\mathbf{x}}_1,...,\hat{\mathbf{x}}_m\} X^={x^1,...,x^m} 表示。如果我们用 f Θ ( X ) f_{\Theta}(\mathbf{X}) fΘ(X) 来表示对模板的变形,那么 Θ \Theta Θ 就是我们待优化的参数。一般来说参数量越大,就说明模板变形的自由度越大(一般也配准得越准确),但同时优化难度和开销也越高。

基于“优化”的非刚性配准可以表示如下:
Minimize Θ E ( f Θ ( X ) , Y ) \mathop{\text{Minimize}}\limits_{\Theta} \quad E(f_{\Theta}(\mathbf{X}),\mathbf{Y}) ΘMinimizeE(fΘ(X),Y)
其中 E E E 表示评估两个曲面相似程度的度量函数。

在非刚性配准中,模板会发生形变,因此我们不仅希望变形后模板和目标尽可能对齐,还希望变形后的模板保持一定的形态特点(举个极端例子,模板缩成一个顶点,可能从“对齐”的度量来看是一个最优解),因此往往度量函数会包括正则化的度量。即在非刚性配准中度量函数一般为
E = E align + α E reg E=E_{\text{align}}+\alpha E_{\text{reg}} E=Ealign+αEreg
其中 E align E_{\text{align}} Ealign 是对常见的非刚性配准中“形变场”(deformation field)的度量,常见的形变场的表示方式有:

  • 直接以变形后的顶点坐标 X ^ \hat{\mathbf{X}} X^ 作为优化参数;
  • 每个顶点单独做仿射变换;
  • 采样少部分顶点做仿射变换,其它顶点做采样顶点的加权变换
  • ……

E reg E_{\text{reg}} Ereg 则可以有很多,例如光滑度度量、位置约束、局部形状约束、参数正则化等等。

更多关于非刚性配准的总结,可以参考《A Survey of Non-Rigid 3D Registration》

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

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

相关文章

日期选择器多选换行

<el-form-item label"日期选择"><div class"multi-date-picker"><div class"date-item"><span class"dateIcon"><el-icon><Calendar /></el-icon></span><span class"dateIt…

【ArcGIS Pro二次开发】(58):数据的本地化存储

在做村规工具的过程中&#xff0c;需要设置一些参数&#xff0c;比如说导图的DPI&#xff0c;需要导出的图名等等。 每次导图前都需要设置参数&#xff0c;虽然有默认值&#xff0c;但还是需要不时的修改。 在使用的过程中&#xff0c;可能会有一些常用的参数&#xff0c;希望…

Sentinel 2.0 微服务零信任的探索与实践

作者&#xff1a;涯客、十眠 从古典朴素的安全哲学谈起 网络安全现状 现在最常见的企业网络安全架构便是在企业网络边界处做安全防护&#xff0c;而在企业网络内部不做安全防范。这确实为企业的安全建设省了成本也为企业提供了一定的防护能力。但是这类比于现实情况的一个小…

单通道 6GSPS 16位采样DAC子卡模块--【资料下载】

FMC147是一款单通道6.4GSPS&#xff08;或者配置成2通道3.2GSPS&#xff09;采样率的12位AD采集、单通道6GSPS&#xff08;或配置成2通道3GSPS&#xff09;采样率16位DA输出子卡模块&#xff0c;该板卡为FMC标准&#xff0c;符合VITA57.4规范&#xff0c;该模块可以作为一个理想…

力扣:54. 螺旋矩阵(Python3)

题目&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣 示例&#xff1a; 示例 1&#xff1a; 输入&#xff1a;matrix [[1,…

手机便签内容不见了怎么恢复正常?

在日常生活和工作中&#xff0c;很多人都需要随手记录事情&#xff0c;例如家庭琐事、孩子相关的事情、指定时间需要完成的工作任务、会议安排等。当我们需要随时随地记录事情的时候&#xff0c;手机便签应用就是非常不多的选择&#xff0c;我们直接打开手机上的便签APP就可以新…

安全基础 --- https详解 + 数组(js)

CIA三属性&#xff1a;完整性&#xff08;Confidentiality&#xff09;、保密性&#xff08;Integrity&#xff09;、可用性&#xff08;Availability&#xff09;&#xff0c;也称信息安全三要素。 https 核心技术&#xff1a;用非对称加密传输对称加密的密钥&#xff0c;然后…

【多线程】synchronized 原理

1. 写在前面 本章节主要介绍 synchronized 的一些内部优化机制&#xff0c;这些机制存在的目的呢就是让 synchronized 这把锁更高效更好用&#xff01; 2. 锁升级/锁膨胀 JVM 将 synchronized 锁分为以下四种状态&#xff1a; 无锁&#xff0c;偏向锁&#xff0c;轻量级锁&…

服务器测试之GPU shoc-master测试

精简版指导 lspci | grep -i nvidia lspci -s 4f:00.0 -vvv 适用版本 cuda_11.8.0_520.61.05_linux.run cuda-samples-11.8.tar.gz NVIDIA-Linux-x86_64-525.116.04.run 安装&#xff1a; ./NVIDIA-Linux-x86_64-525.116.04.run 查看是否为一拖八&#xff1a;nvidia-smi topo …

算法通关村第四关——最大栈问题解析

力扣716&#xff0c;设计一个最大栈数据结构&#xff0c;既支持栈操作&#xff0c;又支持查找栈中最大元素。 分析&#xff1a; 在最大栈的问题上&#xff0c;除了实现普通栈拥有的方法pop、push、top外&#xff0c;还需要实现getMax方法来找到当前栈里的最大值。为了在最短事件…

js 正则表达式配合replace进行过滤html字符串遇到的性能问题

问题场景复现&#xff1a; 博主要实现一个邮箱列表&#xff0c;其中列表中的每一封邮件都有一个摘要&#xff0c;但是摘要是要自己从后端提供的content内容区自己过滤掉所有&#xff0c;只留下纯文本内容的前面几行作为摘要。 性能问题 当我测试到一个邮箱&#xff0c;其中的…

【CSS】说说对BFC的理解

目录 一、概念 二、BFC的布局规则 三、设置BFC的常用方式 四、BFC的应用场景 1、解决浮动元素令父元素高度坍塌的问题 2、解决非浮动元素被浮动元素覆盖问题 3、解决外边距垂直方向重合的问题 五、总结 一、概念 我们在页面布局的时候&#xff0c;经常出现以下情况&am…

【java】基础——封装

封装是对类提供的方法实现对隐藏信息的操作和访问&#xff0c;但留出了访问的借口&#xff0c;以提高类的信息安全性&#xff1b;包&#xff1a;package 包名; 必须放在源文件的第一行&#xff1b;一个java源文件只能有一个package语句&#xff1b;包名全英文小写&#xff1b;命…

网络安全进阶学习第十二课——SQL手工注入3(Access数据库)

文章目录 注入流程&#xff1a;1、判断数据库类型2、判断表名3、判断列名4、判断列数1&#xff09;判断显示位 5、判断数据长度6、爆破数据内容 注入流程&#xff1a; 判断数据库类型 ——> 判断表名 ——> 判断列名 ——> 判断列名长度 ——> 查出数据。 asp的网…

数池塘(四方向,八方向)深搜

题面 题目描述 农夫约翰的农场可以表示成 NM个方格组成的矩形。由于近日的降雨&#xff0c;在约翰农场上的不同地方形成了池塘。每一个方格或者有积水&#xff08;W&#xff09;或者没有积水&#xff08;.&#xff09;。 农夫约翰打算数出他的农场上共形成了多少池塘。一个池塘…

商用服务机器人公司【Richtech Robotics】申请纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国内华达州拉斯维加斯由华人领导的商用服务机器人公司【Richtech Robotics】近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&am…

Linux的shell脚本常用命令

1、前提 使用shell脚本可以将所要执行的命令行进行汇总&#xff0c;统一执行&#xff0c;制作为脚本工具&#xff0c;简化重复性工作 1.1、常用命令 1.1.1、启动命令 假设我们拥有一个halloWord.sh的脚本&#xff0c;通过cd 命令进入相对应的目录下 ./halloWord.sh1.1.2、…

SpringBoot 依赖管理和自动配置---带你了解什么是版本仲裁

&#x1f600;前言 本篇博文是关于SpringBoot 依赖管理和自动配置&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您…

linux epoll介绍与代码演示

在Linux系统中,epoll和poll是两种I/O多路复用技术,它们可以让单个线程处理多个I/O事件。 poll是一种比较早的技术,它的工作方式是轮询所有的文件描述符,看哪些文件描述符准备好了I/O操作。这种方式的缺点是,当文件描述符的数量很大时,轮询的开销会很大。 epoll是为了解…

一个Python程序引发的思考

import disdef add(a, b):result a b 2 3return resultdis.dis(add)# dis.opname 是一个列表&#xff0c;它按字节码值的顺序列出了所有的操作名。 print(dis.opname)# dis.opmap 是一个字典&#xff0c;其键是操作名&#xff0c;值是对应的字节码值。 print(dis.opmap)# 列…