Disparity vs Depth

整流されたステレオ画像対において、3D点は左画像と右画像に同じ行だが異なる列で投影される。2つの投影の間の水平方向のオフセットが視差(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)に置き、両方が同じ焦点距離ffと主点cxc_xを持ち+Z+Z方向を見ている(これはまさに整流が実現する状態である)とする。点(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/dddについて微分すると

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

が得られる。したがって、固定された視差マッチング誤差Δd\Delta d(典型的には1画素の何分の1)はZ2Z^2で増大する深度誤差を生む:距離を2倍にすると深度の不確実性は4倍になる。f=500f = 500 px、B=0.1B = 0.1 m(したがってfB=50fB = 50 px·m)、マッチング精度Δd=0.25\Delta d = 0.25 pxとした具体例では、

深度 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 mでは、このリグの「メトリック」深度は、腕の長さ程度の距離ではミリメートル級の精度であるのと同じ観測が、推測とほとんど変わらないものになる。

設計上の結果

推定器の中では逆深度を選ぶべき

視差は逆深度に対して線形であることに注意:ρ=1/Z\rho = 1/Zとすると、

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

したがって、画素レベルのマッチングノイズはρ\rhoにおいてはおおよそガウスノイズに写るが、ZZにおいては歪んだ、重い尾を持つノイズに写る(d=1d = 1 pxにおける±0.25\pm 0.25 pxの誤差は、巨大で非対称な深度区間に及ぶ)。これがSLAMシステムが遠方の点を逆深度でパラメータ化する理由であり、また観測共分散は視差/逆深度空間でモデル化・伝播されるべきであって、メトリック深度でガウス分布であると仮定すべきではない理由である。

SLAMパイプラインでは、この変換は2箇所に現れる:キーポイントごとの視差を3Dランドマーク位置(あるいは逆深度パラメータ化)に変換する箇所と、バンドル調整においてステレオ観測をその深度依存の不確実性に応じて重み付けする箇所である。

よくある落とし穴

SLAMにおける意義

d=fB/Zd = fB/Zという幾何は、ステレオが実際に役立つかどうかを決定する:どのランドマークがメトリック情報を持つか、運用範囲に応じてリグのベースラインをどう設定すべきか、そして推定器において観測ノイズをどのようにモデル化するのが正しいかを教えてくれる。これを誤解すること(例えば10 cmのベースラインから100 mのステレオ深度を信頼すること)は、偏った地図や不整合な共分散の典型的な原因である。

関連ノート