为了说明什么是视差我特意画了下面一张图,虚线为辅助线,为了方便理解和计算,其中X为物方坐标,也就是空间中的一个点,Z为深度,f为焦距,对于点X在像平面上成的点分别为 $x$ 与 $x’$如下图:

1. 视差定义与公式

    首先说一下视差的定义,我们所说的视差就是从有一定距离的两个点上观察同一个目标所产生的方向差异,我们在摄影测量的视差图中所指的视差通常指的是左右视差而不是上下视差,左右视差为立体像对上同名像点横座标之差,若两个相机已经校正完成即达到极线平行,两条光轴方向也平行。则视差和物体深度的关系式(1):
$$
\operatorname{dsparity}^{\prime} y=T_1x-T_2x^{\prime}=\frac{B f}{Z} (1)
$$
为了说明式(1)的来历,我们做了一条$OX$的平行线过$O’$则$T_1x=T_2T_3$则根据三角形相似的原理我们可以推导出式(1),在此基础上,假设视差已知,则深度计算为:
$$
Z=\frac{B f}{T_1x-T_2x^{\prime}}=\frac{B f}{d} (2)
$$
其中d为视差值,在成像过程中B与f都是常量,因此深度只与d有关,深度Z与视差d成反比关系,因此可以得出结论:视差越大则深度越小,则物点距离像平面坐标越近

2. 视差计算方法

    视差的计算是计算深度图的一个基础,从openCV中有一些部分是专门进行相机标定和视差计算的,我们把视差计算称为Stereo Matching,由上面描述的视差的定义与公式中可以了解到,视差的计算实际上有一个基础,那就是两张图像的同名点在同一水平线上,即图像的y坐标相同,为了达到以上效果,在视差计算前我们首先进行极线校正,首先通过sift算子解算得到匹配点,进而解算出影像之间的基础矩阵$F$与本质$E$,注意到我们说的两个矩阵,两个矩阵实际上都是与极线相关的,图像上一个点乘以这个点的本质矩阵可以得到这个点在另一张图像上的极线方程,具体介绍可以参考计算机视觉中的多视图几何这本神书,建议阅读英文原版。求出基础矩阵与本质矩阵后就可以进行极线校正,实际上分两种一种是没有经过内定标采用$F$举证进行的校正,另一种是采用$E$矩阵分接出R和T进行的校正在这里不多说。假设图像已经经过极线校正,则图像的y坐标应该相同,那么我们可以进行视差图计算,在视差图计算的过程中比较重要的一点是进行密集匹配,流行的密集匹配方法有BM方法、SGBM方法、GC方法等,在openCV中实现了前两种,因此我们在这里只讨论前两种方法

2.1 BM方法

    BM方法,全称为Block Matching methods,方法说起来比较简单,我们可以通过一张示意图来描述: