元資料:2013-05 · 記事の編集日:
丹野嘉信が公開した資料をもとに、AIを補助に使って記事を構成し、説明を加えています。当時の制作内容と、記事化にあたって補足した内容を分けて記載しています。
元のスライドを読む:ステレオカメラ作成の道2台のカメラで距離を測るには、左右の画像から視差を求める前に、カメラの位置関係を求め、レンズによる歪みを補正する必要があります。制作を「固定・校正・平行化・視差・三次元への変換」に分けると、距離が合わない理由を追いやすくなります。
元の制作記録
2013年の資料は、C920を2台、C#、OpenCVSharp 2.4.5、OpenCV 2.4.5、Visual Studio 2012を使った記録です。チェスボードの撮影、画像の補正、ブロックマッチング、距離への変換までを紹介しています。これらの版は当時の環境であり、現在使い始める際の推奨環境を示すものではありません。元資料:スライド4〜10
処理を分けて確認する
- 左右のカメラを固定する。 校正後に位置関係が変わると、その校正結果をそのまま使えません。
- 校正用の左右一組の画像を集める。 チェスボードを画面内の異なる位置・傾きで撮影します。元資料では20〜30組を目安にしています。
- カメラを校正する。 画像上のコーナー座標と、既知のボード上の点の座標を対応させます。
- 平行化した画像を作る。 対応する点が同じ走査線上に並ぶかを先に見ます。
- 視差を計算し、三次元へ変換する。 無効な視差を除き、単位とスケールを確認します。
校正の用語を整理する
コーナー検出で得るのは画像上の座標です。ボード上の三次元座標は、格子寸法などから別に用意します。焦点距離や主点などの内部パラメータ、レンズの歪み係数、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行列を使います。
値がおかしいときの確認順
- 平行化後、左右で同じ点の高さがそろっているか。
- 格子サイズと基線長の単位を混ぜていないか。
- 視差を二重に16で割っていないか。
- 模様が少ない領域や、片方のカメラからしか見えない領域の値を、有効な測距結果として扱っていないか。
元資料の歪み係数の要素数変更は、当時の試行結果です。要素数を増やせば常に精度が上がるとは限りません。この記事では手順の理解と数値の切り分けを扱い、現行版での実機精度は検証していません。
関連する記事・取り組み
共同研究、技術検証、教材開発に関するご相談はこちら。