Opencv提供的模板匹配方法:
/* Template matching methods */
enum
{
CV_TM_SQDIFF =0,
CV_TM_SQDIFF_NORMED =1,
CV_TM_CCORR =2,
CV_TM_CCORR_NORMED =3,
CV_TM_CCOEFF =4,
CV_TM_CCOEFF_NORMED =5
};
#include "cv.h"
#include "highgui.h"
using namespace cv;
using namespace std;
int main(int argc,char *argv[])
{
Mat temp,search,result,resultU8;
temp=imread("temp.jpg");
search=imread("search.jpg");
result.create((search.rows-temp.rows+1),(search.cols-temp.cols+1),CV_32FC1);
matchTemplate(search,temp,result,CV_TM_SQDIFF);
normalize(result,result,0,1,NORM_MINMAX);
//convertScaleAbs(result,resultU8);或转CV_8UC1图像
imshow("result",result);
double minVal,maxVal;
Point minIdx,maxIdx;
minMaxLoc(result,&minVal,&maxVal,&minIdx,&maxIdx);
cout<<"min:"<<minIdx<<":"<<minVal<<";max:"<<maxIdx<<":"<<maxVal<<endl;
rectangle(search,minIdx,Point(minIdx.x+temp.cols-1,minIdx.y+temp.rows-1),Scalar(0,255,255),2);
imshow("search",search);
waitKey(0);
destroyAllWindows();
return 0;
}
注意,本实验采用是直接从search图像截取模板,这样匹配效果是很好的,实际的模板都是大众化。
尽管这样,CV_TM_CCORR方法获取的结果是错误的!
下面展示程序效果:(其他两类方法的匹配的位置应有最大值)