OpenCVでキャリブレーション チェスボードを用意しよう

GoProで魚眼撮影しつつ、同時に映像をPCに取り込んでキャリブレーションし、魚眼を取り除いた状態で画像解析したい。

しかし、いきなりキャリブレーションのためのチェスボード認識でつまづきました。

認識がシビアなようです。

OpenCVでチェスボード認識

OpenCV3-Python チュートリアル「カメラ・キャリブレーション」を参考にして実験しましょう。

チュートリアルの内容が私には難しいので、とりあえず感覚で試します。

※OpenCV・Python初心者で、これから画像解析に手を出そうとしているくらいのレベルの人が対象の記事となります。

開発環境

Windows10
Python・・・3.6.4
OpenCV・・・3.4.0

チェスボード印刷

適当にPhotoshopなどでチェスボードを作ります。

チェスボードの画像ダウンロードは後述しますが、印刷したのち、アクリル板に貼り付けています。※硬い板ならなんでもOK。

キャリブレーション用画像の用意

上の写真はGoProで撮影していますが、盛大に湾曲しています。

キャリブレーションをする場合、この湾曲したチェスボードの写真を、最低10枚は必要とするようです。

動画で撮影して、適当なフレームで静止が保存し、15枚ほど用意しました。

チェスボード認識コード実行

OpenCV3-Python チュートリアルに掲載してあるサンプルコードを実行します。

どの画像が認識に成功したか確認するため、28行目に「print(fname)」を追加しています。コメントも英語だったので、おおざっぱな日本語に書き換えています。

実行するPythonファイルと同じ階層に「chessboards」というディレクトリをつくり、その中に先ほどの15枚の画像を入れています。

チェスボードのマスの数が、オリジナルサンプルと違うのが、ちょっと気になります。

1つも認識しない!

上記コードを実行しても、何も起こりません。

とりあえず、サンプルサイトのようにグレースケールにしてみましょう。

これでもダメです。

マスの数の問題かな・・・。

コードをいじるより、チェスボードを作り直す方が楽だと判断し、サンプルと同じものを作りました。

印刷して、ご自由にお使いください。※追記:印刷するとき余白を十分に設定してください。

ブレない240fps撮影で画像用意

再度、画像を用意し直します。

ブレがほとんど起こらない、240fpsで撮影しました。

ちょっと暗くなってしまいましたが、これでいけるでしょうか?

また15枚、静止画として用意しました。

3分の1認識!

再度コードを実行します。

ようやく認識してくれました!

認識に成功したファイルはコマンドプロントに出力されるようにしています。

5つ成功。

うれしいような。足りないような。

認識した画像の特徴は?

認識成功の画像に◎を付けました。

比較的カメラから遠いときに、認識しています。

カメラに近い9.jpgが認識しているので、確かな法則は見つけられません。

おそらくカメラからチェスボードを離して、上下左右まんべんなく画像を用意したほうが、認識されやすいのだと思います。チェッカーボード画像の周囲に余白をつくると認識されるようになるとのことです。(吾妻健夫様より情報を頂きました)

“OpenCVでキャリブレーション チェスボードを用意しよう” への2件の返信

    1. 貴重な情報をありがとうございます!周囲余白が必要だったのですね。余白を作って再度試してみます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)