Stereo Vision

ステレオビジョン(stereo vision)は、既知のベースライン(baseline) bb だけ離れた2台のキャリブレーション済みカメラから深度を復元する。両カメラ間の相対姿勢が固定かつ既知であるため、一方の画像における場面中の点の位置は、他方の画像に現れうる位置を制約し、2つの観測間の水平方向のずれがメトリックな深度を符号化する。

Disparity(視差)と深度

整列化(rectification)(両画像を、エピポーラ線が同一の水平走査線になるように変形する処理)を行った後、深度 ZZ にある3次元点は左右の画像でそれぞれ水平ピクセル座標 uLu_LuRu_R に現れる。**視差(disparity)**は

d=uLuR=fxbZd = u_L - u_R = \frac{f_x\, b}{Z}

であり、fxf_x はピクセル単位の焦点距離である。深度はこれを逆算することで復元できる:

Z=fxbdZ = \frac{f_x\, b}{d}

ZZ が得られれば、ピンホールモデルから3次元点全体が求まる:X=(ucx)Z/fxX = (u - c_x) Z / f_xY=(vcy)Z/fyY = (v - c_y) Z / f_y

深度の不確実性

Z(d)Z(d) を微分すると、マッチング誤差 δd\delta d(通常はピクセルの一部)が深度にどのように伝播するかがわかる:

δZZ2fxbδd\delta Z \approx \frac{Z^2}{f_x\, b}\, \delta d

深度誤差は距離に対して2次関数的に増大し、ベースラインに対しては反比例する。これがステレオリグの基本的な設計上のトレードオフである:ベースラインを広げると遠方の精度は向上するが、重複視野が狭くなり近距離のマッチングが難しくなる。狭いベースラインではその逆が起こる。ある距離を超えると、視差がマッチング精度以下になり、ステレオペアは実質的に単眼カメラに退化する。

ステレオマッチング

密な**視差マップ(disparity map)**を生成するには、左画像の各ピクセルについて、同じ走査線上の右画像における対応点を見つける必要がある:

疎ステレオ ── 2つの視点間で検出されたキーポイントのみをマッチングする方法 ── は、特徴点ベースのSLAM(例:ORB-SLAM2のステレオモード)で一般的である。これは密マッチングのコストを避けつつ、メトリックなランドマークを提供できるためである。

ステレオ vs. 単眼 vs. RGB-D

ステレオは、固定された工場出荷時にキャリブレーションされたベースラインによる三角測量であり、これがメトリックスケールを可観測にするものである:単眼カメラは未知のスケール係数までしか幾何を復元できないのに対し、ステレオリグはそれをメートル単位に固定する。RGB-Dセンサー(構造化光やTime-of-Flight)と比較すると、パッシブステレオは屋外の太陽光下や長距離でも動作するが、マッチングの手掛かりがないテクスチャのない表面では苦労する。

SLAMにおける意義

ステレオは、単眼SLAMの2つの最難関の問題 ── スケールの曖昧さと初期化 ── を一度に解消する。すべてのステレオフレームが即座にメトリックな3次元ランドマークを与える ── マップを立ち上げるための運動視差は不要である ── そして各新規フレームがスケールを再測定するため、スケールがドリフトすることはない。これが、ステレオ(およびステレオ・慣性融合)構成がロボティクスの実運用でデフォルトとなっている理由であり、視差-深度関係とその2次関数的な誤差増大を理解することが、ベースラインの選択や信頼できる深度のしきい値の設定(例:ORB-SLAM2における「近い vs. 遠い」点の区別)に不可欠な理由である。

関連ノート