Plane-sweeping

平面扫描算法的输入数据是一系列经过校准的照片以及拍摄相机所对应的投影矩阵,该算法假设场景中所有物体只有漫反射。用户可以在真实相机周围放置一个虚拟的相机 cam x,同时定义一个近平面和一个远平面,且必须保证物体位于两个平面之间,之后在近平面和远平面之间的空间可以被一系列密集的平行平面划分。 

](/home/ustcxt/图片/1.png ![

  如果平行平面足够的密集,那么物体表面上的任意一点p一定位于某一平面Di处,同时,所有可以看到点p的相机看到点p必定是同一个颜色,假设与点p在同一平面上的另一点p’,从图中可以看出,其并不位于物体表面,因此,投影到每个相机上可能呈现出不同的颜色,故平面扫描算法有如下假设:

对于平面上任意一点p,其如果投影到每个相机上的颜色均相同,那么可以说这个点很大概率是物体表面上的点

  对于平行平面Di上的每一个点p,将其投影到所有相机上,之后根据投影的颜色进行匹配计算,计算出点p所对应的分数,以及其所对应的深度,p所对应的分数越高,代表其投影在各个相机上的颜色越相近。

  点p在计算之后,会被投影到虚拟相机 cam x 上,可以选择从后向前的扫描方式进行扫描,如果对于某一平面Dj上的某一点q,将其投影到cam x后,发现所得分数高于之前该点的分数,那么便更新该点的分数和深度值。直到所有平面扫描结束,即可得到最终cam x 对应图像的深度图。

平面扫描(plane-sweeping)介绍:

plane-sweeping算法在三维重建中非常重要,其特别适合并行计算,因此通过GPU加速后可以使复杂的稠密重建达到实时。大多实时三维重建的深度图生成部分采用plane-sweeping算法。而且plane-sweeping不用rectify,甚至radial distortion的图像也可以用。研究semantic 3D的Christian Hane直接利用鱼眼相机的图像planes-weeping也得到很好的效果。可以说plane-sweeping和patch-match为三维重建实时和非实时深度图估计的主要算法。 
最初由《Multi-resolution real-time stereo on commodity graphics hardware》提出,后由《Real-time Plane-sweeping Stereo with Multiple Sweeping Directions》添加多面扫面用在实时三维重建中。本文也主要参考这两篇文章。

算法描述:

1、basic plane-sweeping algorithm

基本原理

如下图平面扫面算法将深度范围内分为一个个平面,深度范围可以由很多方法获得。如果平行平面足够密集,空间被分割的足够细,那么,空间物体表面上的一点M 一定位于众多平行平面中的其中一个平面 上,同时,所有能可以看到 M 的摄机看点 M 必然看到的是同一个颜色,也就是物体在点 M 本来的颜色。假设现在又有另一个点 M’,这个点也在一个平面上,假定如同 M 一样也在 其平面上,但是他并不位于任何可见物体的表面上。这样的点很有可能投影到每个可见摄像机上,并不是同样的颜色(图上两个黑点)。 
这里写图片描述

单应矩阵(homograph)

知道了基本原理后就是用数学建模。plane-sweeping利用平面与图像对应点的关系,因此采用Homography表述图像点之间的映射。 
Homograph 
如上图,若平面∏m=[nTm−d],m=1,2....M∏m=[nmT−d],m=1,2....M,机投影矩阵为Pk=Kk[RTk−RTkCk],k=1,2...NPk=Kk[RkT−RkTCk],k=1,2...N,Kk,R,TKk,R,T 分别是内参、旋转和平移矩阵。参考图像Pref=Kk[I3×30]Pref=Kk[I3×30],那么平面上一点在参考图像和图像 PkPk 的投影点对应关系为:x′=Hx,Hx′=Hx,H 即为Homograph: 
这里写图片描述

Cost function

有了点之间的表述关系,接下来就是找到cost function对其优化。由于噪声的影响,不能只利用两点颜色相同,需利用改点的窗口信息一块进行比较因此cost function可以表述为: 
这里写图片描述 
WW为以x,y为中心的窗口,$\beta为增益因子,计算光照变化后转换为增益因子。 
当然更具鲁棒的聚合方法也可以用来生成cost,如:ZNCC等。在得到了cost function后只需计算个点最小值即为对应的平面: 
这里写图片描述 
有了对应平面该点的深度如下计算: 
这里写图片描述

2、Multiple Sweeping Directions

由于采用基于窗口的匹配方法,而窗口内像素与中心像素极有可能不在一个平面,因此利用上述方法会干扰中心像素的匹配。 
这里也提一下《PatchMatch Stereo - Stereo Matching with Slanted Support Windows》这篇论文,这篇在patch match方法中比较出名。同样解决原来基于窗口的匹配方法具有不连续性(大多呈阶梯状),这篇论文抛弃以前思想,用photo consistency直接估计窗口内平面方程,有了平面方程直接带入该点坐标即是深度值。后来北京自动化所的申抒含将其引入3d重建中《Accurate Multiple View 3D Reconstruction Using Patch-Based Stereo for Large-Scale Scenes》,该篇论文深度图估计大体基于上篇,针对大规模三维重建做了修改,如:将平面法向量用球坐标表示,图像间的像素映射用homograph表示。由于不像双目只有两幅图像,3d重建中可以利用多图像进行深度图融合,所以对上篇论文的深度估计做了三个简化,以减小估计深度图的时间。openmvs深度图估计便是用的这篇论文方法,效果非常好。《Tanks and Temples: Benchmarking Large-Scale Scene Reconstruction》这个数据集对现有的三维重建开源算法做了比较,目测openmvs比后起之秀colmap效果要好。但我在利用openmvs重建时,图片过多总会出现错误,github也有人提问,作者貌似也无能为力。 
以上几种算法其实思想相同,下图一目了然。所以三维重建的深度图估计无论实时还是非实时其实主要算法相同。 
这里写图片描述 
思想搞明白了讲Multiple Sweeping Directions也简单了,无非就是求取平面方程的方法不同。Multiple Sweeping Directions主要是基于房子都是方方正正的假设,如下图(原论文没给图,只好灵魂画图师亲自来了)。 
这里写图片描述 
首先将从SFM获得的三维点向重力方向投影至与重力正交的平面上,处于同一平面的三维点投影下去再一条直线上,直线间又是垂直关系,因此可以得到下面投影图像(a)。 
这里写图片描述 
通过最小化信息熵可以得到各平面的方向。得到平面方向只需按不同方向进行basic plane-sweeping即可。 

猜你喜欢

转载自blog.csdn.net/qq_40213457/article/details/82153135