利用OpenCV的函数matchTemplate()实现在图像中寻找、检索、搜索模板图像【图像模板匹配】

在博文 https://www.hhai.cc/thread-220-1-1.html 中我们利用直方图的反向投影原理可以寻找图像中具有某个直方图特征的部分。
但是有时候会遇到这样的情况:图像中某个部分的直方图与某个特征的直方图相同,但内容却完全不一样,这个时候我们通过直方图的反向投影原理找到的部分就不是我们希望找到的。
在这种情况下,我们可以通过直接比较图像的像素值来检索是否原图中与模板图像存在相同内容,这种通过比较像素值来寻找相同内容的方法叫作图像模板匹配。

OpenCV提供了函数matchTemplate()来实现图像模板匹配。
具体实现方法如下:
①在待匹配图像中选取与模板图像尺寸相同的滑动窗口,将模板图像的左上角作为锚点(关于滑动窗口锚点的概念,可以参考博文 https://www.hhai.cc/thread-177-1-1.html),然后去按某种模板匹配算法计算匹配程度值,这个值就作为锚点对应于原图中的匹配程度值,并计录在输出矩阵“result”中。
②窗口滑动顺序为从左上角开始向右滑动,滑动到最右边后向下滑动一行,然后从最左侧重新开始滑动。
设原图像的尺寸为W×H,模板图像的尺寸为w×h,则基于这样的滑动顺序、锚点的选择、以及模板图像本来有一定的宽度和高度,显然匹配程度值记录矩阵“result”的尺寸只需要(W-w+1)×(H-h+1)就可以了。有些朋友可能会问,真的是显然么?我怎么不觉得是显然呢?如果您觉得不是显然,那么您自己举个简单的例子在草稿纸上模拟下滑动过程就很容易明白了哈。如果实在是搞不明白,可以找昊虹君有偿咨询哈。

函数matchTemplate()的原型如下:

void cv::matchTemplate(InputArray image,InputArray templ,OutputArray result,int method,InputArray mask = noArray() )
result=cv.matchTemplate(image, templ, method[, result[, mask]])

参数意义如下:
image—待匹配模板的原图像。

templ—模板图像。

method—模板匹配时需要计算窗口覆盖区域与原图的匹配程度,可以用不同的方法,不同的方法对应于method不同的以值。各取值对应的计算式如下表所示:


result—模板匹配结果矩阵,这里面每一个点的值代表原图中某一点与锚点对齐时,用参数method选取的匹配程度计算方法所计算出的匹配程度值。设原图像的尺寸为W×H,模板图像的尺寸为w×h,则输出矩阵“result”的尺寸为(W-w+1)×(H-h+1),具体为什么是这个尺寸,我在上面的叙述中已经解释了这个问题。

mask—模板图像的掩码矩阵。它必须具有与templ具有相同的尺寸。它要么与模板图像具有相同数量的通道数,要么只有一个通道。如果数据类型为CV_8U,则掩码被解释为二进制掩码,这意味着仅使用掩码为非零的元素参与计算,并且与实际掩码值无关(权重等于1)。如果数据类型为 CV_32F,掩码值用作权重。

附函数matchTemplate()的Python示例代码:

# -*- coding: utf-8 -*-
# 出处:昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术# OpenCV的版本为4.4.0# -*- coding:utf-8 -*-
import cv2 as cv
import sysif __name__ == '__main__':# 读取图像并判断是否读取成功image = cv.imread('E:/material/images/histogram_back_projection/lml-02.jpg')template = cv.imread('E:/material/images/histogram_back_projection/lml-template.jpg')if image is None or template is None:print('Failed to read matchTemplate.jpg or match_template.jpg.')sys.exit()cv.imshow('image', image)cv.imshow('template', template)# 计算模板图片的高和宽h, w = template.shape[:2]# 进行图像模式匹配result = cv.matchTemplate(image, template, method=cv.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)# 计算图像左上角、右下角坐标并画出匹配位置left_top = max_locright_bottom = (left_top[0] + w, left_top[1] + h)cv.rectangle(image, left_top, right_bottom, 255, 2)cv.imshow('Matching results', image)cv.waitKey(0)cv.destroyAllWindows()

代码运行结果如下:


从上面的运行结果可以看出,我们在原图中找到了待匹配图像,并且把它标注了出来。

利用OpenCV的函数matchTemplate()实现在图像中寻找、检索、搜索模板图像【图像模板匹配】相关推荐

  1. 利用OpenCV的函数mean()和meanStdDev()计算图像的均值和标准差

    利用OpenCV的函数mean()和meanStdDev()计算图像的均值和标准差 函数mean()的原型和介绍如下: 函数meanStdDev()的原型和介绍如下: 可见,这两个函数的使用是很简单的 ...

  2. 利用OpenCV的函数putText()为图像添加数值型文本内容

    OpenCV的函数putText()的原型如下: C++原型: void cv::putText(InputOutputArray img,const String & text,Point ...

  3. 利用OpenCV的函数cvtcolor()进行颜色空间转换时需要注意的地方

    OpenCV的函数cvtcolor()的原型如下: C++原型: void cv::cvtColor(InputArray src,OutputArray dst,int code,int dstCn ...

  4. Windows 下 C++ 利用 OpenCV glob 函数获取文件夹下所有文件绝对路径

    绪论 本文记录 Windows 下 C++ 利用 OpenCv glob 函数得到 文件夹下所有文件的绝对路径(含文件名).本文还含有 std::string::find()等函数的记录.如果是 Py ...

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

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

  6. OpenCV之imgproc 模块. 图像处理(5)在图像中寻找轮廓 计算物体的凸包 创建包围轮廓的矩形和圆形边界框 为轮廓创建可倾斜的边界框和椭圆 轮廓矩 多边形测试

    在图像中寻找轮廓 目标 在这个教程中你将学到如何: 使用OpenCV函数 findContours 使用OpenCV函数 drawContours 原理 例程 教程的代码在下面给出. 你也可以从 这里 ...

  7. OpenCV在图像中寻找轮廓

    OpenCV在图像中寻找轮廓 在图像中寻找轮廓 目标 代码 结果 在图像中寻找轮廓 目标 在本教程中,您将学习如何: 使用OpenCV函数cv :: findContours 使用OpenCV函数cv ...

  8. OpenCV在图像中寻找轮廓的实例(附完整代码)

    OpenCV在图像中寻找轮廓的实例 OpenCV在图像中寻找轮廓的实例 OpenCV在图像中寻找轮廓的实例 #include "opencv2/imgcodecs.hpp" #in ...

  9. 图像或轮廓的Hu矩的定义、优缺点、适用范围,并利用OpenCV的函数HuMoments()和matchShapes()实现Hu矩的计算和轮廓匹配

    本文承接博主的上一篇博文: 什么叫图像或轮廓的空间矩.中心矩.归一化中心矩?并利用OpenCV的类Moments计算轮廓的这几个矩和质心位置 继续介绍Hu矩的相关知识. Hu矩是由二阶和三阶中心距计算 ...

最新文章

  1. volatile 关键字是如何保证可见性的?
  2. HDU - 5658 CA Loves Palindromic(回文自动机/哈希+树状数组)
  3. Lua require 相对路径
  4. jquery中点击切换的实现
  5. 飞鸽传书2011看到一篇国外的博客
  6. LiteOS调测利器:backtrace函数原理知多少
  7. linux 系列:[所有相关文章链接]
  8. Java中static的用法,初始化块
  9. Pytorch 微积分
  10. 关于伺服驱动控制的课本_三菱伺服驱动器-说明书.pdf
  11. 5 个关键点!优化你的 UI 原型设计
  12. 阅读Revisiting Superpixels for Active Learning in Semantic Segmentation With Realistic Annotation Cost
  13. Unity Navigation--自动寻路、分离路面导航、分层烘培、动态障碍
  14. 移植 usb 蓝牙适配器到 arm 板
  15. CAT-6:六类/增强六类双绞线标准
  16. mount qemu qcow2、img
  17. PHP之ctype扩展
  18. Android12 Launcher3 的一些修改记录
  19. LeetCode-只出现一次的数字-哈希表-异或-py
  20. Python中使用正则表达式以及正则表达式匹配规则

热门文章

  1. 设计太平了,恰当应用肌理在设计中,提高格调!
  2. python - 集合set
  3. YolactEdge:边缘设备上的实时实例分割(Xavier: 30 FPS, RTX 2080 Ti:170 FPS)
  4. Centernet编译dcv2
  5. 适合初学者自制的100mw电视发射机
  6. 异常脉搏波PVR波形命名和解释
  7. 上海科技大学计算机科学与技术录取分数线,这所新高水平大学2021年全国招生300人,设5个专业!分数线如何?...
  8. 基于Python的项目成本管理系统设计
  9. 单片机原理与实践学习记录之51单片机I/O口简单应用
  10. 干货 | 电路中为何需要串联小电阻?