概述

立体视觉(Stereo Vision)是计算机视觉技术的一个重要模块。当看到一个物体的时候,人类的视觉系统不仅可以识别出这个物体是什么,而且还能估计出这个物体是离我们比较近还是比较远的。那我们赋予机器人视觉系统时,除了能够识别物体外,同样的要能够判断出障碍物距离有多远。人类时靠双眼来估计距离的,因此一句话总结以下立体视觉:立体视觉是一种计算机视觉技术,其目的是从两幅或两幅以上的图像中推理出图像中每个像素点的深度信息。(这里的深度指物体距离相机的距离)

简单的说明就是,通过两张(或多张)图像,拍摄同一物体,得到物体距离摄像头的深度(距离)

原理

1.1 单目系统

单目系统中只有一个相机,如下图所示,O点为相机的光心,π是摄像头的成像平面(注意:实际的成像平面在相机光心的后面,这里画在光心和物体之间方便展示和理解,一般这个称为虚拟成像平面)。

从图中可以看出,如果P点与Q点在同一条直线上,那么他们在图像上的成像点就是同一个点,也就是p=q ,那么也就看不出来他们在距离上的差异(也就无法知道Q在前还是P在前)
立体视觉初探_基线

1.2 双目系统

为了改善单目系统的上述缺陷,双目系统中存在两个相机,从而形成一个立体系统,如下图所示。两个相机拍摄同一场景,如果我们可以从拍摄出的两幅图像中找到对应点,就可以模拟人眼的视差原理计算出物体的深度(距离)。

从图中可以很明显的看出,在增加了一个摄像头之后,P与Q在目标面T上的成像不在位于同一个点,而是有自己分别的成像点,也就是p′和q′ 。
立体视觉初探_立体视觉_02
立体视觉初探_深度计算_03

1.3 视差和深度计算原理

有了上述的双目系统后,接下来就是通过参考面和目标面计算深度。先看下双目系统中的一些定义,下图中O1,O2是两个相机的光心,I1,I2是对应的成像平面,p1,p2是物体P在两个相机中的成像点,有下面一些常见定义:

  • 极平面:O1,O2,P三个点确定的平面;
  • 极点:O1O2连线与像平面I1,I2的交点e1、e2;
  • 基线(baseline):O1O2
  • 极线:极平面与两个像平面之间的交线l1、l2。
    立体视觉初探_立体视觉_04
    简化上面的双目系统,确保两个摄像头的参数是完全一致的,并且两者的位置是平行,让两个成像平面保持水平,如下图所示,我们假设 P为空间中的一点,OR为左边摄像头的光心,OT为右边摄像头的光心,摄像头的焦距为f(光心到成像平面的距离),成像平面在图中用粉色线表示, OROT表示两个摄像头光心之间的距离,也称为基线,P在左右两个摄像机成像平面上的成像点分别为p与p′ , XR与 XT为成像点的水平方向的距离(通常我们得到的是像素坐标系下的 x坐标,其单位为像素,因此需要转换为实际的物理长度,涉及到坐标系的转换问题),Z就是我们需要求的深度。
    立体视觉初探_javascript_05

从上图中可以找到一组相似三角形△Ppp′∼△PQrQt,根据三角形相似定理,可以得到:
立体视觉初探_深度计算_06
上式中的D就是我们通常所说的视差(disparity ),即同一个物体在两幅图像上的像素值差异。(注意:上述表达式中B,f的值为物理单位,D的值为像素单位,实际计算时要将像素单位转化为物理单位后再计算)

  1. 两个相平面不平行怎么办?

上面推导中我们假设了两个平行的相平面,这是由于双目系统实际安装时都会进行校准,保证两个相机参数完全一致,让相平面尽量平行。如果的确相平面不平行,根据相机转动角度,是可以得到这个倾斜角的,根据角度将倾斜相平面投影到水平,再进行计算

总结

因此通过两个摄像头,得到图像的深度信息,需要进行
1、两个相机的外参标定,得到RT矩阵。得到B
2、标定各自相机的内参,从相机坐标系转换到图像坐标系。得到 f
3、求出同一物体的像素坐标,计算出视差。