c++ OpenCV 模板匹配 matchTemplate

c++ OpenCV 模板匹配 matchTemplate

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

 

发表回复

您的电子邮箱地址不会被公开。