ステレオビジョンと距離計測 - 視差から 3D 情報を復元する技術
ステレオビジョンの原理 - 人間の立体視を模倣する
ステレオビジョン (Stereo Vision) は、2 台のカメラで同一シーンを異なる視点から撮影し、左右画像間の対応点のずれ (視差: Disparity) から 3D 情報を復元する技術です。人間の両眼立体視と同じ原理に基づいています。
基本原理: 左右のカメラで同じ物体を撮影すると、物体の像は左右画像で異なる位置に映ります。この位置のずれ (視差 d) は物体までの距離 Z に反比例します。
Z = f × B / d
ここで f は焦点距離 (ピクセル)、B はベースライン (カメラ間距離、メートル)、d は視差 (ピクセル) です。例えば f=1,000 px、B=0.12m、d=50px の場合、Z = 1000 × 0.12 / 50 = 2.4m となります。
ステレオビジョンの構成要素:
- キャリブレーション: 各カメラの内部パラメータとカメラ間の相対位置を推定する
- レクティフィケーション: 左右画像を平行化し、対応点探索を水平方向のみに限定する
- ステレオマッチング: 左右画像間の対応点を見つけ、視差マップを生成する
- 三角測量: 視差から 3D 座標を計算する
距離精度の限界: 視差の量子化誤差 (±0.5 ピクセル) により、距離精度は距離の 2 乗に比例して低下します。B=0.12m、f=1,000 px の場合、距離 2m で ±2cm、距離 10m で ±50cm の誤差が生じます。遠距離の精度を上げるにはベースラインを広げるか、焦点距離を長くする必要があります。
エピポーラ幾何とレクティフィケーション
エピポーラ幾何 (Epipolar Geometry) は、2 つのカメラ間の幾何学的関係を記述する理論で、ステレオマッチングの探索範囲を大幅に削減する基盤となります。
エピポーラ拘束: 左画像の点 p_L に対応する右画像の点 p_R は、右画像上の特定の直線 (エピポーラ線) 上に必ず存在します。この拘束により、対応点の探索が 2D から 1D に削減されます。
p_R^T × F × p_L = 0
F は基礎行列 (Fundamental Matrix) で、2 つのカメラの内部・外部パラメータから計算されます。8 点以上の対応点から推定可能です。
レクティフィケーション (平行化): エピポーラ線が水平になるように左右画像を射影変換する処理です。平行化後は対応点が同一の行 (y 座標) に存在するため、探索が水平方向のスキャンのみで済みます。
- OpenCV:
cv2.stereoRectify()で変換行列を計算し、cv2.initUndistortRectifyMap()+cv2.remap()で適用する - 平行化の品質確認: 左右画像を重ねて水平線を引き、対応する特徴点が同一線上にあることを確認する
キャリブレーション済みステレオ vs 未キャリブレーション: キャリブレーション済みの場合は本質行列 E から正確なレクティフィケーションが可能です。未キャリブレーションの場合は基礎行列 F から射影的レクティフィケーションを行いますが、メトリックな距離情報は得られません (スケール不定)。産業用途では必ずキャリブレーション済みステレオを使用します。
ステレオマッチング - ブロックマッチングと SGM
ステレオマッチング (Stereo Matching) は、左画像の各ピクセルに対応する右画像のピクセルを見つけ、視差マップを生成する処理です。ステレオビジョンの精度を決定する最も重要なステップです。
ブロックマッチング (BM): 最も基本的な手法で、左画像の小ブロック (例: 15x15) を右画像上で水平にスライドさせ、SAD (Sum of Absolute Differences) が最小となる位置を対応点とします。
- OpenCV:
cv2.StereoBM_create(numDisparities=64, blockSize=15) - 利点: 高速 (1080p で約 30ms)、実装が単純
- 欠点: テクスチャのない領域で失敗、エッジ付近で不正確、オクルージョンに弱い
Semi-Global Matching (SGM): Hirschmuller (2005) が提案した手法で、ブロックマッチングの局所性を克服するため、複数方向 (8 または 16 方向) からのコスト集約を行います。
E(D) = Σ_p [C(p, D_p) + Σ_q∈N(p) P1×T[|D_p - D_q| = 1] + P2×T[|D_p - D_q| > 1]]
P1 (小さな視差変化のペナルティ、推奨値 8×blockSize²) と P2 (大きな視差変化のペナルティ、推奨値 32×blockSize²) で滑らかさを制御します。
- OpenCV:
cv2.StereoSGBM_create(minDisparity=0, numDisparities=128, blockSize=5, P1=600, P2=2400) - 利点: BM より大幅に高品質、テクスチャレス領域にも対応
- 欠点: BM の約 5-10 倍の計算コスト (1080p で約 200ms)
視差マップの後処理: WLS (Weighted Least Squares) フィルタで視差マップのノイズを除去し、エッジを保持しながら滑らかにします。cv2.ximgproc.createDisparityWLSFilter() で利用可能です。左右整合性チェック (Left-Right Consistency Check) でオクルージョン領域を検出し、無効値としてマークします。
深層学習によるステレオマッチング
深層学習ベースのステレオマッチングは、従来手法の限界 (テクスチャレス領域、反射面、繰り返しパターン) を克服し、大幅な精度向上を実現しています。コスト集約と視差推定をエンドツーエンドで学習します。
DispNet / FlowNet (2016): 最初の深層学習ステレオマッチング手法です。左右画像を連結してエンコーダ-デコーダに入力し、視差マップを直接予測します。SceneFlow データセット (合成データ) で学習し、EPE (End-Point Error) 1.68px を達成しました。
GC-Net (2017): 3D コスト集約を導入した手法です。左右の特徴マップから 4D コストボリューム (H×W×D×C) を構築し、3D 畳み込みで集約します。幾何学的な制約を明示的にネットワークに組み込むことで、精度が大幅に向上しました。
PSMNet (2018): Pyramid Stereo Matching Network は、Spatial Pyramid Pooling で多スケールの文脈情報を活用し、大きなテクスチャレス領域でも安定した視差推定を実現します。KITTI 2015 ベンチマークで D1-all 2.32% (3px 誤差率) を達成しました。
RAFT-Stereo (2021): オプティカルフロー推定手法 RAFT をステレオに適用し、反復的な視差更新で高精度な結果を生成します。相関ボリュームから GRU ベースの更新ユニットで視差を段階的に精緻化します。Middlebury ベンチマークで当時の最高精度を達成しました。
実用的な比較:
- 精度: RAFT-Stereo > PSMNet > SGM > BM
- 速度 (1080p): BM (30ms) > SGM (200ms) > PSMNet (300ms, GPU) > RAFT-Stereo (500ms, GPU)
- 汎化性能: 深層学習手法は学習データと異なるドメインで精度が低下する場合がある
視差マップから 3D 点群への変換
ステレオマッチングで得られた視差マップから、実際の 3D 座標 (点群) を計算する手順を解説します。この変換により、シーンの 3D 構造を定量的に把握できます。
再投影行列 Q: OpenCV の cv2.stereoRectify() が出力する 4x4 の再投影行列 Q を使用して、視差マップから 3D 点群を一括計算します。
[X, Y, Z, W]^T = Q × [x, y, disparity, 1]^T
実際の 3D 座標は (X/W, Y/W, Z/W) で得られます。OpenCV では cv2.reprojectImageTo3D(disparity, Q) で一括変換が可能です。
点群のフィルタリング:
- 距離フィルタ: 有効範囲外 (例: 0.5m-10m) の点を除去する。視差が 0 または最大値の点は無効
- 統計的外れ値除去: 各点の k 近傍の平均距離を計算し、平均 + 2σ 以上離れた点を外れ値として除去する
- ボクセルダウンサンプリング: 点群の密度を均一化し、データ量を削減する (例: 1cm ボクセル)
精度の検証: 既知の距離にある物体 (キャリブレーションボードなど) を計測し、推定距離と実測距離を比較します。相対誤差 1% 以下が産業用途の目標です。距離 2m で ±2cm、距離 5m で ±12cm 程度が一般的なステレオカメラの精度です。
点群の可視化と保存: PLY 形式で保存し、Open3D や CloudCompare で可視化します。open3d.io.write_point_cloud("output.ply", pcd) で保存、色情報付きの点群として出力可能です。ROS (Robot Operating System) では PointCloud2 メッセージとして配信し、RViz で可視化します。
ステレオビジョンの実践 - システム構築と応用事例
ステレオビジョンシステムを実際に構築する際の機材選定、セットアップ、よくある問題と解決策を解説します。産業用途から研究用途まで、具体的な応用事例も紹介します。
カメラ選定の指針:
- ベースライン: 計測距離の 1/10-1/30 が目安。距離 3m なら B=10-30cm
- 解像度: 高解像度ほど視差の分解能が向上。1080p で一般的な用途に十分
- 同期: ハードウェア同期 (トリガー入力) が必須。ソフトウェア同期では動体でずれが生じる
- グローバルシャッター: 動体撮影にはローリングシャッター歪みのないグローバルシャッターが必要
市販ステレオカメラ:
- Intel RealSense D435: B=50mm、IR パターン投影、USB 接続。屋内 0.2-10m。約 3 万円
- ZED 2: B=120mm、1080p、SDK 付属。屋内外 0.3-20m。約 6 万円
- Stereolabs ZED X: 産業用、IP67、ハードウェア同期。約 15 万円
応用事例:
- 自動運転: Subaru EyeSight はステレオカメラで前方障害物を検出し、衝突回避を行う
- ロボットピッキング: 物流倉庫でのピースピッキングに 3D 位置推定を使用
- 農業: 果実の大きさ計測、収穫ロボットの位置決め
- 建設: 施工現場の 3D 計測、出来形管理
よくある問題と対策: 屋外での太陽光による飽和は ND フィルタや自動露出で対処します。テクスチャレスな壁面にはパターン投影 (構造化光) を併用します。振動環境ではカメラの固定を強化し、定期的な再キャリブレーションを実施します。