名称 MIRS1001 技術調査 テンプレートマッチングについて
番号 MIRS1001-TECH-0002

最終更新日:2010.10.1

版数 更新日 作成 承認 改訂記事
A01 2010.10.1 古橋 古橋 初版

サンプルコード
これを用いて、画像のテンプレートマッチングでの動作を確認できる。また、(2)のプログラムを抜いてMIRSに導入することもできるだろう。



#include
#include

int
main (int argc, char **argv)
{
//変数の定義
double min_val, max_val;
//OpenCv専用の変数
CvPoint min_loc, max_loc;
CvSize dst_size;
//ポインタの定義
IplImage *src_img, *tmp_img, *dst_img;

if (argc != 3 ||
(src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR)) == 0 ||
(tmp_img = cvLoadImage (argv[2], CV_LOAD_IMAGE_COLOR)) == 0)
return -1;

// (1)探索画像全体に対して,テンプレートのマッチング値(指定した手法に依存)を計算
dst_size = cvSize (src_img->width - tmp_img->width + 1, src_img->height - tmp_img->height + 1);
dst_img = cvCreateImage (dst_size, IPL_DEPTH_32F, 1);
cvMatchTemplate (src_img, tmp_img, dst_img, CV_TM_CCOEFF_NORMED);
cvMinMaxLoc (dst_img, &min_val, &max_val, &min_loc, &max_loc, NULL);

// (2)テンプレートに対応する位置に矩形を描画
cvRectangle (src_img, max_loc,
cvPoint (max_loc.x + tmp_img->width, max_loc.y + tmp_img->height), CV_RGB (255, 0, 0), 3);
cvNamedWindow ("Image", 1);
cvShowImage ("Image", src_img);
cvWaitKey (0);

cvDestroyWindow ("Image");
cvReleaseImage (&src_img);
cvReleaseImage (&tmp_img);
cvReleaseImage (&dst_img);

return 0;
}



// (1)探索画像全体に対して,テンプレートのマッチング値(指定した手法に依存)を計算
読み込まれた探索画像とテンプレート画像を用いて,テンプレートマッチングを行う.
マッチングに利用する相関関数には,CV_TM_SQDIFF,CV_TM_SQDIFF_NORMED, CV_TM_CCORR,CV_TM_CCORR_NORMED,CV_TM_CCOEFF,CV_TM_CCOEFF_NORMED(),が指定可能である.
今回は,CV_TM_CCOEFF_NORMEDを指定している.これは,各比較領域の輝度値の平均が等しいと仮定した場合の相関演算式の近似である.
詳しくは,リファレンスを参照すること.マッチングは,関数cvCalcBackProjectionPatch()と似ているが,あらかじめヒストグラムを計算するような前処理は必要ではない.
画像中の値の最大,最小値,およびその位置は,関数cvMinMaxLoc()によって取り出す.
CV_TM_CCOEFF_NORMEDを指定した場合には,最大値の座標がマッチング位置になる.
また,CV_TM_SQDIFF(SSDとも呼ばれる),CV_TM_SQDIFF_NORMEDを指定した場合には,最小値の座標がマッチング位置になる.

// (2)テンプレートに対応する位置に矩形を描画
探索画像中の求められた座標位置に矩形を描画する.
その画像を表示し,何かキーが押されるまで待つ. これにより、入力画像がどこで認識されタカを見ることができる。

//(3)テンプレートマッチングの補足
cvCvtColor(imgA, imgB, CV_GRAY2BGR);でグレースケール化。(カラーの必要はないので、処理を軽くする)
cvMatchTemplate( imgA, imgT, result, CV_TM_SQDIFF);でテンプレートマッチングを行う。
この関数の最後の引数を
CV_TM_SQDIFFとすると、SSD(輝度差の二乗和)で
CV_TM_CCORR_NORMEDにするとNCC(正規化相互相関関数)で計算を行う。
もっとも類似度の高い点はcvMinMaxLoc関数を使うことで取得する。




沼津工業高等専門学校 電子制御工学科