これまで、位相画像の生成や、位相限定相関法(POC; Phase Only Correlation Method)の実装などを、シコシコとやってきた訳ですが・・・。
なんとっ! OpenCVの関数として、位相限定相関法が提供されていることが分かりました。
#もっと早く気づけば良かった。0xF9D3
(まぁ、原理が分かっただけでも良しとしましょう)
位相限定相関法の関数(phaseCorrelate())を含むソースファイルは、以下のフォルダに格納されています。
\opencv-2.4.10\sources\modules\imgproc\src\phasecorr.cpp
関数phaseCorrelate()自体の解説は、こちら。
評価用の画像の原画像(1920×1080)です。
前回同様、青枠から赤枠へのシフト量を推定します。
プログラムです。(PhaseOnlyCorrelation.cpp)
関数phaseCorrelate()は、2つのグレースケール画像と、窓関数の配列を与えると、X方向およびY方向の「シフト量」と、5×5のマトリクスの重心における「ピーク値」を返します。
(ピーク値はオプション)
窓関数は、サンプルに準じて、ハニング窓(hanning window)を使っています。
実行結果です。
X: -39.7915[pixel]Y: -19.2599[pixel]
前回の自作の関数では、整数値までしか推定できませんでしたが、関数phaseCorrelate()では、サブピクセルまで(小数点以下まで)推定できています。
実際のシフト量は、X: 39.5910, Y: 19.4600ですから、X方向, Y方向とも、±0.20[pixel]程度の誤差で推定できています。
#すばらしい!0xF9CB
推定精度の高さと、関数の組み込みの簡単さに気を良くして、つぎの実験にいってみます。
上記の検証に用いた2つの画像は、同一の画像から切り出したものであり、外部からの撹乱などの影響のない、いわば“きれいな”画像でした。
それでは、実際の画像ではどうでしょうか。
#やっとここまで辿り着きましたが、いまの研究“ビジョン”からすると、まだ富士山二合目ぐらいかと。0xF9C7
まずは、評価用の画像を作ります。
カメラ左側の画像のうち、右から1/4を切り出します。(480×1080)
上記同様、カメラ右側の画像のうち、左から1/4を切り出します。
2つの画像の位相限定相関の実行結果です。
X: -192.355[pixel]Y: 46.7339[pixel]
ピーク値(最大値:1.0)は、0.11305となっていることから、「あまり似てないよ」といわれています。
シフト量の推定値を元に、2つの画像をマージした画像です。
#なんとなく、合っているようで合っていない感じ?0xF9C7
画像の撮影時は、カメラ(αNEX-5R)を三脚の雲台に固定し、そのまま左右にパンしたはずなのですが、けっこう上下にズレています。
とはいえ、だいぶイメージに近づいてきました。
〔関連情報〕
・【OpenCV】位相限定相関法による画像マッチング(1)
・【OpenCV】ステレオカメラからの画像入力(1)
・【OpenCV】位相画像の生成
・【OpenCV】広角レンズの歪み補正
Post Comment