
#include <iostream>
#include <filesystem>
#include <string>
#include <windows.h>
#include <opencv2/opencv.hpp>
namespace fs = std::filesystem;
using namespace cv;
using namespace std;
// 模板匹配
void test_matchTemplate()
{
Mat src, templ, dst;
// TM_SQDIFF是平方差匹配、TM_SQDIFF_NORMED是标准平方差匹配。
// 利用平方差来进行匹配,最好匹配为0。匹配越差,匹配值越大。
int Method = cv::TemplateMatchModes::TM_SQDIFF;
int Max_track = 5;
src = imread("F:/opencv/console/x64/Debug/jzh.png"); // 待检测图片
templ = imread("F:/opencv/console/x64/Debug/template.png"); // 模板图片
// 初始化结果图
int width = src.cols - templ.cols + 1;
int height = src.rows - templ.rows + 1;
Mat result(width, height, CV_32FC1);
// 匹配
matchTemplate(src, templ, result, Method, Mat());
normalize(result, result, 1, 0, NORM_MINMAX, -1, Mat());
Point minLoc, maxLoc;
double min, max;
Point temLoc;
minMaxLoc(result, &min, &max, &minLoc, &maxLoc, Mat());
// 根据匹配结果确定最佳的位置,不同的方法对应的最佳位置不同,例如 TM_SQDIFF 像素值最小(黑色)的地方对应最佳的位置
if (Method == cv::TemplateMatchModes::TM_SQDIFF || Method == cv::TemplateMatchModes::TM_SQDIFF_NORMED) {
temLoc = minLoc;
}
else {
temLoc = maxLoc;
}
// 绘制矩形
src.copyTo(dst);
rectangle(dst, cv::Rect(temLoc.x, temLoc.y, templ.cols, templ.rows), cv::Scalar(0, 0, 255), 2, 8);
//rectangle(result, cv::Rect(temLoc.x, temLoc.y, templ.cols, templ.rows), cv::Scalar(0, 0, 255), 2, 8);
//imshow("output", result);
imshow("src", src);
imshow("templ", templ);
imshow("match", dst);
}
int main()
{
// 模板匹配
test_matchTemplate();
waitKey(0);
destroyAllWindows();
return 0;
}