#include<iostream>
#include<opencv2/opencv.hpp>
#define window1 "【原始图像】"
#define window2 "【模板图像】"
using namespace std;
using namespace cv;
int bin = 30;
void matche(int,void*);
Mat image;
Mat mod;
Mat resultmap;
Mat himage;
int method = 0;
int maxmethod = 5;//一共六中匹配方法,0-5,分别平法差,归一化平方差,相关关系,归一化相关关系,系数,归一化系数。
//模板匹配(并非根据直方图来进行)
int main()
{
//1.载入原图和模板
image = imread("猴子.jpg");
mod = imread("猴脸.jpg");
imshow("x",image);
imshow("xx",mod);
//2.创建窗口
namedWindow(window1);
namedWindow(window2);
//3.创建滑动窗口以及初始化回调函数。
createTrackbar("匹配方式", window1, &method, maxmethod, matche);
waitKey(0);
return 0;
}
void matche(int, void*)
{
//4.给局部变量初始化。
Mat src;
image.copyTo(src);
//5.准备结果矩阵,存放最后比较结果的矩阵。
resultmap.create(src.cols - mod.cols + 1,src.rows-mod.rows+1,CV_32FC1);//32f单通道。
//6.进行比较,并且归一化。
matchTemplate(image,mod,resultmap,method);
normalize(resultmap,resultmap,0,1,NORM_MINMAX);//注意,norm_minmax不能缺少。
//7.查找最优位置和最差位置。
double minval, maxval;
Point minp, maxp;
Point matchloc;
minMaxLoc(resultmap,&minval,&maxval,&minp,&maxp);
//8.根据method判别最佳位置。
if (method == 0 || method == 1)
{
matchloc = minp;
}
else
matchloc = maxp;
//9.在原图最佳匹配位置画出方框图。
rectangle(src,matchloc,Point(matchloc.x+mod.cols,matchloc.y+mod.rows),Scalar(255,5,5),2);
rectangle(resultmap,matchloc,Point(matchloc.x+mod.cols,matchloc.y+mod.rows),Scalar::all(255),2);
//10.显示结果。
imshow(window1,src);
imshow(window2,resultmap);
}