TH /TannoHubYOSHINOBU TANNOEN ↗
データ解析・画像処理

ステレオカメラの距離計測:校正・視差と16倍の注意点

2台のUSBカメラとOpenCVSharpによる2013年の制作記録をもとに、校正・平行化・視差から距離への変換を整理。単位と視差スケールの誤りを解説します。

← 技術ノート一覧

元資料:2013-05 · 記事の編集日:

丹野嘉信が公開した資料をもとに、AIを補助に使って記事を構成し、説明を加えています。当時の制作内容と、記事化にあたって補足した内容を分けて記載しています。

元のスライドを読む:ステレオカメラ作成の道

2台のカメラで距離を測るには、左右の画像から視差を求める前に、カメラの位置関係を求め、レンズによる歪みを補正する必要があります。制作を「固定・校正・平行化・視差・三次元への変換」に分けると、距離が合わない理由を追いやすくなります。

元の制作記録

2013年の資料は、C920を2台、C#、OpenCVSharp 2.4.5、OpenCV 2.4.5、Visual Studio 2012を使った記録です。チェスボードの撮影、画像の補正、ブロックマッチング、距離への変換までを紹介しています。これらの版は当時の環境であり、現在使い始める際の推奨環境を示すものではありません。元資料:スライド4〜10

処理を分けて確認する

  1. 左右のカメラを固定する。 校正後に位置関係が変わると、その校正結果をそのまま使えません。
  2. 校正用の左右一組の画像を集める。 チェスボードを画面内の異なる位置・傾きで撮影します。元資料では20〜30組を目安にしています。
  3. カメラを校正する。 画像上のコーナー座標と、既知のボード上の点の座標を対応させます。
  4. 平行化した画像を作る。 対応する点が同じ走査線上に並ぶかを先に見ます。
  5. 視差を計算し、三次元へ変換する。 無効な視差を除き、単位とスケールを確認します。

校正の用語を整理する

コーナー検出で得るのは画像上の座標です。ボード上の三次元座標は、格子寸法などから別に用意します。焦点距離や主点などの内部パラメータ、レンズの歪み係数、2台の相対回転・並進を分けると、元資料で省略されている説明を理解しやすくなります。OpenCV:校正と三次元再構成

距離が16倍・16分の1になるとき

OpenCVのStereoBMなどが返す16ビット符号付き視差には、小数部分を表すために16倍された値が入る場合があります。この形式は浮動小数点へ変換して16で割ってからreprojectImageTo3Dへ渡します。元資料末尾の「距離変換時も16倍」という記述を、すべての実装への指示として使わないでください。OpenCV公式のreprojectImageTo3Dの入力仕様

標準的な平行ステレオの単純化した式はZ = f × B / dです。焦点距離fを画素、基線長Bをm、視差dを画素で入れると、奥行きZはmになります。例えばf=700、B=0.10、d=35ならZ=2.0 mです。これは単位確認用の計算例で、制作時の実測値ではありません。実際の変換では校正から得たQ行列を使います。

値がおかしいときの確認順

元資料の歪み係数の要素数変更は、当時の試行結果です。要素数を増やせば常に精度が上がるとは限りません。この記事では手順の理解と数値の切り分けを扱い、現行版での実機精度は検証していません。

関連する記事・取り組み

共同研究、技術検証、教材開発に関するご相談はこちら