Sorry, this entry is only available in Japanese.

前々回の記事でOpenCVの魚眼レンズのキャリブレーション関数がうまく動作しなかったため,fisheye::calibrate()関数をちょこちょこ改造したものを貼っていましたが,あとで必要になりそうな気がするので,キャリブレーションプログラム全体のソースを置いておきます.

fisheye::calibrate()に加えた変更点は,以下のような感じです.
1. ヤコビアンの逆行列の計算をEigen::fullPivLUに変更
2. 最急降下法の学習率を外部から設定できるように変更

プログラム全体としては,チェスコーナーの検出後,一度,カメラ内部パラメータのみの推定を行った後,それを初期値として歪みパラメータを含めた推定を行うようにしています.

学習率(α)は特にセンシティブなので,何回か変更しながら実行して,いい具合に収束する値を使うといいと思います.手持ちのPCでは0.4~0.6あたりが誤差の収束が良かったです.うまくいくと,下左の画像のように再投影誤差(error)がぐいぐい下がっていきます.収束は画像の枚数にもかなり依存しているようなので,多すぎない適当な枚数(30~40くらい?)で試すと良さそうです.

More »

前回なぜ魚眼レンズのキャリブレーションに必死になっていたかというと,単眼SLAMで遊びたかったからなんです.特に最近流行りのLSD SLAMを使いたかったので,広視野のレンズが必要だったんですね.で,晴れて魚眼レンズのrectificationができたので,LSD SLAMにデータを食わせてみました.

More »

(17/04/10)プログラム全体を上げました.

ここ数日ブログが見れなくなっていたようで,すみません.OpenCVで魚眼レンズのキャリブレーションを行ったんですが,なかなか手こずったので備忘録を残しておきます.

基本的なキャリブレーションの手順はピンホールカメラのキャリブレーションと同じで,1)画像上のマーカーパターン検出,2)対応する3Dマーカー座標用意,3)キャリブレーション関数にそれらを渡す,という感じで,基本的には3番目で使う関数をcv::fisheye::calibrate()を変えればOKです.ただ,cv::fisheye::calibrate()がどうにも不安定で,原因を調べていました.

結論から言うと,1)ヤコビアンの逆行列を求める際の精度が足りていなかった,2)カメラ行列とレンズ歪みパラメータの同時推定が不安定だった,というのが原因だったようです.

More »