TL;DR
はじめに
-
本記事はOpenCV Advent Calendar 2021 の6日目の記事です。
-
このパターンを画像で撮影することで空間中のカメラの位置姿勢、レンズの画角などの特性を計算から求めることができます。
-
パターンの特徴としては簡単なものながら、こいつをきっちり作らないとキャリブレーションがちゃんと収束しないため、丁寧に作る必要があります
-
4年前に公開したQiita記事では、パターンの大きさを測定する誤差をなくすために「パワーポイント」を使って、指定した長さ/大きさピッタリに印刷できるスクリプトを自作/公開/紹介しました
-
そのときはVisual Studio + CMakeというヘンテコな組み合わせでパワーポイントを作ったのですが、今回はPythonスクリプトの紹介です
使い方
$ ls
generator.py
$ python3 generator.py
$ ls
calibration_pattern.pptx generator.py
工夫した点
- 基本的には4年前に公開したスクリプトと同じで、以下の3種類のパターンを生成できます
- チェッカーボード
- 円形パターン(格子)
- 円形パターン(互い違いに配置)
- 内部的には
python-pptx
というライブラリを使用しており、これでパワーポイントが作れます。- 前回みたいな
xml
のdirtyハックは不要です。 - Pythonは個人的には嫌いで、できれば避けて通りたかったのですが業務で
python-pptx
に触れざるを得ず、結果4年前の宿題を終わらせることに。
- 前回みたいな
- ベクタ形式で作れるので、変なピクセルのアンチエイリアスに悩む必要はありません
- プリンタで出力される際に変なサイズに縮小/拡大される問題も、「等倍で印刷」すれば1mm以下の誤差で印刷ができます。
- 印刷したチェッカーボードの位置やサイズを定規で測る必要もありません
工夫しなかった点
- どうやらPythonには引数を受け取ったり、スクリプトを実行バイナリに落とし込む方法とかもあるみたいですが、そんな高等なことは一切しておりません。
- サイズや個数を変える場合はハードコードされている定数やパラメータを直接書き換えて下さい。
- Pull Request、いつでも受け付けております
- 4年前のツールではヘッダファイルを生成することで、キャリブレーションパターンに関する情報をスムーズにC++のコードに読み込めるようにしましたが、今回はPython版なので、このあたりは割愛しました。
- Pull Request、まじでいつでも受け付けております
スクリーンショット
チェッカーボード
円形パターン(格子)
円形パターン(互い違いに配置)
#その他
-
本記事は以下のバージョンで確認しました
- Python 3.6.9 -
- python-pptx 0.6.21
- Ubuntu 18.04 (x86_64)
-
ベクタ形式で作るだけならば、OpenCV本体内にsvgファイルを生成するPythonスクリプトが同梱されており、ドキュメントも公開されている
-
本記事が気に入った方は、記事のLGTMの他、Githubのスター評価をしていただけると幸いです。
-
キャリブレーションはパターンをちゃんと平面にする必要があるし、撮影時の手ブレやカメラがずれることに神経を尖らせるのが常です。
- 本スクリプトを使えば、少なくとも、「長さを定規で丁寧に測定する」手間が1ステップ省けます。
- Happy Calibration Lifeを!
-
明日はhon_no_mushiさんの担当で、「アイエエエエ! ニンジャ!? ニンジャナンデ!?」(OpenCV module開発のおともに)です。全OpenCVユーザ注目!!