根据相机的小孔成像模型可知,2D图像上的一个像素点经过反投影只能确定三维空间中的一条射线,无法得到三维空间该点的具体深度值。
在两个不同姿态的相机内外参已知的前提下,根据对P点拍摄两张不同角度的图像,根据两幅图像中的一对同名点,可以确定两条射线,两条射线的焦点就是P点在世界坐标系下的位置,称此过程为双目交汇,寻找同名点的过程为双目立体匹配。
三角化原理:
得到多对同名点的前提下,计算左右图像对的视差图,基于三角化的原理恢复物体的三维信息。
由对极几何模型可知
z = T f d d = x l − x r (1) z=\frac{Tf}{d}\;\;\;\;\;\;\;\;\;d=x^{l}-x^{r}\tag1 z=dTfd=xl−xr(1)
在相机标定完成,得到左右相机的内外参数之后,需要搜索同名点,如果采用暴力查找的方式,左图中的某一像素点点要遍历右图所有像素点,算法效率低。为此,利用极线约束来提高同名点搜索的算法效率。
为了进一步提升算法效率,便于计算图像对的视差,使用仿射变换对左右视图进行极线校正,使得左右相机的x轴与基线平行,相机光轴与基线垂直,同时左右相机具有相同的焦距。
1.不同视角下颜色、亮度差异和噪声
2.物体表面反光
3.物体表面为弱纹理表面
6.透明物体
7.物体表面遮挡和深度不连续
8.重复纹理区域
立体匹配算法一直是计算机视觉领域的核心问题之一,双目立体匹配一般基于朗伯面假设和局部表面光滑假设,其主要分为:
代价函数用于计算左、右图像两个像素之间的匹配代价(cost),cost越大,表示这两个点成为同名点的可能性越低,通过代价计算可以得到一个代价体。
常见的代价计算算法如下:
1.AD/BT
Absolute intensity difference C A D ( x , y , d ) = ∣ I L ( x , y ) − I R ( x − d , y ) ∣ (2) C_{AD}(x,y,d)=|I_{L}(x,y)-I_{R}(x-d, y)|\tag2 CAD(x,y,d)=∣IL(x,y)−IR(x−d,y)∣(2)
2.AD+Grandient ρ ( q , q ′ ) = ( 1 − α ) m i n ( ∣ ∣ I q − I q ′ ∣ ∣ , τ c o l ) + α m i n ( ∣ ∣ ▽ I q − ▽ I q ′ ∣ ∣ , τ g r a d ) (3) \rho(q, q^{'})=(1-\alpha)min(||I_{q}-I_{q^{'}}||, \tau_{col})+\alpha min(||\bigtriangledown I_{q}-\bigtriangledown I_{q^{'}}||, \tau_{grad})\tag3 ρ(q,q′)=(1−α)min(∣∣Iq−Iq′∣∣,τcol)+αmin(∣∣▽Iq−▽Iq′∣∣,τgrad)(3)
其中, τ c o l 、 τ g r a d \tau_{col}、\tau_{grad} τcol、τgrad为截断阈值, α \alpha α为权重,同时考虑两点间的像素差和梯度差。
3.Census
分别计算该点和八邻域之间的大小关系,得到的编码进行亦或,最后计算汉明距离得到Census代价。
4.NCC:normalized cross-correlation(归一化互相关)
C N C C ( x ′ , y ′ , d ) = ∑ ( x , y ) ∈ W ( x ′ , y ′ ) ( I L ( x , y ) − u ˉ L ) ( I R ( x − d , y ) − u ˉ R ) ∑ ( x , y ) ∈ W ( x ′ , y ′ ) ( I L ( x , y ) − u ˉ L ) 2 ∑ ( x , y ) ∈ W ( x ′ , y ′ ) ( I R ( x − d , y ) − u ˉ R ) 2 (4) C_{N C C}\left(x^{\prime}, y^{\prime}, d\right)=\frac{\sum \limits_{(x, y) \in W\left(x^{\prime}, y^{\prime}\right)}\left(I_{L}(x, y)-\bar{u}_{L}\right)\left(I_{R}(x-d, y)-\bar{u}_{R}\right)}{\sqrt{\sum \limits_{(x,y)\in W(x^{\prime}, y^{\prime})}\left(I_{L}(x, y)-\bar{u}_{L}\right)^{2}} \sqrt{\sum \limits_{(x, y) \in W\left(x^{\prime}, y^{\prime}\right)}\left(I_{R}(x-d, y)-\bar{u}_{R}\right)^{2}}} \tag4 CNCC(x′,y′,d)=(x,y)∈W(x′,y′)∑(IL(x,y)−uˉL)2(x,y)∈W(x′,y′)∑(IR(x−d,y)−uˉR)2(x,y)∈W(x′,y′)∑(IL(x,y)−uˉL)(IR(x−d,y)−uˉR)(4)
将两个窗口展开为向量,分别减去均值、归一化为模长为1的向量,再求内积,求出的代价值对图像的亮度的线性变化具有不变性,且表示两个向量夹角的余弦值。5. AD+Census
对AD和Census加权得到代价值,结合AD对局部细节敏感和Census对光照鲁棒性的特点。
C A D ( p , d ) = ∑ i = R , G , B ∣ I i l e f t ( p ) − I i r i g h t ( p − ( d , 0 ) ) ∣ 3 C I ( p , d ) = 1 − exp ( − C A D ( p , d ) λ A D ) + 1 − exp ( − C census ( p , d ) λ Census ) C ( p , d ) = α ∗ C A D ( p , d ) + ( 1 − α ) C I ( p , d ) (5) \begin{array}{c} C_{A D}(\boldsymbol{p}, d)=\frac{\sum \limits_{i=R, G, B}\left|I_{i}^{l e f t}(\boldsymbol{p})-I_{i}^{r i g h t}(\boldsymbol{p}-(d, 0))\right|}{3} \\\;\\ C_{I}(\boldsymbol{p}, d)=1-\exp \left(-\frac{C_{A D}(\boldsymbol{p}, d)}{\lambda_{A D}}\right)+1-\exp \left(-\frac{C_{\text {census }}(\boldsymbol{p}, d)}{\lambda_{\text {Census }}}\right)\\\;\\C(\boldsymbol{p}, d) = \alpha*C_{A D}(\boldsymbol{p}, d)+(1-\alpha)C_{I}(\boldsymbol{p}, d) \end{array}\tag5 CAD(p,d)=3i=R,G,B∑∣Iileft(p)−Iiright(p−(d,0))∣CI(p,d)=1−exp(−λADCAD(p,d))+1−exp(−λCensus Ccensus (p,d))C(p,d)=α∗CAD(p,d)+(1−α)CI(p,d)(5)
6.CNN
使用CNN来计算左右视图的代价体
基于局部窗口的代价聚合方法通过将支撑区域内的代价求和或求平均进行代价聚合,支撑区域可以分为在固定视差平面的支撑区域(平行窗口)或在三维空间中的支撑域(倾斜窗口)。
常用的代价聚合方法
基于p点构建滑动窗口时,确定上下左右四点的十字骨架,由像素相似性来确定骨架长度,骨架满足尽可能长,且骨架内的像素和p点的像素差值不超过设定的阈值。同理,由p沿着竖向骨架遍历q点产生横臂,得到自适应窗口的支撑区域(support region)。
左右视图都计算自适应支撑区域,在用1D的积分图进行加速聚合运算。
(1)水平方向计算积分图HI
(2)基于HI计算每个像素点横臂的聚合代价
(3)计算纵向积分图VI
(4)对于某个十字臂区域用积分图VI计算
优化后的代价体,取d方向上的最小值作为最后的值。
(4)视差后处理
在局部算法中,代价计算和代价聚合是重点,视差计算是相对简单的,直接使用WTA算法逐个像素选择代价最小的视差值作为最优的视差值。如SGM算法使用了WTA来从聚合代价体S中得到视差图。
全局算法一般没有代价聚合步骤,主要的工作都在视差计算步骤。许多全局算法都建立了全图能量函数,通过最小化全局能量函数来找到最优的视差图d,如下式所示:
E ( d ) = E data ( d ) + λ E smooth ( d ) (13) E(d)=E_{\text {data }}(d)+\lambda E_{\text {smooth }}(d)\tag{13} E(d)=Edata (d)+λEsmooth (d)(13)
数据项衡量左右视图的在视差图d下的整体匹配代价,也就是视差图d的准确性:
E d a t a ( d ) = ∑ ( x , y ) C ( x , y , d ( x , y ) ) (14) E_{d a t a}(d)=\sum_{(x, y)} C(x, y, d(x, y))\tag{14} Edata(d)=(x,y)∑C(x,y,d(x,y))(14)
平滑项是基于局部平滑性假设,让视差图更加平滑, 为了使优化的效率更高,平滑项通常仅限于测量相邻像素之间的差异, ρ \rho ρ是视差的单调递增函数:
E smooth ( d ) = ∑ ( x , y ) ρ ( d ( x , y ) − d ( x + 1 , y ) ) + ρ ( d ( x , y ) − d ( x , y + 1 ) ) (15) E_{\text {smooth }}(d)=\sum_{(x, y)} \rho(d(x, y)-d(x+1, y))+\rho(d(x, y)-d(x, y+1))\tag{15} Esmooth (d)=(x,y)∑ρ(d(x,y)−d(x+1,y))+ρ(d(x,y)−d(x,y+1))(15)
平滑项也可以用另外一种表达式表达:
ρ d ( d ( x , y ) − d ( x + 1 , y ) ) ⋅ ρ I ( ∥ I ( x , y ) − I ( x + 1 , y ) ∥ ) (16) \rho_{d}(d(x, y)-d(x+1, y)) \cdot \rho_{I}(\|I(x, y)-I(x+1, y)\|)\tag{16} ρd(d(x,y)−d(x+1,y))⋅ρI(∥I(x,y)−I(x+1,y)∥)(16)
同时考虑了相邻像素的视差差异和颜色差异,使得视差计算的结果更加鲁棒。
定义了全局能量函数之后,可以使用多种方法来优化能量函数,使得能量函数最小化,常用的优化方法包括:正则化、马尔可夫随机场、模拟退火算法、图割法等。
全局能量函数最小化问题是个二维NP-hard问题,利用动态规划线扫描算法可以在多项式时间内找到全局的近似最优解,这些方法的原理是通过两个对应扫描线之间所有成对匹配代价矩阵来计算最小代价路径。算法详细信息如Semi Global Matching所示。
基本思想:对于许多场景,很多区域可以近似用同一个平面来建模。
为了找到每个区域的平面参数,对每个像素赋予一个随机的平面参数(随机初始化)。希望每个区域至少有一个像素的初始平面是接近真实平面的。通过传播算法把正确的平面参数传递给这个区域的其他像素。
初始化:对于像素点 ( x 0 , y 0 ) (x_{0}, y_{0}) (x0,y0),在视差范围内随机选择一个深度 z 0 z_{0} z0;随机选择一个法向量 ( n x , n y , n z ) (n_{x}, n_{y}, n_{z}) (nx,ny,nz)。转化为平面的表达方式:
1.左右一致性检测(LRC)
左视图的A点能匹配到右视图的B点,从B视图的B点也能匹配到左视图的A点
2.the minimum/ the second minimum cost(最小和次小有一定的差距)
每个像素计算最小代价和次最小代价的值,若两者相对差小于一定阈值,则被剔除。
3.Speckle Filter
为了移除噪声,对视差图进行连通区域提取(相邻像素的视差值小于阈值说明两个区域属于同一个区域),去除小的连通区域。
4.亚像素插值
在d处,与d的左右两个像素拟合二次曲线,求局部的亚像素最小值作为局部最优值,称之为二次曲线内插法。
5. 中值滤波
6. 空洞填充
7. 加权中值滤波
- Disp-Net (A Large Dataset to Train Convolutional Networks for Disparity, Optical Flow, and Scene Flow Estimation)-2016
- GC-Net (End-to-End Learning of Geometry and Context for Deep Stereo Regression)-2017
- PSM-NET (Pyramid Stereo Matching Network)-2018
- Stereo-Net (StereoNet: Guided Hierarchical Refinement for Real-Time Edge-Aware Depth Prediction)-2019
- GA-Net (GA-Net: Guided Aggregation Net for End-to-end Stereo Matching)-2019
- EdgeStereo (EdgeStereo:A Context Integrated Residual Pyramid Network for Stereo Matching)-2020