opencv 不支持旋转模板匹配详解

模板匹配

模板匹配是一种用于查找与模板图像匹配(相似)的图像区域的技术。
匹配的规则:
1.首先需要两张图像,
一张源图像(I):我们期望在其中找到与模板图像匹配的图像,
一张模板图像 (T):将与源图像进行比较的模板图像
2.然后,我们的目标是检测出最匹配的区域:,将模板图像在源图像上进行滑动计算比较。从左到右,从上到下。在每个位置,计算一个度量值,以表示该位置匹配的“好”或“坏”程度(或该模板与源图像的特定区域的相似程度)。将匹配存储在结果矩阵R中。R中的每个位置(x,y)包含匹配度
opencv 不支持旋转模板匹配详解
:3.最后,求出R中值最大的位置。如下图:最亮的位置表示匹配程度最高。红色圆圈标记的位置可能是值最高的位置。
opencv 不支持旋转模板匹配详解

一、opencv 函数支持

1. matchTemplate()函数

比较模板和重叠图像区域。
函数原型:

CV_EXPORTS_W void matchTemplate( InputArray image, InputArray templ,
                                 OutputArray result, int method, InputArray mask = noArray() );

参数说明:
image:搜索运行的图像。必须为8位或32位浮点数。
template:搜索模板。它必须不大于源图像并且具有相同的数据类型。
result:比较结果的映射。它必须是单通道32位浮点数。
method:指定比较方法的参数,参见#TemplateMatchModes
mask:搜索模板的掩码。它必须具有与templ相同的数据类型和大小。默认情况下没有设置。目前只有两个匹配方法接受掩码:TM_SQDIFF和TM_CCORR_NORMED
目前支持六种更好的方法:
TM_SQDIFF
opencv 不支持旋转模板匹配详解
TM_SQDIFF_NORMED
opencv 不支持旋转模板匹配详解
TM_CCORR
opencv 不支持旋转模板匹配详解
TM_CCORR_NORMED
opencv 不支持旋转模板匹配详解
TM_CCOEFF
opencv 不支持旋转模板匹配详解
opencv 不支持旋转模板匹配详解
TM_CCOEFF_NORMED
opencv 不支持旋转模板匹配详解
以上六种方法中,除了TM_SQDIFF和TM_SQDIFF_NORMED两中方法计算的结果,值越小,匹配度越高之外,其他4种方法的计算结果越大,匹配度越高。

2.minMaxLoc()

求取最小值和最大值以及坐标位置,可以采用opencv 提供的函数minMaxLoc();
函数原型:

CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT double* minVal,
                            CV_OUT double* maxVal = 0, CV_OUT Point* minLoc = 0,
                            CV_OUT Point* maxLoc = 0, InputArray mask = noArray());

参数说明:
src:输入单通道数组。
minVal:指针指向返回的最小值;如果不需要,则使用NULL。
maxVal:指针指向返回的最大值;如果不需要,则使用NULL。
minLoc:指针返回的最小位置(在2D的情况下);如果不需要,则使用NULL。
maxLoc:指针,指向返回的最大位置(在2D情况下);如果不需要,则使用NULL。
mask:可选掩码。

二、代码示例:

    cv::Mat src = cv::imread("D:\\QtProject\\Opencv_Example\\matchTemplate\\adrian.jpg", cv::IMREAD_COLOR);
    if (src.empty()) {
      cout << "Cannot load image" << endl;
      return;
    }
    imshow("src",src);

    cv::Mat templ = cv::imread("D:\\QtProject\\Opencv_Example\\matchTemplate\\BlueCup.jpg", cv::IMREAD_COLOR);
    if (templ.empty()) {
      cout << "Cannot load image" << endl;
      return;
    }
    imshow("templ",templ);

     cv::Mat targetMat[6];
     cv::Mat image_color[2];
     image_color[0] = src.clone();
     image_color[1] = src.clone();

    for (int i = 0; i < 6; ++i) {
        cv::matchTemplate(src, templ, targetMat[i], i);
        cv::normalize(targetMat[i], targetMat[i], 1, 0, cv::NORM_MINMAX);
    }


    double minVal, maxVal;
    cv::Point minLoc, maxLoc;
    //寻找最佳匹配位置
    cv::minMaxLoc(targetMat[1], &minVal, &maxVal, &minLoc, &maxLoc);
    cv::circle(image_color[0], cv::Point(minLoc.x + templ.cols / 2, minLoc.y + templ.rows / 2), 20, cv::Scalar(255, 0, 0), 2, 8, 0);
    cv::imshow("SQDIFF_NORMED_color", image_color[0]);


    //寻找最佳匹配位置
    cv::minMaxLoc(targetMat[4], &minVal, &maxVal, &minLoc, &maxLoc);
    cv::circle(image_color[1], cv::Point(maxLoc.x + templ.cols / 2, maxLoc.y + templ.rows / 2), 20, cv::Scalar(0, 255, 0), 2, 8, 0);
    cv::imshow("CCOEFF_color", image_color[1]);


    cv::imshow("SQDIFF_NORMED", targetMat[1]);
    cv::imshow("CCOEFF", targetMat[4]);

程序运行效果:
模板:
opencv 不支持旋转模板匹配详解

结果图:
opencv 不支持旋转模板匹配详解

opencv 不支持旋转模板匹配详解

opencv 不支持旋转模板匹配详解

opencv 不支持旋转模板匹配详解

参考文章:https://docs.opencv.org/4.x/de/da9/tutorial_template_matching.html

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年3月18日 下午2:26
下一篇 2022年3月18日 下午2:45

相关推荐