EN JA ZH ES

ステレオビジョンと距離計測 - 視差から 3D 情報を復元する技術

· 約 9 分で読めます

ステレオビジョンの原理 - 人間の立体視を模倣する

ステレオビジョン (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 フィルタや自動露出で対処します。テクスチャレスな壁面にはパターン投影 (構造化光) を併用します。振動環境ではカメラの固定を強化し、定期的な再キャリブレーションを実施します。

関連記事

カメラキャリブレーションとは - 内部パラメータ推定と歪み補正の実践手順

OpenCV を使ったカメラキャリブレーションの完全ガイド。ピンホールモデルの原理、Zhang 法によるパラメータ推定、放射歪み・接線歪みの補正手順をコード付きで解説します。

単眼深度推定の技術と応用 - 1 枚の画像から奥行きを推定する手法

単眼深度推定の原理から MiDaS、DPT などの最新モデル、自動運転や AR への応用まで、深度マップ生成技術を体系的に解説します。

点群データの基礎と 3D 再構成 - 取得から処理・可視化まで

点群データの基礎知識から実践的な処理手法まで網羅的に解説。LiDAR、SfM、深度カメラによる取得方法と Open3D での処理パイプラインを紹介します。

特徴点マッチングの基礎 - SIFT、ORB、AKAZE の原理と実装比較

画像間の対応点を見つける特徴点マッチングを解説。SIFT、ORB、AKAZE の検出・記述アルゴリズムの違い、マッチング手法、外れ値除去までを実装例で紹介します。

工業検査における画像処理技術 - 外観検査から寸法計測まで

製造業の品質管理で使われる画像処理技術を体系的に解説。欠陥検出、寸法計測、パターンマッチング、深層学習による異常検知の実践手法を紹介します。

ブレ除去 (デブラー) の原理と実践 - モーションブラーからピンボケまで

画像のブレ除去技術を体系的に解説。ウィーナーフィルタ、ブラインドデコンボリューション、深層学習ベースの最新手法まで原理と実装を網羅します。

関連用語