はじめに
カメラキャリブレーション毎回準備するのに手間がかかるから、自分用に手順をまとめる。このブログの通り実行すれば、値得られるというところまでやる。
準備
Python環境構築
まずはPython環境を整えましょう。
リポジトリをクローン
作業するディレクトリで以下のコマンドを実行してください。
git clone https://github.com/keigo1110/camera_calibration.git
cd camera_calibration
必要なライブラリをインストール
次に、キャリブレーションに必要なライブラリをインストールします。以下のコマンドで必要なライブラリをインストールします。
pip install -r requirements.txt
これで、カメラキャリブレーションに必要な環境の準備が完了です。
チェスボードの準備
キャリブレーションにはチェスボードパターンが必要です。checkerboard.png
という名前のチェスボード画像を使用します。この画像を印刷して、キャリブレーション時に撮影用の対象物として使用します。
-
チェスボード画像の印刷:
checkerboard.png
をA4サイズで印刷してください。絶対的なサイズは、重要ではないですがカメラがチェスボード全体を撮影できるよう、適切なサイズに印刷しましょう -
撮影時の注意点: 撮影する際は、チェスボードを水平、斜め、上下左右など様々な角度から撮影し、キャリブレーションの精度を向上させます
撮影ディレクトリの作成(任意)
リポジトリ内ではデフォルトでcalib_images
というディレクトリを使用する設定になっています。
使い方
キャリブレーション用の画像を撮影する
- 単眼カメラの場合(いわゆるピンホールモデル)
python capt_pin.py
- 魚眼レンズの場合
python capt_fish.py
- 実行すると、プレビューウィンドウが立ち上がり、チェスボードが検出されると緑枠が表示される
- 十分にシャープ(ピントが合った)と判断されると(画面上の “Focus” 表示を参照)
s
キーを押して画像を保存します - デフォルトでは
30
枚が目標保存枚数(これくらいあると十分上手くいく)ですが、状況に応じて変更してください -
q
キーで撮影を終了できます - 撮影が終わると、
calib_images
ディレクトリにcalib_00.png
のような画像ファイルが並びます
撮影のコツ??
焦点合っていないと画像を保存できないなど、プログラムでもかなり工夫していますが、撮影時に意識していることを簡単に列挙します。
- 撮影距離を様々に
- 撮影位置も様々に
- チェスボードはまっすぐだけでない色々な角度でと
- フレームの端ギリギリにチェスボードが来ている構図も
キャリブレーションの実行
印刷したキャリブレーションボードのマスの一辺の長さを測る(自分がcheckerboard.png
をA4で印刷すると28[mm]だった)。測定した数値をコードの"square_size"
に反映する。それから以下を実行する。
- 単眼カメラの場合
python calib_pin.py
- 魚眼レンズの場合
python calib_fish.py
-
calib_images
ディレクトリに保存した画像から、チェスボードを自動検出し、キャリブレーションを行います - 実行後、以下の情報がコンソール上に表示されます
- RMS(再投影誤差)
- カメラ行列 (cameraMatrix)
- 歪み係数 (distCoeffs)
- 平均再投影誤差
- キャリブレーションが成功すると、テスト用に最初の画像を補正した結果をウィンドウで確認できます
結果の数値の肌感覚
- RMSは1を割っていればいい感じ(0.5前後くらいは上記の手順でやればいくはず)
おわりに
これでだいぶ楽にできるようになると思います。カメラキャリブレーションの知見収集中です。