SOARISTO工房 Logo
nVIDIA Jetson TK1 Archive

 これまで、位相画像の生成や、位相限定相関法(POC; Phase Only Correlation Method)の実装などを、シコシコとやってきた訳ですが・・・。

 なんとっ! OpenCVの関数として、位相限定相関法が提供されていることが分かりました。

#もっと早く気づけば良かった。0xF9D3
 (まぁ、原理が分かっただけでも良しとしましょう)

 位相限定相関法の関数(phaseCorrelate())を含むソースファイルは、以下のフォルダに格納されています。

   \opencv-2.4.10\sources\modules\imgproc\src\phasecorr.cpp

 関数phaseCorrelate()自体の解説は、こちら。

OpenCV, Phase Only Correlation, Porsche 911 Carrera S

 評価用の画像の原画像(1920×1080)です。

 前回同様、青枠から赤枠へのシフト量を推定します。

 プログラムです。(PhaseOnlyCorrelation.cpp)

 関数phaseCorrelate()は、2つのグレースケール画像と、窓関数の配列を与えると、X方向およびY方向の「シフト量」と、5×5のマトリクスの重心における「ピーク値」を返します。
(ピーク値はオプション)

 窓関数は、サンプルに準じて、ハニング窓(hanning window)を使っています。

 前々回では、画像をフーリエ変換し、その周波数スペクトルから位相情報を抽出し、逆フーリエ変換することにより、位相画像(輪郭画像のようなもの)を生成しました。

 2つの画像があり、この2つの画像の間が「どれぐらいずれているか」(画像のシフト量)を推定しようとする際、この位相画像を用いて推定する方法があります。

 「位相限定相関法」(POC; Phase Only Correlation Method)です。

 その名のとおり、2つの画像の位相に注目して相関を取り、2つの画像の間の「類似度」を測る方法です。

 位相限定相関法の概念については、以下のサイトに分かりやすくまとめられています。

 位相限定相関法の処理手順は、以下のようになります。

OpenCV, Phase Only Correlation

 2つの画像をフーリエ変換し、その周波数スペクトルから位相情報を抽出します。抽出された2つの位相情報から、その畳み込み(合成積)を取り、振幅で正規化します。これを逆フーリエ変換することにより、位相限定相関画像を得ます。

 画像Aをfa、画像Bをfbとすると、それぞれの画像の離散フーリエ変換(Discrete Fourier Transform)は、以下の式で表されます。

Phase Only Correlation Formula

 得られた空間周波数スペクトル(複素平面)同士の畳み込み(合成積)を取り、その振幅の絶対値で除することにより正規化します。
(掛け合わせるもう片方の複素平面は、複素共役とします)

Phase Only Correlation Formula

 この合成積の複素平面を逆離散フーリエ変換することにより、位相限定相関画像rabを得ます。

Phase Only Correlation Formula

 この位相限定相関画像におけるピークを示す位置が、そのまま2つの画像のシフト量を表しています。

 さっそく、OpenCVで位相限定相関法を試すことにしますが、その前に、評価用の画像として、以下の2つの画像を用意しました。

OpenCV, Phase Only Correlation, Porsche 911 Carrera S

 評価用の画像の原画像(1920×1080)です。

 ソフトの開発に平行して、ハードの準備です。

Buffalo Web Camera BSW20KM11BK, Stereo Image Processing, OpenCV

 BuffaloのWebカメラ、「BSW20KM11BK」です。(定価:7,236円、購入価格:3,015円×2台)

#「会議に最適」とありますが、もちろん会議には使いません。0xF9C7

 2012年7月の発売で、有効画素数は200万画素。いまとなってはスマホより劣りますが、特徴はなんといってもその画角。水平画角が120°もあります。

 これだけの画角があれば、2台を連接させることにより、人間の視野角(約180°~200°)を優に超えるワイドビュー(広角映像)を得ることができます。0xF8F2

Buffalo Web Camera BSW20KM11BK, Stereo Image Processing, OpenCV

 ということで、試しにモニタ上にセットし、さっそく映像をチェック。
(少し外向きにセット)

 んが、しかし・・・。0xF9FC

 レンズも、安っしーWebカメラに使われているプラスチックレンズではなく、ガラスレンズが使われているので、ひそかに期待していたのですが、惨憺たる結果に。

 ガラスレンズは良かったのですが、フォーカスがマニュアルのため、注視する対象物に合わせていちいち調整しなければならず(レンズの外周部分を持って左右に回す)、結果として“アマアマ”な画質になってしまいます。

 仕方がないので、ちゃんとしたWebカメラを買うことにしました。

#まさに、「安物買いの銭失い」とは、このことぞ。0xF9D3

 前回の続きです。OpenCVの関数を使って、位相画像を生成してみます。 

 画像をfとすると、fの離散フーリエ変換(Discrete Fourier Transform)は、以下の式で表されます。

Discrete Fourier Transform Formula

 得られた空間周波数スペクトル(複素平面)を、その振幅の絶対値で除することにより正規化します。

Discrete Fourier Transform Formula

 この複素平面を逆離散フーリエ変換することにより、位相画像rを得ます。

Discrete Fourier Transform Formula

 複素平面における正規化により、振幅信号(情報)が1になり、位相信号(情報)が残ることになります。

 さっそく検証してみます。

OpenCV Phase Only Correlation lena

 まずは評価用の画像。

#画像処理の世界では最も有名(?)な女性、Lenaさんです。0xF9CB

OpenCV Phase Only Correlation lena

 空間周波数スペクトルの画像。
(ハン窓を掛けてから離散フーリエ変換(cvDFT())し、四象限を入れ替え(cvShiftDFT())てあります)

 またも、前回からだいぶ間が開いてしまいましたが、とある“構想”がありまして、それに向けたスタディーです。

Camera Lens Distortion

 物体を広角レンズで撮影すると、レンズの四隅にいくほど、物体が引っ張られたような「歪み」が生じます。この歪み(レンズ歪み)は、使用するレンズによって、それぞれ特性が微妙に異なります。

 レンズ歪みを補正するためには、Photoshopなどに組み込まれているフィルターを使う方法がありますが、これはあくまで簡易的なものであって、使用するレンズに合致したものではありません。

 OpenCV(Open Source Computer Vision Library)には、このレンズ歪みの特性(歪み係数)を推定して、画像を補正する関数が備わっています。

 最終的には、Jetson TK1上で実時間で動作させるとして、まずはWindows7上でテストすることにしました。

Sony αNEX-5R

 評価用となるカメラです。

 Sonyの「αNEX-5R」に、「フィッシュアイ」(VCL-ECU1)と「パンケーキ」(SEL16F28)を組み合わせています。