在视觉SLAM14讲第二版中视差推导公式如下:
这里z是相机坐标系下路标点的深度值,f是相机的焦距,b是双目相机光心之间的距离(也成为基线长度),这里假设单位均为m,重点在于理解u_L和u_R的含义,书上说是成像平面的坐标,但是我们知道只有同量纲的单位才能进行加减运算,因此这里u_L和u_R应该不是像素坐标,而是虚拟成像平面上(也就是距离光心为正f所在的平面)投影点与光心投影点之间的距离值(这里假设为标量值,高博还严谨的讨论了一下坐标的正负问题),单位为m。
可以参考十四讲的几何模型进行理解
而在代码中经常采用
int disparity = disparity_img.at<uchar>(y, x);
double depth = fx * baseline / disparity;
这里fx是相机内参,disparity是视差图的值,我们知道,这里的物理含义应该是在给定像素分辨率的情况下,1m对应的像素块的个数,因此fx是焦距长度所对应的像素块的个数。这里的视差值(disparity)也是路标点在左右目的像素平面上的投影像素坐标值之差。因此公式中的f和d与这里的fx和disparity刚好差一个的比例因子,用公式解释如下
总结:
公式与代码相差了一个比例因子,表示1m对应的像素块的个数(在基线长度单位为m的条件下)
!!注意!!
以上所有探讨的前提是做好双目立体矫正,也就是统一路标点在双目的像素投影坐标的纵坐标相等。