三维重建之平面扫描算法(Plane-sweeping)

平面扫描(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 一样也在 其平面上,但是他并不位于任何可见物体的表面上。这样的点很有可能投影到每个可见摄像机上,并不是同样的颜色(图上两个黑点)。
三维重建之平面扫描算法(Plane-sweeping)_第1张图片

单应矩阵(homograph)

知道了基本原理后就是用数学建模。plane-sweeping利用平面与图像对应点的关系,因此采用Homography表述图像点之间的映射。
三维重建之平面扫描算法(Plane-sweeping)_第2张图片
如上图,若平面 m=[nTmd],m=1,2....M ∏ m = [ n m T − d ] , m = 1 , 2.... M ,机投影矩阵为 Pk=Kk[RTkRTkCk],k=1,2...N P k = K k [ R k T − R k T C k ] , k = 1 , 2... N , Kk,R,T K k , R , T 分别是内参、旋转和平移矩阵。参考图像 Pref=Kk[I3×30] P r e f = K k [ I 3 × 3 0 ] ,那么平面上一点在参考图像和图像 Pk P k 的投影点对应关系为: x=HxH x ′ = H x , H 即为Homograph:
这里写图片描述

Cost function

有了点之间的表述关系,接下来就是找到cost function对其优化。由于噪声的影响,不能只利用两点颜色相同,需利用改点的窗口信息一块进行比较因此cost function可以表述为:
三维重建之平面扫描算法(Plane-sweeping)_第3张图片
W W 为以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也有人提问,作者貌似也无能为力。
以上几种算法其实思想相同,下图一目了然。所以三维重建的深度图估计无论实时还是非实时其实主要算法相同。
三维重建之平面扫描算法(Plane-sweeping)_第4张图片
思想搞明白了讲Multiple Sweeping Directions也简单了,无非就是求取平面方程的方法不同。Multiple Sweeping Directions主要是基于房子都是方方正正的假设,如下图(原论文没给图,只好灵魂画图师亲自来了)。
三维重建之平面扫描算法(Plane-sweeping)_第5张图片
首先将从SFM获得的三维点向重力方向投影至与重力正交的平面上,处于同一平面的三维点投影下去再一条直线上,直线间又是垂直关系,因此可以得到下面投影图像(a)。
三维重建之平面扫描算法(Plane-sweeping)_第6张图片
通过最小化信息熵可以得到各平面的方向。得到平面方向只需按不同方向进行basic plane-sweeping即可。
参考文献:

《Real-time Plane-sweeping Stereo with Multiple Sweeping Directions》
《A Space-Sweep Approach to True Multi-Image Matching》,plane sweeping开创性文章
colmap Dense 3D Geometry estimation
《PatchMatch Stereo - Stereo Matching with Slanted Support Windows》
《Accurate Multiple View 3D Reconstruction Using Patch-Based Stereo for Large-Scale Scenes》
《Semantic 3D Modeling from Images with Geometric Priors》
《多视图立体匹配三维重建方法》

你可能感兴趣的:(三维重建)