【 OpenCV 】MatchTemplate函数参数详解及原理分析

【 OpenCV 】MatchTemplate函数参数详解及原理分析

模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标。OpenCV提供了6种模板匹配算法。

MatchTemplate

MatchTemplate(InputArray image, InputArray templ, OutputArray result, int method);

​ image:输入一个待匹配的图像,支持8U或者32F。

​ templ:输入一个模板图像,与image相同类型。

​ result:输出保存结果的矩阵,32F类型。

​ method:要使用的数据比较方法。

1.result:

result是一个结果矩阵,假设待匹配图像为 I,宽高为(W,H),模板图像为 T,宽高为(w,h)。那么result的大小就为(W-w+1,H-h+1) 。

img

2.method

img

场景适用原理分析

cv::TM_SQDIFF 判断 minVal 越小,效果越好
计算模板与目标图像的方差,由于是像素值差值的平方的和,所以值越小匹配程度越高;

cv::TM_SQDIFF_NORMED 判断 minVal 越接近0,效果越好
范化的cv::TM_SQDIFF,取值为0-1之间,完美匹配返回值为0;

cv::TM_CCORR 判断 maxVal 越大,效果越好
使用dot product计算匹配度,越高匹配度就好;

cv::TM_CCORR_NORMED 判断 maxVal 越接近1,效果越好
范化的cv::TM_CCORR,0-1之间,我用的这个;

cv::TM_CCOEFF 判断 maxVal 越大,效果越好
采用模板与目标图像像素与各自图像的平均值计算dot product,正值越大匹配度越高,负值越大图像的区别越大,但如果图像没有明显的特征(即图像中的像素值与平均值接近)则返回值越接近0;

cv::TM_CCOEFF_NORMED 判断 maxVal 越接近1,效果越好
范化的cv::TM_CCOEFF,-1 ~ 1之间。

优缺点与适用场景:

TM_CCORR:

**互相关算法**(cross-correlation)是一种经典的统计匹配算法,通过计算模板图像和匹配图像的互相关程度,来确定匹配的程度。互相关程度最大时的搜索窗口位置决定了模板图像在待匹配图像中的位置。

特点
擅长区分出(有颜色差异的)不同区域。

TM_SQDIFF:

误差平方和算法(Sum of Squared Differences,简称SSD算法),也叫差方和算法

优点

  1. 思路简单,容易理解(子图与模板图对应位置上,灰度值之差的绝对值总和,再求平均)。
  2. 运算过程简单,匹配精度高。

缺点

  1. 运算量偏大。
  2. 对噪声非常敏感。

TM_CCOEFF

均值漂移的互相关算法(Mean shifted cross correlation [Pearson correlation coefficient])。是互相关算法(cross correlation)和均值漂移算法的结合。

优点
算法计算量小,简单易实现,很适合于实时跟踪场合

缺点
跟踪小目标和快速移动目标时常常失败,而且在全部遮挡情况下不能自我恢复跟踪

TM_CCORR_NORMED

归一化互相关(Normalized Cross Correlation method, NCC)匹配算法。

它是一个亮度、对比度线性不变量。

此算法的缺点是参与运算的特征点比较多,运算速度比较慢。

其他归一化算法

TM_SQDIFF_NORMED`和 `TM_CCOEFF_NORMED

实验比较

使用trackbar调节不同method

const char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";
createTrackbar(trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod);
MatchingMethod(0, 0);

模板匹配

void MatchingMethod(int, void*)
{
    Mat img_display;
    img.copyTo(img_display);
    int result_cols = img.cols - templ.cols + 1;
    int result_rows = img.rows - templ.rows + 1;
    result.create(result_rows, result_cols, CV_32FC1);
    matchTemplate(img, templ, result, match_method);
    normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());//将结果归一化防止溢出,显示
    double minVal; double maxVal; Point minLoc; Point maxLoc;
    Point matchLoc;
    minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());//不同方法对应最小值与最大值不同
    if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED)
    {
        matchLoc = minLoc;
    }
    else
    {
        matchLoc = maxLoc;
    }
    rectangle(img_display, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar::all(0), 2, 8, 0);//绘制矩形
   // rectangle(result, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar::all(0), 2, 8, 0);
    imshow(image_window, img_display);
    imshow(result_window, result);
    imshow("template", templ);
    return;
}

