模板匹配的原理

模板匹配可以说是一种最简单的模式识别方法,它的实现主要是通过模板图像在被匹配图像中的平移,在被匹配图像中逐个区域寻找和模板图像相似的区域,如果存在某区域的相似度大于一定的阈值,则表明该区域和模板图像是相匹配的。
但是模板匹配这种方式具有很大的自身局限性:

首先它利用一个规定好的模板进行匹配,这就导致了想要匹配出来的结果必须在大小和角度上和模板图像一模一样,一旦原图像中的匹配目标发生旋转或大小变化,就会导致匹配准确率急剧下降。

而且模板图像在原图像中进行移动的时候,只能够平行地上、下、左、右移动,对于有经过投影变换的图像,这种模板匹配寻找目标的方式可以说是完全无效的。

同时,这种模板匹配方式对于图像的光照变换是十分敏感的,如果是对同一物体在不同光照环境下拍摄,并进行模板匹配,是很难得出令人满意的效果,

模板匹配只适用于光照条件影响很小的匹配任务,工作条件限制比较严格,这也很大的限制了它的应用性。但是对于一些光照不变的图像,在经过预处理之后,还是可以使用模板匹配的方式来寻找匹配目标的。

在 OpenCV 中,提供了相应的函数完成这个操作。

  • matchTemplate 函数:在模板和输入图像之间寻找匹配,获得匹配结果图像
  • minMaxLoc 函数:在给定的矩阵中寻找最大和最小值,并给出它们的位置

openCV 提供了 6 种计算两幅图像相似度的方法。

  1. 差值平方和匹配 CV_TM_SQDIFF
  2. 标准化差值平方和匹配 CV_TM_SQDIFF_NORMED
  3. 相关匹配 CV_TM_CCORR
  4. 标准相关匹配 CV_TM_CCORR_NORMED
  5. 相关匹配 CV_TM_CCOEFF
  6. 标准相关匹配 CV_TM_CCOEFF_NORMED

注意在opencv4中所有方法的名称取消了CV_的前缀:

标志参数 作用
TM_SQDIFF 平方差匹配法
TM_SQDIFF_NORMED 归一化平方差匹配法
TM_CCORR 相关匹配法
TM_CCORR_NORMED 归一化相关匹配法
TM_CCOEFF 系数匹配法
TM_CCOEFF_NORMED 归一化相关系数匹配法

matchTemplate()函数原型

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

@brief Compares a template against overlapped image regions.将模板与重叠图像区域进行比较。

The function slides through image , compares the overlapped patches of size  against
templ using the specified method and stores the comparison results in result . #TemplateMatchModes
describes the formulae for the available comparison methods (  denotes image, 
template,  result,  the optional mask ). The summation is done over template and/or
the image patch: 

After the function finishes the comparison, the best matches can be found as global minimums (when
#TM_SQDIFF was used) or maximums (when #TM_CCORR or #TM_CCOEFF was used) using the
#minMaxLoc function. In case of a color image, template summation in the numerator and each sum in
the denominator is done over all of the channels and separate mean values are used for each channel.
That is, the function can take a color template and a color image. The result will still be a
single-channel image, which is easier to analyze.

@param image Image where the search is running. It must be 8-bit or 32-bit floating-point.
@param templ Searched template. It must be not greater than the source image and have the same
data type.
@param result Map of comparison results. It must be single-channel 32-bit floating-point. If image
is  and templ is , then result is  .
@param method Parameter specifying the comparison method, see #TemplateMatchModes
@param mask Optional mask. It must have the same size as templ. It must either have the same number
            of channels as template or only one channel, which is then used for all template and
            image channels. If the data type is #CV_8U, the mask is interpreted as a binary mask,
            meaning only elements where mask is nonzero are used and are kept unchanged independent
            of the actual mask value (weight equals 1). For data tpye #CV_32F, the mask values are
            used as weights. The exact formulas are documented in #TemplateMatchModes.
第一个参数image:输入的包含匹配目标的图像;
第二个参数templ:进行匹配所用的模板图像;
第三个参数result:输出的匹配结果,为浮点型的Mat对象,其高度是find_image.rows - tem_image.rows + 1 ,宽度是find_image.cols - tem_image.cols + 1
第四个参数method:使用的计算像素相似度的方式:

(1)CV_TM_SQDIFF(平方差匹配)、CV_TM_SQDIFF_NORMED(标准方差匹配) 这类方法采用原图与待匹配子图像素的平方差来进行累加求和,计算所得数值越小,说明匹配度越高。

(2)CV_TM_CCORR(乘数匹配)、CV_TM_CCORR_NORMED(标准乘数匹配) 这类方法采用原图与待匹配子图对应像素的乘积进行累加求和,与第一类方法相反,数值越大表示匹配度越高。

(3)CV_TM_CCOEFF(相关匹配)、CV_TM_CCOEFF_NORMED(标准相关匹配) 这类方法把原图像素对其均值的相对值与待匹配子图像素对其均值的相对值进行比较,计算数值越接近1,表示匹配度越高。

第五个参数mask:使用的掩膜,没有掩膜的话不用输入直接使用默认值就可以。匹配模板的掩码,必须与模板图像具有相同的数据类型和尺寸,默认情况下不设置,目前仅支持在TM_SQDIFF和TM_CCORR_NORMED这两种匹配方法时使用。

minMaxLoc()函数原型

minMaxLoc函数找到最小值和最大值元素值以及它们的位置。极值在整个数组中搜索出来的,或者,如果掩膜不是一个空数组,那么将在一个特殊的数组中搜寻。

该函数不能用于多通道数组。如果你需要在所有通道中找到最小或者最大值,那么需要先使用Mat::reshape,将它重构成一个单通道数组。或者可以通过使用extractImageCOI,minxChannels或者split函数提取特殊通道的极值。

normalize(src, dst, alpha, beta norm_type, mask) 归一个一个数组的范数或者值

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());

