OpenCV&Pythonで、簡単に魚眼レンズの歪み補正(Calibration)を行う方法

スマートホーム
スポンサーリンク
このエントリーをはてなブックマークに追加

はじめに

防犯カメラなど、広範囲を撮影したい時には、複数のカメラで撮影するのも手ですが、魚眼レンズを使うのが手取り早いです。しかし、魚眼レンズで撮影した画像は、上の左の画像のように外側に行くほど歪んでしまいます。このため、物体検知や動体検知などを行うためには、レンズの歪みを補正する必要があります。

この魚眼レンズの歪み補正処理について、あまり日本語の情報が無かったので、まとめておきます。

用意するもの

①ボードコンピュータ

カメラで画像を撮影して、撮影した画像の歪み補正を行うコンピュータが必要です。Raspberry PiやJetson nanoなどのボードコンピュータが良いでしょう。

②魚眼レンズ付きカメラモジュール

今回の主役の魚眼レンズ付きカメラモジュールです。今回は180度まで撮影可能な以下のカメラを使います。USB接続で、4K@30fpsまでの動画撮影にも対応しています。

用意するものは、以上の2点です。

OpenCVによる歪み補正の方法

魚眼レンズには、120度・160度・180度など様々な広角のものが販売されています。よって、カメラによって画像の歪みの度合いが異なるので、使うカメラの歪み度合いに応じて、補正処理を行う必要があります。

魚眼レンズの歪み補正の計算ロジックは、OpenCVのカメラキャリブレーションのページに書かれていますが、行列計算や複雑な数式が出てきて、高校時代に数学Cが嫌いだった私には理解できません💦ただ、この難しい計算部分を全てやってくれる素晴らしい関数がOpenCVには用意されているのでこれを使います‼️

準備

まずは、歪み補正をするために各種準備を行います。

①チェスボードの準備

OpenCVの歪み計算は、白黒の均等な四角が書かれたチェスボードをカメラで撮影して、四角の歪み具合を検出することで行うそうです。なので、まずはチェスボードを用意する必要があります。チェスボードなんて家にない!と思った方、安心してください。このリンクからPDFをダウンロードして印刷すればOKです。

また、印刷したら黒い四角の一辺の長さを定規で測っておいてください。私の場合はA4の紙に印刷して、一辺の長さは23mmでした。

②OpenCV&Pythonの準備

次に、Raspberry PiもしくはJetson nanoに、OpenCVとPythonをインストールします。インストール方法は、いろいろ情報があるのでそちらを参照してください。今回は、以下を利用しています。

また、以下のプログラムでは、USBカメラからの撮影にv4l2captureを使っているので、インストールされてない場合はインストールして下さい。

魚眼レンズの歪み係数の取得

①プログラムの作成

まず、チェスボードを撮影して歪み係数を計算する、以下のPythonプログラムを作成します。11〜21行目の定数部分は、お使いの環境に合わせて適宜修正してください。プログラムの説明はコメントを見て下さい😊

②プログラムの実行

プログラムが完成したら以下のように実行します。「25枚の画像を撮影します。cキーで撮影。qキーで終了。」と表示されたら、カメラにチェスボード全体が映るようにして、キーボードの「c」キーを押します。

そして、チェスボードの位置をずらしながら25枚の写真を撮影します。魚眼レンズは端っこが大きくずれるので、カメラの四隅にチェスボードが多く映るようにして撮影するのがポイントです。25枚の写真を撮り終えたら、カメラの補正係数が、画面と「camera.csv」と「dist.csv」に出力されます。

これでカメラの歪み係数の取得は完了です。出力されたファイルの数字を見ても意味は分かりませんが、まあ良し(笑)

魚眼レンズの歪み補正処理

それでは、取得したカメラの歪み係数を使って画像補正を行います。

①プログラムの作成

カメラで撮影した画像に歪み補正を行い画像ファイルとして保存するプログラムを作成します。11〜16行目の定数部分は、お使いの環境に合わせて修正して下さい。

②プログラムの実行

プログラムを作成したら、早速実行してみます。「画像を撮影します。cキーで撮影。qキーで終了。」と表示されたら、キーボードの「c」キーを押します。

すると、写真が撮影され、魚眼補正がされた画像がファイルに保存されます。保存されたファイルを開いてみると、ちゃんと魚眼レンズの補正が行われ、まっすぐな写真になっている事が確認できます。

以上で魚眼レンズの補正は完了です。

おわりに

今回は、魚眼レンズで撮影した写真について、OpenCVを用いて歪み補正を行う方法を紹介しました。魚眼レンズの補正を行うことで、広範囲に撮影した画像から物体検知や動体検知が可能となります。

今回は静止画での歪み補正ですが、動画でも同じで、フレーム毎に歪み補正を行えばOKです。ただし、動画の場合にはフレーム数が圧倒的に多いので、CPUを使った補正処理では処理が追いつかない事が想定されます。動画の場合については、別途まとめたいと思います。

関連記事

記事が参考になったら、ブログランキングに協力(クリック)して貰えると嬉しいです。
スポンサーリンク
naka-kazz

昼間はIT企業に勤めてますが、プライベートでは「育児×家事×IoT」をテーマに家のスマートホーム化に取り組んでいます。Androidアプリも作っているので使って下さい。質問・コメントは、↓のコメント蘭でもFacebookメッセンジャーでもどちらでも大丈夫です。
E-mail:naka.kazz.d@gmail.com

naka-kazzをフォローする
スマートホーム 開発者向け
naka-kazzをフォローする
育児×家事×IoT

コメント

タイトルとURLをコピーしました