Disparity vs Depth

对于一对经过校正的立体图像,一个三维点会投影到左右图像中同一行但不同列的位置。这两个投影之间的水平偏移就是视差(disparity) d=uLuRd = u_L - u_R(单位为像素)。设焦距为 ff(像素)、立体基线为 BB(米),视差和深度 ZZ 之间的关系为

d=fBZZ=fBd.d = \frac{f \cdot B}{Z} \quad\Longleftrightarrow\quad Z = \frac{f \cdot B}{d}.

这一关系是反比关系:近处的物体视差大,远处的物体视差小。

公式的来源

将左相机置于原点,右相机置于 (B,0,0)(B, 0, 0),两者都朝向 +Z+Z 方向,具有相同的焦距 ff 和主点 cxc_x(这正是校正所要实现的效果)。一个点 (X,Y,Z)(X, Y, Z) 投影为

uL=fXZ+cx,uR=fXBZ+cx,u_L = f\,\frac{X}{Z} + c_x, \qquad u_R = f\,\frac{X - B}{Z} + c_x,

因此行坐标相同(vL=vRv_L = v_R),列坐标之差为

d=uLuR=fX(XB)Z=fBZ.d = u_L - u_R = f\,\frac{X - (X - B)}{Z} = \frac{fB}{Z}.

这也是为什么立体 SLAM 系统可以将一个关键点存储为三元组 (uL,vL,uR)(u_L, v_L, u_R)——正如 ORB-SLAM2 所做的那样——并在光束法平差中使用 uR=f(XcB)/Zc+cxu_R = f\,(X_c - B)/Z_c + c_x 作为第三个残差行:右图像的列坐标本身就是深度观测量。

Z2Z^2 定律:深度分辨率呈平方级退化

Z=fB/dZ = fB/d 关于 dd 求导得到

ΔZZ2fBΔd,\Delta Z \approx \frac{Z^2}{fB}\,\Delta d,

因此一个固定的视差匹配误差 Δd\Delta d(通常是亚像素级的一个分数)会产生随 Z2Z^2 增长的深度误差:距离加倍,深度不确定性增大四倍。以 f=500f = 500 像素、B=0.1B = 0.1 米(即 fB=50fB = 50 像素·米)以及匹配精度 Δd=0.25\Delta d = 0.25 像素为例:

深度 ZZ视差 d=fB/Zd = fB/Z深度误差 ΔZ\Delta Z
2 m25 px0.02 m (1%)
10 m5 px0.5 m (5%)
20 m2.5 px2 m (10%)

在 20 米处,这套装置的”度量”深度几乎和瞎猜差不了多少——而同一套测量在手臂长度范围内却能达到毫米级精度。

设计上的影响

在估计器中:优先使用逆深度

注意视差是逆深度的线性函数:设 ρ=1/Z\rho = 1/Z,则

d=fBρ.d = fB\,\rho.

因此像素级的匹配噪声在 ρ\rho 上近似映射为高斯噪声,但在 ZZ 上却映射为偏斜、重尾的噪声(在 d=1d = 1 像素处的 ±0.25\pm 0.25 像素误差会对应一个巨大且不对称的深度区间)。这就是为什么 SLAM 系统用逆深度来参数化远处的点,也是为什么观测协方差应该在视差/逆深度空间中建模并传播,而不是假设在度量深度上是高斯分布的。

在一个 SLAM 流水线中,这种转换出现在两个地方:将每个关键点的视差转换为三维地标位置(或逆深度参数化),以及在光束法平差中根据其深度相关的不确定性对立体观测进行加权。

常见误区

对SLAM的意义

d=fB/Zd = fB/Z 这一几何关系决定了立体视觉是否真正有用:它告诉你哪些地标携带度量信息、应如何根据作业距离设置装置基线,以及如何在估计器中正确建模观测噪声。误解这一点(例如,信任一个 10 厘米基线在 100 米处给出的立体深度)是造成地图偏差和协方差不一致的经典原因。

相关条目