Finds the global minimum and maximum in an array.

在一个数组中找到全局最小值和全局最大值

The function cv::minMaxLoc finds the minimum and maximum element values and their positions. The
extremums are searched across the whole array or, if mask is not an empty array, in the specified
array region.

用于寻找最大值和最小值元素值及其位置。该极值检测遍历整个矩阵,当掩码部位空时,遍历指定的特殊区域。

The function do not work with multi-channel arrays. If you need to find minimum or maximum
elements across all the channels, use Mat::reshape first to reinterpret the array as
single-channel. Or you may extract the particular channel using either extractImageCOI , or
mixChannels , or split .

该函数不适用于多通道矩阵,如果你需要寻找所以通道的全局最大最小值,可首先使用Mat::reshape()重新诠释为但通道矩阵。如果你要检测特殊的同道可使用一下函数 ImageCOT(),minChannels(),spilt().

特别注意,返回的极值为double型。

@param src input single-channel array. 输入一个单通道数组
@param minVal pointer to the returned minimum value; NULL is used if not required.指向返回的最小值的指针。NULL为不要求。 
@param maxVal pointer to the returned maximum value; NULL is used if not required.指向返回的最大值的指针。NULL为不要求。 
@param minLoc pointer to the returned minimum location (in 2D case); NULL is used if not required.指向返回最小值的位置(2d情况下),NULL为不要求 
@param maxLoc pointer to the returned maximum location (in 2D case); NULL is used if not required.指向返回最大值的位置(2d情况下),NULL为不要求 
@param mask optional mask used to select a sub-array.用于指定下级矩阵的操作掩码。


#include <opencv2\opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat img = imread("animals.png");Mat temp = imread("template.png");if (img.empty() || temp.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}Mat result;matchTemplate(img, temp, result, TM_CCOEFF_NORMED);//模板匹配double maxVal, minVal;Point minLoc, maxLoc;//寻找匹配结果中的最大值和最小值以及坐标位置minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);//绘制最佳匹配区域rectangle(img, cv::Rect(maxLoc.x, maxLoc.y, temp.cols, temp.rows), Scalar(0, 0, 255), 2);imshow("原图", img);imshow("模板图像", temp);imshow("result", result);waitKey(0);return 0;
}

总结:对于光照固定的图像进行目标检测,可以通过模板匹配来实现,但如果光照等外界因素变化对图像影响比较大,则模板匹配的效果会大幅下降。模板匹配只能作为一种基本的、入门的目标检测方式。

参考链接:

【OpenCV 4开发详解】图像模板匹配

OpenCV4学习笔记(19)——模板匹配

OpenCV 学习笔记(模板匹配)

