SOARISTO工房 Logo

【OpenCV】位相限定相関法による画像マッチング(2)

 これまで、位相画像の生成や、位相限定相関法(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)を使っています。

OpenCV, Phase Only Correlation

 実行結果です。

   X: -39.7915[pixel]
   Y: -19.2599[pixel]

 前回の自作の関数では、整数値までしか推定できませんでしたが、関数phaseCorrelate()では、サブピクセルまで(小数点以下まで)推定できています。

 実際のシフト量は、X: 39.5910, Y: 19.4600ですから、X方向, Y方向とも、±0.20[pixel]程度の誤差で推定できています。

#すばらしい!0xF9CB

 推定精度の高さと、関数の組み込みの簡単さに気を良くして、つぎの実験にいってみます。

 上記の検証に用いた2つの画像は、同一の画像から切り出したものであり、外部からの撹乱などの影響のない、いわば“きれいな”画像でした。

 それでは、実際の画像ではどうでしょうか。

#やっとここまで辿り着きましたが、いまの研究“ビジョン”からすると、まだ富士山二合目ぐらいかと。0xF9C7

 まずは、評価用の画像を作ります。

OpenCV, Phase Only Correlation, Porsche 911 Carrera S, Left Side

 カメラ左側の画像のうち、右から1/4を切り出します。(480×1080)

OpenCV, Phase Only Correlation, Porsche 911 Carrera S, Right Side

 上記同様、カメラ右側の画像のうち、左から1/4を切り出します。

OpenCV, Phase Only Correlation, Result

 2つの画像の位相限定相関の実行結果です。

   X: -192.355[pixel]
   Y: 46.7339[pixel]

 ピーク値(最大値:1.0)は、0.11305となっていることから、「あまり似てないよ」といわれています。

OpenCV, Phase Only Correlation, Porsche 911 Carrera S, Result
(クリックで拡大)

 シフト量の推定値を元に、2つの画像をマージした画像です。

#なんとなく、合っているようで合っていない感じ?0xF9C7

 画像の撮影時は、カメラ(αNEX-5R)を三脚の雲台に固定し、そのまま左右にパンしたはずなのですが、けっこう上下にズレています。

 とはいえ、だいぶイメージに近づいてきました。

〔関連情報〕
   ・【OpenCV】位相限定相関法による画像マッチング(1)
   ・【OpenCV】ステレオカメラからの画像入力(1)
   ・【OpenCV】位相画像の生成
   ・【OpenCV】広角レンズの歪み補正

Trackback(0)

Trackback URL: http://www.soaristo.jpn.org/mt/mt-tb.cgi/1002

Post Comment