双目深度估计使用两个camera,通过双目矫正把问题从深度估计转化到特征点匹配、视差计算的问题,这样的转换将学习目标从深度变成了视差,这样做是因为视差相对于深度来说更直观一些。
双目校正是根据摄像头定标后获得的单目内参数据(焦距、成像原点、畸变系数)和双目相对位置关系(旋转矩阵和平移向量),分别对左右视图进行消除畸变和行对准,使得左右视图的成像原点坐标一致。
视差图是同一个场景在两个相机下成像的像素的位置偏差,下图中的即是视差。P是待测物体上的某一点,OR与OT分别是两个相机的光心,点P在两个相机感光器上的成像点分别为P和P’(相机的成像平面经过旋转后放在了镜头前方),f为相机焦距,B为两相机中心距,Z为我们想求得的深度信息。
公式中,焦距f和摄像头中心距B可通过标定得到,因此,只要获得了视差,就可以计算出深度Z
双目测距主要是利用了目标点在左右两幅视图上成像的视差与目标点到成像平面的距离Z存在着反比例的关系:Z=fB/d 。
在OpenCV中,f的量纲是像素点,d的量纲也是像素点, B的量纲由定标板棋盘格的实际尺寸和用户输入值确定,一般是以毫米为单位。因此分子分母约去,Z的量纲与B相同。
假设目标点在左视图中的坐标为(x,y),在左右视图上形成的视差为d,目标点在以左摄像头光心为原点的世界坐标系中的坐标为(X,Y,Z),则存在上图所示的变换矩阵Q,使得 Q*[x y d 1]’ = [X Y Z W]’。为了精确地求得某个点在三维空间里的距离Z,我们需要获得的参数有焦距f、视差d、摄像头中心距B。如果还需要获得X坐标和Y坐标的话,那么还需要额外知道左右像平面的坐标系与立体坐标系中原点的偏移cx和cy。其中f, B, cx和cy可以通过立体标定获得初始值,并通过立体校准优化,使得两个摄像头在数学上完全平行放置,也就是实现图中左右视图完全平行对准的理想形式。而立体匹配所做的工作,就是在之前的基础上,求取最后一个变量:视差d(这个d一般需要达到亚像素精度)。从而最终完成求一个点三维坐标所需要的准备工作。在清楚了上述原理之后,我们也就知道了,所有的这几步:标定、校准和匹配,都是围绕着如何更精确地获得 f, d, B, cx 和cy 而设计的.