opencv模板匹配matchTemplate相关推荐

  1. OpenCV模板匹配函数:matchTemplate()介绍

    OpenCV模板匹配函数:matchTemplate()介绍

  2. OpenCV学习(二十三) :模板匹配:matchTemplate(),minMaxLoc()

    OpenCV学习(二十三) :模板匹配:matchTemplate() 1.概述 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配 ...

  3. OpenCV模板匹配Template Matching

    OpenCV模板匹配Template Matching 模板匹配Template Matching 目标 理论 什么是模板匹配? OpenCV提供哪些匹配方法? 代码 解释 结果 模板匹配Templa ...

  4. 图像匹配与OpenCV模板匹配

    介绍 (Introduction) As a data scientist at VATBox, I've mainly worked on projects which at their core ...

  5. opencv 模板匹配(cvMatchTemplate)

    opencv 模板匹配(cvMatchTemplate) 模板匹配是通过在输入图像上滑动模板图像块对实际的图像块和输入图像进行匹配,并且可以利用函数cvMinMaxLoc()找到最佳匹配的位置.例如在 ...

  6. OpenCV模板匹配识别图片中的数字

    OpenCV模板匹配识别图片中的数字 前言 本博客主要实现利用OpenCV的模板匹配识别图像中的数字,然后把识别出来的数字输出到txt文件中,如果识别失败则输出"读取失败". 操作 ...

  7. 【opencv学习笔记】028之模板匹配——matchTemplate函数详解

    目录 一.前言 二.模板匹配 1.模板匹配是个啥 2.常用匹配算法 1.平方差匹配-CV_TM_SQDIFF 2.标准平方差匹配-CV_TM_SQDIFF_NORMED 3.相关匹配-CV_TM_CC ...

  8. python opencv模板匹配多目标_基于opencv的多目标模板匹配

    利用opencv进行多目标模板匹配,只要是利用其matchTemplate函数,但在多目标(这里是讨论目标图片中不同大小模板的匹配),以下贴出代码和图片,供大家参考: #include #includ ...

  9. opencv 模板匹配_详细剖析模板匹配

    点击上方"新机器视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 模板匹配介绍 我们需要2幅图像: 原图像 (I): 在这幅图像里, ...

  10. opencv 模板匹配,在图像中寻找物体

    使用模板匹配在图像中寻找物体 模板匹配 模板匹配就是用来在大图中找小图,也就是说在一副图像中寻找另外一张模板图像的位置: opencv中用 cv.matchTemplate() 实现模板匹配. 模板匹 ...

最新文章

  1. Windows server 2016 添加盘符为D盘的数据盘
  2. redis在linux下安装并測试(在spring下调用)
  3. 数据结构之堆Heap
  4. python WindroseAxes 报错 has no attribute ‘Appender‘
  5. [dp]Leetcode 5. Longest Palindromic Substring
  6. Python协程--生成器(通过异常来判断生成器已经结束)
  7. 解决:Please specify a different SDK name--PyCharm报错
  8. 怎么读取can报文_【案例】东风天龙“仪表未收到EECU报文”
  9. zemax验证高斯公式_ZEMAX 实验讲义
  10. influxDB集群模式实践
  11. vector 设置大小_BetterSnapTool for Mac(窗口设置工具) v1.9.3
  12. oracle flashback 功能,oracle 10g中开启flashback功能
  13. java lbp_OpenCV中基于LBP算法的人脸检测测试代码
  14. 将RP文件导出为HTML文件
  15. 西威变频器avo下载调试资料_超能士变频器报输出缺相维修
  16. python+pygame安装教程win8
  17. 大数据物流项目:概述及Docker入门(一)
  18. Java冒泡排序法 降序
  19. android9应用icon尺寸,APP-icon尺寸
  20. 思岚rplidar A1激光点云数据读取

热门文章

  1. 浏览器HTML5 写入文件
  2. 【舆情聚焦】 乐视危机舆情监测专项报告
  3. 苹果电脑怎么进入安全模式教程
  4. Linux编译安装iozone,用iozone测试linux文件系统
  5. DeepLearning | Broad Learning System 宽度学习系统 : 高效增量式浅层神经网络
  6. 1206、0805、0603、0402、0201、01005、008004,你手工焊接过的最小的封装是哪个
  7. Matlab mapminmax函数使用及原理
  8. udhcpc 的使用
  9. 20考研率辉计算机复试(分治法)
  10. 科技T3国产平台!成功搭载“翼辉国产实时系统SylixOS”