ステレオ視 — 2つの目が距離を知るしくみ

左右の目に映る世界は、ほんの少しだけズレています。このズレ=視差から、人間の脳もコンピュータも奥行きを計算しています。2枚の画像から3D世界を測る「ステレオ視」の幾何と、その計算アルゴリズムを動かしながら理解します。

1. 視差 — 2つの視点のズレを体感する

指を1本、顔の前に立てて、左右の目を交互にウインクしてみてください。指が左右に大きくジャンプします。一方、遠くの壁はほとんど動きません。この「近いものほど左右の像が大きくズレる」という性質が、奥行きを知る手がかりのすべてです。このズレ量を視差(disparity)と呼びます。

下のデモで、近い箱の距離を動かして左右カメラの画像のズレ量がどう変わるか見てください。「左右の目を交互に点滅」ボタンを押すと、ウインク実験と同じ錯覚を画面上で体験できます。

視差の体感 — 近い箱は大きくズレ、遠い箱は動かない
上段=2台のカメラと箱を真上から見た図。下段=左右カメラが実際に撮った画像。右画像の点線枠は「左画像での位置」で、赤矢印の長さが視差です。距離スライダーを近づけると視差が急増し、遠ざけるとゼロに近づきます。
POINT — 視差は距離に反比例する 距離 Z が半分になると視差 d は2倍になる。逆に遠くの物体では視差はほぼゼロになり、左右の画像は同じに見える。「ズレの大きさ」がそのまま「近さの度合い」になっている。

2. 三角測量 — 視差から距離を計算する

視差から距離を求める原理は三角測量です。左右のカメラから対象点へ引いた2本の視線は1点で交わり、その交点の位置(=奥行き Z)は幾何的に一意に決まります。カメラの間隔を基線長 B、焦点距離を f とすると、相似な三角形の関係から次の式が導けます。

Z = f B / d Z: 奥行き f: 焦点距離 [px] B: 基線長(カメラ間の距離) d: 視差 [px]

下のデモで視差スライダーを動かすと、左の幾何図の交点が近づいたり遠ざかったりし、右のカーブ上を点が移動します。反比例なので、視差が小さい(=遠い)ほどカーブが急になり、視差1ピクセルの読み取り誤差が大きな距離誤差になることが赤い帯の広がりで分かります。基線長を伸ばすと同じ距離でも視差が大きくなり、帯が細く=精度が良くなります。

三角測量 — 視差⇔奥行きの反比例と誤差の帯
推定距離 Z:
誤差幅:
赤い帯=視差の読み取りが ±1px ずれたときに距離がどれだけ変わるか。左図の視線が浅い角度で交わる(=遠い or 基線が短い)ほど、交点の位置が縦に大きくブレます。
注意 — ステレオは遠距離が苦手 距離誤差は ΔZ ≈ Z²·Δd / (fB) と、距離の2乗で悪化する。基線長 B を伸ばせば精度は上がるが、伸ばしすぎると左右の見え方が違いすぎて対応付け(次章)が難しくなり、近距離が両方の視野に入らなくなるトレードオフがある。

3. 対応問題 — 「同じ点」をどうやって見つけるか

ここまでは視差 d が分かっている前提でした。しかし実際には、左画像のある画素が右画像のどこに写っているかをコンピュータ自身が探さなければなりません。これが対応問題で、ステレオ視の本当の難所です。

一歩先へ — エピポーラ線が探索を1次元にする 左画像の1点に対応する点は、右画像全体(2次元)を探す必要はない。2つのカメラ中心と対象点が作る平面が右画像を切る直線=エピポーラ線の上に必ず乗ることが幾何的に保証される。さらに2台のカメラを平行に置く(または画像を平行化: rectificationする)と、エピポーラ線は画像の同じ行になる。だから下のデモのように「同じ行を横にスキャンするだけ」で対応が探せる。

最も基本的な探索法がブロックマッチングです。左画像の画素の周りに小さな窓を取り、右画像の同じ行の上で窓を横にずらしながら、画素値の差の合計(SAD: Sum of Absolute Differences)を計算します。SADが最小になったずらし量が、その画素の視差です。これを全画素に繰り返すと視差マップ(近い=明るい画像)が得られます。

視差マップの計算 — ブロックマッチングが1画素ずつ埋めていく
オレンジ枠=左画像の注目窓、緑枠=右画像で見つかった最良マッチ。右下のSADコストカーブの最小点が視差になります。左端ののっぺりした壁(テクスチャなし領域)ではカーブが平坦になり最小点が定まらず、視差マップが乱れます。窓を広げるとノイズには強くなりますが、物体の輪郭がにじみます。
注意 — テクスチャがない場所は原理的にお手上げ 真っ白な壁や青空は、どこをどうずらしても同じに見えるため SAD カーブに谷ができない。ステレオカメラの視差マップに「穴」が空くのはこのため。実用システムは信頼度の低い画素を捨てたり、周囲から補間したり、パターン光を投影してテクスチャを人工的に作ったりする(Kinect など)。

4. まとめ

一歩先へ — 現代のステレオ 実用ではSADを画素ごとに独立に最小化せず、「隣の画素と視差は滑らかに変わるはず」という制約を加えて画像全体で最適化するセミグローバルマッチング(SGM)が定番。さらに近年はCNNやTransformerでマッチングコスト自体を学習する手法が主流になり、テクスチャなし領域も文脈から推定できるようになった。自動運転ではステレオカメラとLiDARが互いの弱点を補い合っている。