ステレオ視 — 2つの目が距離を知るしくみ
左右の目に映る世界は、ほんの少しだけズレています。このズレ=視差から、人間の脳もコンピュータも奥行きを計算しています。2枚の画像から3D世界を測る「ステレオ視」の幾何と、その計算アルゴリズムを動かしながら理解します。
1. 視差 — 2つの視点のズレを体感する
指を1本、顔の前に立てて、左右の目を交互にウインクしてみてください。指が左右に大きくジャンプします。一方、遠くの壁はほとんど動きません。この「近いものほど左右の像が大きくズレる」という性質が、奥行きを知る手がかりのすべてです。このズレ量を視差(disparity)と呼びます。
下のデモで、近い箱の距離を動かして左右カメラの画像のズレ量がどう変わるか見てください。「左右の目を交互に点滅」ボタンを押すと、ウインク実験と同じ錯覚を画面上で体験できます。
2. 三角測量 — 視差から距離を計算する
視差から距離を求める原理は三角測量です。左右のカメラから対象点へ引いた2本の視線は1点で交わり、その交点の位置(=奥行き Z)は幾何的に一意に決まります。カメラの間隔を基線長 B、焦点距離を f とすると、相似な三角形の関係から次の式が導けます。
下のデモで視差スライダーを動かすと、左の幾何図の交点が近づいたり遠ざかったりし、右のカーブ上を点が移動します。反比例なので、視差が小さい(=遠い)ほどカーブが急になり、視差1ピクセルの読み取り誤差が大きな距離誤差になることが赤い帯の広がりで分かります。基線長を伸ばすと同じ距離でも視差が大きくなり、帯が細く=精度が良くなります。
3. 対応問題 — 「同じ点」をどうやって見つけるか
ここまでは視差 d が分かっている前提でした。しかし実際には、左画像のある画素が右画像のどこに写っているかをコンピュータ自身が探さなければなりません。これが対応問題で、ステレオ視の本当の難所です。
最も基本的な探索法がブロックマッチングです。左画像の画素の周りに小さな窓を取り、右画像の同じ行の上で窓を横にずらしながら、画素値の差の合計(SAD: Sum of Absolute Differences)を計算します。SADが最小になったずらし量が、その画素の視差です。これを全画素に繰り返すと視差マップ(近い=明るい画像)が得られます。
4. まとめ
- 視差 d:同じ点が左右画像に写る位置のズレ。距離に反比例し、近いものほど大きい。
- 三角測量 Z = fB/d:視差・焦点距離・基線長から奥行きが決まる。誤差は距離の2乗で悪化し、基線長を伸ばすと改善する。
- 対応問題:エピポーラ幾何のおかげで探索は同じ行の1次元スキャンで済む。ブロックマッチング+SAD最小化が基本形。
- 弱点:テクスチャなし領域・繰り返し模様・遮蔽(片方のカメラにしか写らない領域)では対応が決まらない。