またも、前回からだいぶ間が開いてしまいましたが、とある“構想”がありまして、それに向けたスタディーです。
物体を広角レンズで撮影すると、レンズの四隅にいくほど、物体が引っ張られたような「歪み」が生じます。この歪み(レンズ歪み)は、使用するレンズによって、それぞれ特性が微妙に異なります。
レンズ歪みを補正するためには、Photoshopなどに組み込まれているフィルターを使う方法がありますが、これはあくまで簡易的なものであって、使用するレンズに合致したものではありません。
OpenCV(Open Source Computer Vision Library)には、このレンズ歪みの特性(歪み係数)を推定して、画像を補正する関数が備わっています。
最終的には、Jetson TK1上で実時間で動作させるとして、まずはWindows7上でテストすることにしました。
評価用となるカメラです。
Sonyの「αNEX-5R」に、「フィッシュアイ」(VCL-ECU1)と「パンケーキ」(SEL16F28)を組み合わせています。
「OpenCV 2.4.10」と「Visual Studio Express 2012 Update4」とをインストールし、Windows7上(64bit版)で動作させます。
まずは、カメラキャリブレーションのサンプルプログラムを元にして、レンズの歪み係数を推定します。
チェスボードパターンを撮影した画像を複数枚用意し、関数cvFindChessboardCorners()により、チェスボードのコーナーを検出させます。
このコーナーの位置から、関数cvCalibrateCamera2()および関数cvFindExtrinsicCameraParams2()により、三次元のワールド座標系から二次元のカメラ座標系への変換係数を求め、これよりレンズの歪み係数を推定します。
#説明を、かなり端折りましたが。0xF9C7
画像では、検出されたチェスボードのコーナーが七色で表示されています。
つづいて、推定されたレンズの歪み係数から、関数cvUndistort2()により、画像を補正します。
画像は、左側が補正前、右側が補正後です。
歪みが取れている(軽減されている)ことが分かります。
実画像で試してみます。
補正前。
補正後。
補正前。
補正後。
Post Comment