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

2023-11-12

利用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 sys


if __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_loc
    right_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()

代码运行结果如下:
在这里插入图片描述
在这里插入图片描述
从上面的运行结果可以看出,我们在原图中找到了待匹配图像,并且把它标注了出来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • js中对象数组根据对象id分组并转map

    js中对象数组根据对象id分组并转map 如果要将具有相同 id 属性的对象元素 分成不同的数组 可以先从对象数组中提取相同的 id 属性 再使用 Array reduce 和 Map 来进行对象数组的分类 具体实现 对象数组根据id分组并
  • 计算机停电自行启动,电脑自动断电,详细教您电脑开机自动断电怎么解决

    有时候电脑玩着玩着 突然断电关机了 正玩的很激情 突然电脑断电关机了 都恨不得把电脑砸了 一旦出现电脑开机后断电的情况 让我们习惯从软件下手的同学们来说 有点无从下手 下面 小编跟大伙一同探讨一下电脑开机自动断电的解决方法 说到电脑启动过程

随机推荐

  • 请用C语言写一个15*15的扫雷小游戏

    扫雷是一个非常有趣的游戏 可以使用 C 语言编写 下面是一个简单的扫雷代码示例 include
  • C++ 排序函数 sort(),qsort()的用法

    C库函数qsort C 库函数sort 其中qsort相对较慢 sort实现非常高效 qsort 功 能 使用 快速排序例程进行排序 头文件 include
  • 锐浪报表-实现导入导出

    锐浪报表 实现导入导出 实现思路 代码实现 实现思路 导入导出实现思路 我们使用锐浪报表自带的导出功能导出 XX grf 后 鼠标右键是可以像编辑文本一样编辑内容的 由此联想到 用记事本手写一个模板改一下后缀名是不是也可以当作报表模板 答案
  • 好消息:vue3.3发布了,来看看更新那些功能

    前言 vue3 3发布了 来看看更新那些功能 原英文地址 Announcing Vue 3 3 The Vue PointThe offical blog for the Vue js projecthttps blog vuejs org
  • 2023年完整版Java学习路线图

    目录 第一阶段 Java核心基础 第二阶段 数据库核心技术 第三阶段 Java Web内容 第四阶段 企业级框架讲解 第五阶段 分布式微服务架构 第六阶段 技能深入提升 第七阶段 企业级项目实战 Java学习路线图 以下是我为您提供的原创J
  • NOIP学习之顺序查找:145.找最大数序列

    测试链接 总时间限制 1000ms 内存限制 65536kB 描述 输入n行 每行不超过100个无符号整数 无符号数不超过4位 请输出最大整数以及最大整数所在的行号 行号从1开始 如果该数据在多个行中出现 则按从小到大输出相应行号 行号之间
  • 【计算机视觉

    文章目录 一 MnasNet 二 GhostNet 三 Compact Convolutional Transformers CCT 四 NesT 五 Res2Net 六 EfficientNetV2 七 Capsule Network 八
  • JQuery安装与下载教程

    jQuery安装与下载 JQuery 是一个javaScript库 是一个轻量级的 写的少 做的多 的JavaScript库 jQuery 极大地简化javaScript编程 juery相比js优点 jquery的onload加载事件速度更
  • 方波转为正弦波的简单方案简介

    将方波信号转化为正弦波信号 主要是需要抑制方波信号的谐波信号 主要是抑制三次谐波 经过仿真测试 能够将方波转化为正弦波的滤波器 其衰减必须足够陡峭 将谐波频率尽可能压掉 在实际的滤波器中 经过测试 采用椭圆低通滤波器是能够实现所需要的滤波功
  • 【C++】STL常用容器总结之四:链表list

    5 链表list List是每个节点包含前驱指针 后继指针和数据域三个部分的双向链表 List不提供随机存取 访问元素需要按顺序走到需存取的元素 时间复杂度为O n 在list的任何位置上执行插入或删除操作都非常迅速 只需在list内部调整
  • 单目标优化:飞狐优化算法(Flying Foxes Optimization,FFO)求解cec2017(提供Matlab代码)

    一 飞狐优化算法简介 飞狐优化算法 Flying Foxes Optimization FFO 由Konstantinos Zervoudakis与Stelios Tsafarakis于2022年提出 参考文献 Zervoudakis K
  • 冒泡排序与快速排序【C语言】

    冒泡排序 基本思想 对有n个记录的序列进行冒泡排序 首先将第一个数字与第二个数字进行比较 若为逆序 则将两个数字的顺序交换 然后比较第二个数字与第三个数字 若为逆序 则将两个数字的顺序交换 依此类推 经过第一轮排序后 最大的数字将 下沉 到
  • PHP进行中文URL编转码为GB2312或UTF8

    中文转URL编码 GB2312 urlencode iconv utf 8 gb2312 中国人 中文转URL编码 UTF8 urlencode 中国人
  • ubuntu磁盘扩容方法(简单有效)

    准备工作 使用Vmware进行扩展 在进行磁盘扩展的时候 虚拟机不可以有快照 使用快照管理删除快照 开始扩容 点击 虚拟机 设置 硬盘 扩展 填写扩展大小 分区设置 扩展完成后并还需要在操作系统进行设置才能真正使用 下面有几种方法 第一种方
  • 运行开源库CCPD-RPnet代码,提示「KeyError: Caught KeyError in replica 0 on device 0」错误

    文章目录 问题描述 问题排查 Solution Other 问题描述 通过python3 demo py i demo m models fh02 pth运行车牌识别CCPD开源代码 提示 KeyError Caught KeyError
  • Spark

    1 Spark概述 Spark是一个支持多语言的数据计算 科学计算 机器学习引擎 同时支持单节点或者集群运行模式 其强大的功能包括 批处理 结构化的SQL计算 流式计算 机器学习库 图计算等 2 Spark集群环境的搭建 1 下载解压安装包
  • 骑士周游问题

    算法 1 骑士周游问题 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的 8x8 棋盘中 0 7 0 7 的某个方格中 马鞍走起规则 马走日字 进行移动 要求每个方格只进入一次 走遍棋盘上全部64个方格 3 会使用到图的遍历算法 D
  • 【Ansible自动化运维实战】使用Asible批量部署Apache

    Ansible自动化运维实战 使用Asible批量部署Apache 一 本次实践目的 二 Plyabook内容 三 运行playbook 一 本次实践目的 将apache批量部署到被控节点 二 Plyabook内容 hosts node1
  • 嵌入式linux闹钟,嵌入式电子闹钟课程设计.doc

    嵌入式系统综合实验 题 目 基于嵌入式的数字闹钟系统设计 学生姓名 秦乙 学 号 20071309087 学 院 电子与信息工程学院 专 业 信息工程 二 一 年 十二 月 二十七 日 目 录 论文标题错误 未定义书签 摘要和关键词错误 未
  • 利用OpenCV的函数matchTemplate()实现在图像中寻找、检索、搜索模板图像【图像模板匹配】

    利用OpenCV的函数matchTemplate 实现在图像中寻找 检索 搜索模板图像 图像模板匹配 在博文 https www hhai cc thread 220 1 1 html 中我们利用直方图的反向投影原理可以寻找图像中具有某个直