1、 函数
void matchTemplate(InputArray image,InputArray templ,OutputArray result,int method)
参数一:待搜索图像阵列,且需为8位或者32位浮点型图像
参数二:搜索模板,有相同的类型,且尺寸不大于输入图像
参数三:比较结果的映射图像
参数四:匹配的算法
平方差匹配方法:TM_SQDIFF
归一化平方差匹配法:TM_SQDIFF_NORMED
相关匹配法:TM_CCORR
归一化相关匹配法:TM_CCORR_NORMED
系数匹配法:TM_CCOEFF
归一化相关系数匹配法:TM_CCOEFF_NORMED
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#define WINDOW_NAME1 "原始图"
#define WINDOW_NAME2 "效果图"
using namespace std;
using namespace cv;
Mat g_srcImage,g_templateImage,g_resultImage;
int g_nMatchMethod;
int g_nMaxTrackbarNum = 5;
void on_Matching(int,void *);
int main(int argc,char *argv[])
{
if(argc!=3)
return -1;
g_srcImage = imread(argv[1],1);
g_templateImage = imread(argv[2],1);
namedWindow(WINDOW_NAME1,WINDOW_AUTOSIZE);
namedWindow(WINDOW_NAME2,WINDOW_AUTOSIZE);
createTrackbar("方法",WINDOW_NAME1,&g_nMatchMethod,g_nMaxTrackbarNum,on_Matching);
on_Matching(0,0);
waitKey(0);
return 0;
}
void on_Matching(int,void *)
{
Mat srcImage;
g_srcImage.copyTo(srcImage);
int resultImage_cols = g_srcImage.cols - g_templateImage.cols +1;
int resultImage_rows = g_srcImage.rows - g_templateImage.rows +1;
g_resultImage.create(resultImage_rows,resultImage_cols,CV_32FC1);
matchTemplate(g_srcImage,g_templateImage,g_resultImage,g_nMatchMethod);
normalize(g_resultImage,g_resultImage,0,1,NORM_MINMAX,-1,Mat());
double minValue,maxValue;
Point minLocation,maxLocation,matchLocation;
minMaxLoc(g_resultImage,&minValue,&maxValue,&minLocation,&maxLocation,Mat());
if(g_nMatchMethod==TM_SQDIFF||g_nMatchMethod==TM_SQDIFF_NORMED)
matchLocation = minLocation;
else
matchLocation = maxLocation;
rectangle(g_srcImage,matchLocation,Point(matchLocation.x + g_templateImage.cols,matchLocation.y+g_templateImage.rows),Scalar(0,0,255),2,8,0);
rectangle(g_resultImage,matchLocation,Point(matchLocation.x + g_templateImage.cols,matchLocation.y+g_templateImage.rows),Scalar(0,0,255),2,8,0);
imshow(WINDOW_NAME1,g_srcImage);
imshow(WINDOW_NAME2,g_resultImage);
}
结果图:
来自:opencv3编程入门 毛星云pdf