銀の弾丸

プログラミングに関して、いろいろ書き残していければと思っております。

OpenCVステレオキャリブレーション用チェスボードコーナー検出ツール

ステレオカメラのキャリブレーションのために必要になる簡単なツール stereoShot を作りましたので、ご紹介。

stereoShotは、2台のカメラで同時にチェスボードをキャプチャーして、コーナー検出の情報を表示し、複数の画像ファイルを保存します。 複数の画像は、キャリブレーションに使用します。

stereoShot - ステレオキャリブレーション用画像保存ツール

実行中の画面

f:id:takamints:20151009191123j:plain

ちょっと見にくいですが、例によって100均カメラ(笑)。 見ての通り、左右の品質に差がありすぎて、向かって右の品質が悪すぎて検出精度がダメダメです。 ちゃんとしたWEBカメラを使えば問題ないと思います。


OpenCV 3 プログラミングブック
藤本 雄一郎 青砥 隆仁 浦西 友樹 大倉 史生 小枝 正直 中島 悠太 山本 豪志朗
マイナビ (2015-09-29)
売り上げランキング: 7,355

使い方

実行すると、2台のカメラのキャプチャー画像が横に並んで表示されます。

カメラデバイスインデックス

それぞれのカメラの、キャプチャーデバイスインデックスは、右が1、左が2となっていますが、コマンドラインオプションで変更可能。 以下の例では、右を2、左を1に変更しています。

$ ./stereoShot -R2 -L1

専用チェスボード

キャリブレーションには11x9のチェスボードが必要です。GitHubのリポジトリからダウンロードできますので、印刷して使ってください。

チェスボードの認識

各カメラがチェスボードを認識すると、そのコーナー(チェスボード内部の交点)を検出して画面に描画します。(検出時点でフレームレートが低下します)

画像の保存

画像ファイルの保存は、スペースバーを押して実行します。左右のカメラのキャプチャ画像がカレントディレクトリに保存します。ファイル名はcap_<連番>_<L or R>.jpgというようになっています。保存される画像に、画面表示されている検出されたコーナーは描画されません。

この画像を読み込んで、キャリブレーションしステレオマッチングするところは、以下のエントリーで説明しています。

takamints.hatenablog.jp

ビルド方法

ソースは全て以下のGitHubリポジトリに置いてあります。

github.com

メイン関数は stereoShot.cpp。 その他、詳細はREADMEを参照してください。

当初チェスボードを8×8にしていたのですが、コーナーの検出順序が安定しませんでした。縦と横が同じだと縦横の判別がつかなくなるようです。 そこで、11x9に変更したら、問題は完全に解消しました。

制限事項

  • チェスボードは 11×9に固定しています。
  • 今のところ、WindowsVisual Studio 2015でしかビルドが通らない状態です。

関連エントリ

takamints.hatenablog.jp

takamints.hatenablog.jp

takamints.hatenablog.jp

参考サイト

russeng.hatenablog.jp