#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; }