#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
class mat
{
public:
void match(Mat& src, Mat& dst, int method);
};
int maxmethod = 5;
void mat::match(Mat& src, Mat& dst, int method)
{
//flip(dst, dst, 2);//将模板图左右翻转
//提前为result分配内存
int result_rows = src.rows - dst.rows + 1;
int result_cols = src.cols - dst.cols + 1;
Mat result;
result.create(Size(result_cols, result_rows), CV_32FC3);
matchTemplate(src, dst, result, method);//result是一个数组
//dst1(i,j) = dst(i,j) *alpha / norm (src,norm_type,mask)
normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());
double minval, maxval;
Point minloc, maxloc, loc;
minMaxLoc(result, &minval, &maxval, &minloc, &maxloc, Mat());
//cout << "min=" << minval << " maxval=" << maxval << endl;
if (method == 1 || method == 0)
{
loc = minloc;
}
else
{
loc = maxloc;
}
Rect rect;
rect.x = loc.x;
rect.y = loc.y;
rect.width = dst.cols;
rect.height = dst.rows;
rectangle(src, rect, Scalar(0, 0, 255), 2, 8, 0);
imshow("模板图", dst);
imshow("原图", src);
imshow("匹配结果图", result);
}
// match_method参数设置,模板匹配方法:
// 0,平方差匹配,找最小值,值越接近0,匹配效果越好
// 1,归一化平方差匹配,找最小值,值越接近0,匹配效果越好
// 2,相关性匹配方法,该方法使用源图像与模板图像的卷积结果进行匹配,因此,最佳
// 匹配位置在值最大处,值越小匹配结果越差
// 3,归一化的相关性匹配方法,与相关性匹配方法类似,最佳匹配位置也是在值最大处
// 4,相关性系数匹配方法,该方法使用源图像与其均值的差、模板与其均值的差二者之
// 间的相关性进行匹配,最佳匹配结果在值等于1处,最差匹配结果在值等于-1处,值
// 等于0直接表示二者不相关。
// 5,归一化的相关性系数匹配方法,正值表示匹配的结果较好,负值则表示匹配的效果较
//差,也是值越大,匹配效果也好。
int main()
{
Mat src = imread("D:\\VC\\c++\\opencv源码\\opencv源码\\12.bmp");//读入图像
Mat dst = imread("D:\\VC\\c++\\opencv源码\\opencv源码\\122.bmp");
cout << "******0:平方差匹配*****************" << endl;
cout << "******1:归一化平方差匹配***********" << endl;
cout << "******2:相关性匹配方法*************" << endl;
cout << "******3:归一化的相关性匹配方法*****" << endl;
cout << "******4:相关性系数匹配方法*********" << endl;
cout << "******5:归一化的相关性系数匹配方法*" << endl;
cout << "******6:退出系统*******************" << endl;
while (true)
{
int method;
cout << "*****请输入模板匹配方法************" << endl;
cin >> method;
if (method == 6)
{
return 0;
break;
}
else
{
mat p;
p.match(src, dst, method);
waitKey(100);
}
}
}