三维重建方法简述

三维重建方法总结

在这里插入图片描述
在三维重建的发展路线中,SFM方法是其中经典的方法,进一步的随着硬件设备的发展当前的主流重建方法主要是基于RGBD相机的重建,因此这里我们主要对基于单目重建的SFM方法和基于RGBD的重建方法进行阐述

一. SFM(struction from Motion)方法

Structure From Motion(SFM) 方法解决的是从多幅二维图像序列中估计三维结构,由于图像之间可能是无序的,而且图像数据量大,数据源广而丰富,针对以上特点,出现了三种SFM策略:增量式、层级式和全局式。
在这里插入图片描述
增量式即先选出两张影像进行初始化,接着一张张图像进行配准及点的三角化;全局式即一次性将所有的影像进行配准与重建;层级式先将影像进行分组,每组进行配准,再对上一步的结果进行配准重建

  • SFM方法流程
  1. 相机标定,获取相机内参
  2. 使用标定好的相机从多个角度拍摄同一场景图片,并按序号保存
  3. 对相邻图像两两计算匹配特征点;一般首先使用两张图像进行重建,计算出一个初始的点云,之后不断添加后续的图像,具体添加哪一张图像的方法是:检查已有的图像中哪一个与已有点云中的点匹配最多,就选哪一张。
  4. 使用3中计算好的对应点对计算基础矩阵F
  5. 通过基础矩阵计算本征矩阵
  6. 通过本征矩阵计算两个视角之间的运动,即R,T;但是由于符号的关系,会解出四种可能的[R|T]矩阵,因此,我们需要将所有的2D的点使用这四种映射分别映射到3D空间中去,看哪一种映射对应的3D点的z深度方向全部是正确的,因此,准确的[R|T]会使得所有的场景点都在相机朝向的正前方
  7. 在计算出[R|T]矩阵后,就可以使用光学三角法对所有的特征点重建了

二. 基于RGBD相机的重建

在这里插入图片描述
基于Fusion类的三维重建大体可以分为两种:一种时对于静态场景的三维重建,以KinectFusion为典型代表,一种是对于动态场景的三维重建,以DynamicFusion为典型代表。建模的话一般分为两种,一种是TSDF模型,一种是面元(Sufel)的表示方法

2.1 TSDF模型

TSDF的算法的思路很朴素::就是用一个大的空间(我们称之为volume)作为要建立的三维模型,这个空间可以完全包括我们的模型,volume由许多个小的体素(我们称之为voxel,就是小立方体)组成,
在这里插入图片描述
每个voxel对应空间中一个点,这个点我们用两个量来评价:

  1. 该voxel到最近的surface(当然我们一开始不知道,我们假设有)(一般称作zero crossing)的距离,我们记作tsdf(x),即带符号距离
  2. 体素更新时的权重,我们记作w。
    在这里插入图片描述
    假设我们真实的面到相机的深度是 d s ds ds,相机采集到的深度 d v dv dv,那么符号距离值就是 d ( x ) = d s − d v d(x) = ds - dv d(x)=dsdv, 当 d ( x ) > 0 d(x)>0 d(x)>0 时说明该体素在真实的面的前面,小于0 ,则说明该体素在真实的面的后面。
    可能你会说,这不是废话嘛,我要是知道真是的面在哪里,还用什么TSDF啊。每一次相机采集出来的数值,我们都认为是最大可能真实面,在相机前后也有可能是真实面,但是概率要小。这个前后距离我们对它进行一定的限制,因为离得特别远的话,其概率也是很小,我们就忽略了。
    在这里插入图片描述
TSDF算法的步骤

TSDF 算法我们分为以下这3部分:

  1. 准备工作
    1.1. 建立长方体包围盒,能够完全包围要重建的物体。
    1.2. 划分网格体素,对包围盒尽心划分n等分,体素的大小取决于包围盒和划分体素的数目决定。我们将整个空间的体素全部存入GPU运算,每个线程处理一条 ( x , y ) (x,y) (x,y)。即对于 ( x , y , z ) (x,y,z) (x,y,z)的晶格坐标,每个GPU进程扫描处理一个 ( x , y ) (x,y) (x,y)坐标下的晶格柱。
    1.3. 对于构造的立体中的每个体素g,转化g为世界坐标系下得三维位置点 p(根据体素的大小,以及体素的数目);

  2. 计算当前帧的TSDF值以及权重
    这一步我们遍历所有的体素,以一个体素在世界坐标系三维位置点p为例
    2.1 由深度数据的相机位姿矩阵,求世界坐标系下点p在相机坐标系下得映射点v,并由相机内参矩阵,反投影v点求深度图像中的对应像素点x,像素点x的深度值为value(x),点v到相机坐标原点的距离为distance(v);
    2.2 那么p的sdf值为 sdf§ = value(x)- distance(v)。现在我们就要引入截断距离了,计算出tsdf§, 公式写出来比较复杂,直接描述就是在截断距离u以内,tsdf§ = sdf§/|u|, 否则,如果sdf§ >0,tsdf§ = 1,sdf§ <0,tsdf§ = -1。
    2.3 权重w§的计算公式:
    w§ = cos(θ)/distance(v),其中θ为投影光线与表面法向量的夹角
    经过我们这一步就算出这一帧的所有体素的tsdf值以及权重值

  3. 当前帧与全局融合结果进行融合
    如果当前帧是第一帧,则第一帧即是融合结果,否则需要当前帧与之前的融合结果在进行融合。 我们命名大写TSDF§为体素p的融合TSDF值,W§为融合权重值,tsdf§为体素p当前帧的TSDF值,w§为当前帧权重值。现在我们要通过tsdf§更新TSDF§。公式如下:
    T S D F ( P ) = W ( p ) T S D F ( p ) + w ( p ) t s d f ( p ) W ( p ) + w ( p ) TSDF(P)=\frac{W(p)TSDF(p)+w(p)tsdf(p)}{W(p)+w(p)} TSDF(P)=W(p)+w(p)W(p)TSDF(p)+w(p)tsdf(p)
    W ( p ) = W ( p ) + w ( p ) W(p)=W(p)+w(p) W(p)=W(p)+w(p)

通过上述公式就可以将新的帧融合进融合帧内。

第一部分完成后,就是每添加一帧深度数据,执行一遍2,3步的计算,知道最后输出结果给Marching Cube计算提出三角面

2.2 Surfel模型

在这里插入图片描述
对于每个点,存储了:
点的位置信息: ( x , y , z ) (x,y,z) (x,y,z)
面片得半径: r r r
法向量: n n n
颜色信息: ( R , G , B ) (R,G,B) (R,G,B)
点的获取时间信息: t t t
在进行点的融合更新时:点的位置信息,法向量,和颜色信息的更新方法类似于 KinectFusion 采用加权融合的方式,面片的半径通过场景表面离相机光心的距离的求得,距离越大,面片的半径越大。

Reference

https://zhuanlan.zhihu.com/p/142168328
https://zhuanlan.zhihu.com/p/78533248
https://www.it610.com/article/1295556522058784768.htm
https://www.jianshu.com/p/462fe75753f7
https://blog.csdn.net/fuxingyin/article/details/51433793

  • 6
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值