实验结果

TM_SQDIFF(mode 0)和TM_CCOEFF_NORMED(mode 5)进行对比:

TM_SQDIFF:

Snipaste_2021-11-19_11-36-21

0对应最匹配位置;

TM_CCOEFF_NORMED:

Snipaste_2021-11-19_11-36-37

1对应最匹配位置;

模板颜色改变后:

temp3

temp2

TM_CCORR(mode2)颜色区分不明显造成匹配错误:

image-20211119153435453

TM_CCORR_normal(3)正确:

image-20211119153624622

不同的匹配值不同,但大体能识别出正确的区域。

使用自己头像形变测试形变对于模板匹配的影响,结果上面大致相同。

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: OpenCV中的matchTemplate()函数被广泛用于在图像中查找模板的位置。然而,它在进行模板匹配时常常受限于旋转角度。 在OpenCV中,可以使用旋转矩阵的概念来解决这个问题。首先,通过cv::warpAffine()函数将模板和待匹配的图像旋转到一定角度,然后再使用matchTemplate()函数进行匹配。 当匹配模板时,可以使用不同的旋转角度来生成多个匹配结果。最后,可以选择与实际角度最接近的匹配结果。 然而,这种方法仍然存在一些问题。当旋转角度较大时,匹配结果的准确性会受到影响。另外,这种方法可能需要重复计算,导致匹配速度变慢。 因此,在OpenCV中进行模板匹配时,应该权衡精度和效率,选择适当的方法来解决旋转角度问题。 ### 回答2: OpenCVmatchTemplate函数是在一个图像上搜索某个模板图像的函数。它使用一个滑动窗口来遍历整个图像,并在每个窗口位置上计算与模板的匹配程度。通过比较相邻像素的颜色和强度等信息,对两张图片进行特征对比,从而得到匹配结果。 而在进行匹配时,由于图像中存在旋转或者平移等变换,因此往往需要对模板图像进行相应的旋转和平移处理。这时候我们就可以利用OpenCV中的角度参数。通过对模板图像进行旋转,可以找到最佳匹配角度,并将其调整到正确的方向。同时也可以通过调整角度来避免图像中出现的微小变形,以提高匹配精度。 通常情况下,我们可以通过比较不同角度下的匹配度来确定最佳角度,并将其应用到实际的应用场景中。在OpenCV中,常见的角度参数包括旋转角度、仿射变换等,可以应用于图像处理、模板匹配、图像跟踪等多个方面,提高了图像处理的速度和精度,也为实际应用带来了很多便利。 ### 回答3: OpenCV MatchTemplate 角度是一个图像处理技术,用于在大型图像或视频流中寻找单个图像或物体的位置。通过匹配给定模板与输入图像中的所有可能位置,MatchTemplate 可以找到与模板最相似的部分。 MatchTemplate 可以实现对不同数量的通道和深度的图像进行处理,并提供了多种不同的匹配方法,包括平方差匹配、归一化平方差匹配、相关性匹配和归一化相关性匹配。 在处理复杂图像时,MatchTemplate 的一个关键问题是处理图像中可能存在的旋转和变形。为了解决这个问题,可以使用旋转校正和缩放技术,或者使用角度计算和模板匹配技术来进行匹配。这些技术可以帮助更准确地确定模板在输入图像中的位置,并提高图像处理过程的效率和准确性。 因此,OpenCV MatchTemplate 角度是一项关键的图像处理技术,可用于在复杂图像中定位单个图像或物体,并提供许多不同的匹配方法和技术来提高准确性和处理效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值