基于MVS的三维重建算法学习笔记(三)— 立体匹配概述

基于MVS的三维重建算法学习笔记(三)— 立体匹配概述

  • 声明
  • 立体匹配
    • 立体视觉系统概述
      • 1. 相机标定
      • 2. 极线矫正
      • 3. 立体匹配
      • 4. 三角测量
    • 立体匹配基本流程
    • 基本思路
    • 方法分类
  • 参考文献和资料

声明

本人书写本系列博客目的是为了记录我学习三维重建领域相关知识的过程和心得,不涉及任何商业意图,欢迎互相交流,批评指正。

立体匹配

在之前的博客中简单介绍过立体匹配,它是MVS稠密重建中的重要环节,而在这篇博客中,将详细的介绍立体匹配的相关概念,其中详细的过程和原理参考教程:70. 三维重建5-立体匹配1,立体匹配算法总体理解,该作者对意大利Bologna大学的Stefano Mattoccia教授在2012年编写的"Stereo vision: algorithms and applications"做了详细且透彻的解读。

立体视觉系统概述

基于MVS的三维重建算法学习笔记(三)— 立体匹配概述_第1张图片
在上一文中介绍了许多立体视觉相关的基础知识,将每一部分进行整合运用,就能够建立起完整的立体视觉系统,其中包括相机标定、极线矫正、立体匹配、三角测量,最终得到场景或者物体的深度信息:

1. 相机标定

基于MVS的三维重建算法学习笔记(三)— 立体匹配概述_第2张图片

相机标定的目的是获得两个相机的内参(焦距、图像中心、畸变参数等)以及外参(世界坐标系与相机坐标系之间的变换矩阵R和T),之后对图像进行校准,处理并获取图像的立体点对;

2. 极线矫正

基于MVS的三维重建算法学习笔记(三)— 立体匹配概述_第3张图片
接下来,利用校准得到的图像点对信息进行极线矫正,目的是消除镜头畸变,并且将立体点对转华为标准形式。(对应点对依据对极约束理论被限制两图像极线所形成的平面上,并且通过极线矫正进而将对应点的二维搜索空间缩小到了一维)
基于MVS的三维重建算法学习笔记(三)— 立体匹配概述_第4张图片
当做到这一点后,就可以很方便的在水平方向搜索一个图像上的一点在另外一个图像上的对应点。如上图所示,左图上的一点p在右图上的对应点是p’,视差 d = x R − x T d=x_R-x_T d=xRxT,而b是两个相机光心的距离, f是焦距。

3. 立体匹配

旨在寻找目标图像在原图相中的对应点,而找到对应点后,求取空间点和相机之间距离的关键就变成了求取其投影点视差了。而整个图像上所有点的视差构成了一幅图像,这个图像叫做视差图;而通过校正后的一对图像获取到视差图的过程,叫做立体匹配;立体匹配属于立体视觉以及MVS稠密重建的重要部分,将在下面详细讨论;

4. 三角测量

如上图所示,根据相似三角形的计算,很容易可以得到物体距离相机观测点的距离(或深度): b Z = ( b + x T ) − x R Z − f → Z = b ⋅ f x R − x T = b ⋅ f d \frac{b}{Z}=\frac{(b+x_T)-x_R}{Z-f} \rightarrow Z=\frac{b·f}{x_R-x_T}=\frac{b·f}{d} Zb=Zf(b+xT)xRZ=xRxTbf=dbf
而给定视差图(立体匹配得到)、基线和焦距(校准后),三角测量就可以计算三维空间中点对应的位置,从而得到深度图。
基于MVS的三维重建算法学习笔记(三)— 立体匹配概述_第5张图片

立体匹配基本流程

若想要求得两个已校正的图像间的视差图,即转换为给定源图像上一点,在目标图像中的同一行约束范围 d m a x d_{max} dmax内搜索与源图像匹配的对应点,如下图1所示;设匹配代价为 ∣ I R ( x , y ) − I T ( x + d , y ) ∣ |I_R(x,y)-I_T(x+d,y)| IR(x,y)IT(x+d,y),那么目标图像中所有待定像素的匹配代价如下图2所示;WTA(Winner Takes All,赢者通吃)是一种搜索策略,即从所有候选像素中挑选匹配代价最低的最为对应点;
基于MVS的三维重建算法学习笔记(三)— 立体匹配概述_第6张图片
基于MVS的三维重建算法学习笔记(三)— 立体匹配概述_第7张图片
但是由于噪声和距离等因素的影响,通过最基础的方法并不能得到理想的视差结果,这就引出了立体匹配优化视差结果的基本思路——图像预处理、匹配代价计算、代价聚合、视差优化、视察细化;
基于MVS的三维重建算法学习笔记(三)— 立体匹配概述_第8张图片

基本思路

该部分@Wang Hawk也对"Stereo vision: algorithms and applications"进行了详细的解读,具体分为以下几个模块:
71. 三维重建6-立体匹配2,立体匹配中的代价聚合
72. 三维重建7-立体匹配3,立体匹配算法中的视差优化
73. 三维重建8-立体匹配4,利用视差后处理完善结果

  1. 图像预处理(Pro-processing):若两幅图像的亮度、噪声不一致,一般会先对图像做预处理,使得两幅图像的整体质量区域一致;
  2. 匹配代价计算(Cost Computation):衡量待匹配像素与候选像素之间的相关性。两个像素无论是否为同名点,都可以通过匹配代价函数计算匹配代价,代价越小则说明相关性越大,是同名点的概率也越大。
  3. 局部代价聚合(Cost aggregation):通过对代价立方体中同一视差的代价进行某种程度的聚合,来减少或消除错误代价的影响;
  4. 全局视差优化(Disparity optimization):通过最优化某个能量函数 E ( d ) = E d a t a ( d ) + E s m o o t h ( d ) E(d)=E_{data}(d)+E_{smooth}(d) E(d)=Edata(d)+Esmooth(d),寻找到每个像素的最优视差结果,使得全局的、整体的匹配代价最小;
  5. 视差细化/后处理(Disparity refinement):根据前面的步骤最终将输出一张视差图,然而即便是在上面那些受约束的场景,得到的视差图依然不是完美的,还是有很多错误。因此,还需要一个细化的步骤,来消除其中的错误,得到更准确的视差图;

方法分类

关于立体匹配的策略,一般存在几种不同(不是互相排斥)的类别:

  1. 局部匹配算法:1+2+WTA(Winner Takes All,赢家通吃)——使用简单的WTA视差选择策略,并且通过在支持窗口(support window)上聚合匹配代价来减少模糊(ambiguity);
  2. 全局匹配算法:1+(可选2)+3——使用基于像素的匹配代价,通过最优化某个能量函数 E ( d ) = E d a t a ( d ) + E s m o o t h ( d ) E(d)=E_{data}(d)+E_{smooth}(d) E(d)=Edata(d)+Esmooth(d),寻找到每个像素的最优视差结果;
  3. 半全局匹配算法:1+2+3,例如SGM;

参考文献和资料

[1]70. 三维重建5-立体匹配1,立体匹配算法总体理解
[2]“Stereo vision: algorithms and applications”

你可能感兴趣的:(算法,学习,计算机视觉)