はじめに
広範囲の画像を撮影したい時に利用する魚眼レンズですが、撮影した画像は歪んでしまいます。前回の記事では、OpenCVとPythonを使って魚眼レンズで撮影した画像の補正処理を行う方法をご紹介しました。今回は、Gstreamerのcameracalibrateエレメントを用いて魚眼レンズの歪みを補正する方法をご紹介します。
cameracalibrateエレメントについては、英語を含めてほとんど情報が無く、ソースコードを読んで解読しましたので、ここにまとめておきます💦
用意するもの
①ボードコンピュータ
カメラで画像を撮影して、撮影した画像の歪み補正を行うコンピュータが必要です。Raspberry PiやJetson nanoなどのボードコンピュータが良いでしょう。今回はJetson nanoを用いて説明していきます。
②魚眼レンズ付きカメラモジュール
今回の主役の魚眼レンズ付きカメラモジュールです。今回は180度まで撮影可能な以下のカメラを使います。USB接続で、4K@30fpsまでの動画撮影にも対応しています。
用意するものは、以上の2点です。
Gstreamerを用いた歪み補正の方法
Gstreamerを用いた歪み補正についても、OpenCVによる歪み補正と基本的には同じです。Gstreamerでは、予め歪み補正のためのエレメントであるcameracalibrateが予め用意されているのでプログラムを記載する必要はありません。
準備
まずは、歪み補正をするために各種準備を行います。
①チェスボードの準備
Gstreamerの歪み計算もOpenCVと同じく、白黒の均等な四角が描かれたチェスボードを撮影して、四角の歪み具合を検出することで行います。このため、歪み計算を行うためには、チェスボードを用意する必要があります。チェスボードなんて家にない!と思った方、安心してください。このリンクからPDFをダウンロードして印刷すればOKです。印刷したチェスボードは、一つの四角の大きさ(ミリ)を定規で測っておいて下さい。
②Gstreamerのアップグレード
Jetson nanoには、Gstreamerがインストール済みです。ただし、Jetson nanoにインストールされているGstreamerのバージョンは1.14.5であり、このバージョンにはcameracalibrateエレメントが含まれていません。そこで、Gstreamerのアップグレードを行います。
まずは、Gstremaerのアップグレードに必要な「libssl-dev」をインストールします。
1 2 |
#apt-get install libssl-dev |
次に「gst-install」コマンドを用いてGstreamerの1.16.2をインストールします。コンパイル&インストールには40分ほどかかるので、ご飯でも食べながら待ちましょう😊
1 2 |
#gst-install --prefix=/root/gst-1.16.2 --version=1.16.2 ・・・・省略・・・・ |
インストールが完了したら、新しいGstreamerにパスを通しましょう。
1 2 |
$export LD_LIBRARY_PATH=/root/gst-1.16.2/lib/aarch64-linux-gnu $export PATH=/root/gst-1.16.2/bin:$PATH |
以下のように、1.16.2とバージョンが確認できればOKです。
1 2 3 |
$ gst-launch-1.0 --version gst-launch-1.0 version 1.16.2 GStreamer 1.16.2 |
以上で準備は完了です。
Gstreamerを用いた歪み補正処理
それでは、Gstreamerを用いて歪み補正処理を実行しましょう。
①パイプラインの実行
USBカメラから動画を取得し、魚眼レンズの歪みを補正する処理を行うパイプラインは以下のようになります。「cameracalibrate」の後の「board-height」と「board-width」はチェスボードの縦・横の四角の数、「square-size」は一つの四角の大きさ(ミリ)です。
1 2 3 4 5 |
$gst-launch-1.0 -e v4l2src device=/dev/video0 io-mode=2 ¥ ! image/jpeg, width=800, height=600, framerate=30/1 ! nvv4l2decoder mjpeg=1 ¥ ! 'video/x-raw(memory:NVMM),format=NV12'! nvvidconv !'video/x-raw,format=RGBA' ¥ ! cameraundistort ! cameracalibrate board-height=7 board-width=10 square-size=23.0 ¥ ! videoconvert ! 'video/x-raw,format=I420'! fpsdisplaysink |
②チェスボードの読み込み
パイプラインを実行すると、以下のように、画面右下に青字で「0/25」と表示されます。これは、補正処理に必要なチェスボード画像の枚数になります。
そこで、カメラの前にチェスボードを持っていき、チェスボードを撮影します。すると、下の写真のようにチェスボードを認識し、各四角の位置を検出して歪みを計算してくれます。そして、右下の数字が「1/25」というように数字が上がっていきます。魚眼レンズは、端の方が歪みが大きくなりますんので、四隅を中心に撮影するのがポイントです。
③補正処理の実行
25枚のチェスボードが撮影できると、カメラの歪み情報の計算が行われ、画面右下に「calibrated」と表示されます。歪み情報の計算には10〜30秒ほどかかるので、この間は映像が固まったかのように見えます。その後は、計算した歪み情報を用いて補正処理が行われた映像が表示されます!
④作業の動画
参考までに、cameracalibrateを行う作業の一連の流れを撮影した動画を上げておきます。動画の3秒〜25秒目までで、チェスボードの撮影をしています。その後、48秒目までで補正情報の計算が行われ、49行目からは歪み補正が行われた映像が表示されています。
さいごに
今回はGstreamerのcameracalibrateエレメントを用いた魚眼レンズの歪み補正方法をご紹介しました。プログラムを作成することなく簡単に歪み補正ができるのは良いですが、撮影を開始するたびにチェスボードを25枚撮影するのは手間で、なかなか実用では使えません。
また、内部的にはOpenCVを用いているので、CPUによる補正計算が必要で、フルHDや4Kではフレームレートが出ず、使い物になりません。そこで、次回は補正処理部分をGPUで行いスピードアップを検討したいと多います。
コメント