008 OpenCV matchTemplate 模板匹配

目录

一、环境

二、模板匹配算法原理

三、代码演示


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、模板匹配算法原理

cv.matchTemplate是OpenCV库中的一个函数,用于在图像中查找与模板匹配的特征。它的主要应用场景是在图像处理、计算机视觉和模式识别等领域。

算法原理: cv.matchTemplate函数通过计算输入图像与模板图像之间的相似度来找到最佳匹配位置。它使用滑动窗口的方法在输入图像上移动模板图像,并计算每个窗口内的像素值差异。然后,根据所选的匹配方法(如平方差、归一化平方差、相关系数等),对差异进行加权求和,得到一个匹配得分矩阵。最后,函数返回得分矩阵中的最大值及其位置,作为最佳匹配位置。

函数API:

retval, result = cv2.matchTemplate(image, templ, method, mask)

参数说明:

  • image:输入图像,通常是一个灰度图像。
  • templ:模板图像,可以是灰度图像或彩色图像。
  • method:匹配方法,常用的有:
    • cv2.TM_SQDIFF:平方差匹配法,计算结果越小表示匹配程度越高。
    • cv2.TM_SQDIFF_NORMED:归一化平方差匹配法,计算结果越接近0表示匹配程度越高。
    • cv2.TM_CCORR:相关系数匹配法,计算结果越接近1表示匹配程度越高。
    • cv2.TM_CCORR_NORMED:归一化相关系数匹配法,计算结果越接近1表示匹配程度越高。
    • cv2.TM_CCOEFF:相关系数匹配法,计算结果越接近1表示匹配程度越高。
    • cv2.TM_CCOEFF_NORMED:归一化相关系数匹配法,计算结果越接近1表示匹配程度越高。
  • mask:可选参数,mask是一个二值图,作用于参数temp1,有效区域则参与模板匹配计算

返回值说明:

  • result:匹配结果矩阵,每个元素表示对应位置的匹配程度。
  • minVal, maxVal, minLoc, maxLoc:最佳匹配位置的最小值、最大值、最小值位置和最大值位置。

下面是对 cv.matchTemplate() 算法的简单解释:

  1. 预处理:首先,将输入图像和模板图像转换为灰度图像。这是因为 cv.matchTemplate() 算法只支持灰度图像。
  2. 滑动模板:然后,算法会在输入图像上滑动模板。对于每个位置(从左到右、从上到下呗),都会计算一个匹配分数。这个分数取决于当前位置的图像和模板的相似性。
  3. 计算匹配分数:根据选择的匹配方法,计算当前位置的匹配分数。例如,如果选择的是归一化相关系数方法,那么算法会计算输入图像和模板在当前位置的相关系数。其他方法,如归一化相关、平方差等,会有不同的计算方式。
  4. 找到最匹配的位置:在所有位置中,算法会找到匹配分数最高的位置。这个位置就是最匹配的位置。
  5. 返回结果:最后,函数会返回一个包含所有匹配区域信息的结构。这个结构包含了每个匹配区域的坐标、匹配分数等信息。

需要注意的是,由于滑动窗口的限制,如果模板和图像的某些区域不匹配,这些区域将不会被计入匹配分数。这是通过使用掩码(mask)参数实现的。掩码是一个与模板大小相同的二维数组,值可以是0或1。在掩码中为1的位置将被计入匹配分数,为0的位置则不会被计入。

总的来说,cv.matchTemplate() 是一个强大的工具,可以用于在图像中查找和模板最匹配的区域。它广泛应用于图像处理、计算机视觉和模式识别等领域。

三、代码演示

代码中需要的三张图,这里给出来,lena_tmpl.jpg,以下是原图:

tmpl.png,以下是模板图,意思是:在原图中找到与其相似的区域,用矩形画出来。

mask.png,必须与tmp1.png尺寸相同,是一个二值图,用于表示:模板计算过程中,模板图中哪些区域用于模板匹配。

from __future__ import print_function
import sys
import cv2 as cv# 全局变量
use_mask = False
img = None
templ = None
mask = None
image_window = "Source Image"
result_window = "Result window"match_method = 0
max_Trackbar = 5def main():# 读取三张图global imgglobal templimg = cv.imread('data/lena_tmpl.jpg', cv.IMREAD_COLOR) # 图片1templ = cv.imread('data/tmpl.png', cv.IMREAD_COLOR) # 图片2global use_maskuse_mask = Trueglobal maskmask = cv.imread('data/mask.png', cv.IMREAD_COLOR ) # 图片3if ((img is None) or (templ is None) or (use_mask and (mask is None))):print('Can\'t read one of the images')return -1cv.namedWindow( image_window, cv.WINDOW_AUTOSIZE )cv.namedWindow( result_window, cv.WINDOW_AUTOSIZE )# 创建滑条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'cv.createTrackbar( trackbar_label, image_window, match_method, max_Trackbar, MatchingMethod )# 执行模板匹配MatchingMethod(match_method)cv.waitKey(0)return 0def MatchingMethod(param):global match_methodmatch_method = paramimg_display = img.copy()# 模板匹配method_accepts_mask = (cv.TM_SQDIFF == match_method or match_method == cv.TM_CCORR_NORMED)if (use_mask and method_accepts_mask):result = cv.matchTemplate(img, templ, match_method, None, mask)else:result = cv.matchTemplate(img, templ, match_method)# 将结果进行归一化到[0, 1]cv.normalize( result, result, 0, 1, cv.NORM_MINMAX, -1 )# 找到最佳匹配_minVal, _maxVal, minLoc, maxLoc = cv.minMaxLoc(result, None)# 得到的匹配位置,即:一个矩形框if (match_method == cv.TM_SQDIFF or match_method == cv.TM_SQDIFF_NORMED):matchLoc = minLocelse:matchLoc = maxLoc# 可视化cv.rectangle(img_display, matchLoc, (matchLoc[0] + templ.shape[0], matchLoc[1] + templ.shape[1]), (0,255,0), 2, 8, 0 )cv.rectangle(result, matchLoc, (matchLoc[0] + templ.shape[0], matchLoc[1] + templ.shape[1]), (0,0,255), 2, 8, 0 )cv.imshow(image_window, img_display)cv.imshow(result_window, result)pass
if __name__ == "__main__":main()

以下是不同算法运行效果,哪些算法吊,一眼就能看出来,自己可以玩一玩哈。

\n 0: SQDIFF

\n 1: SQDIFF

\n 2: TM CCORR

\n 3: TM CCORR

\n 4: TM COEFF

\n 5: TM COEFF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/163956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode:645. 错误的集合(python3解法)

难度:简单 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了集合 S 发生错误后的结…

创建 Plotly 的散点线图

一 使用 Plotly 画图 import plotly.graph_objects as godef img_show_fig(out_data_today):# 创建 Plotly 的散点线图fig go.Figure()# 添加散点线fig.add_trace(go.Scatter(xout_data_today.index,yout_data_today.values,modelinesmarkers,markerdict(colorred, # 设置数…

揭秘周杰伦《最伟大的作品》MV,绝美UI配色方案竟然藏在这里

色彩在UI设计的基本框架中占据着举足轻重的位置。实际上,精心挑选和组合的色彩配色,往往就是UI设计成功的不二法门。在打造出一个实用的UI配色方案过程中,我们需要有坚实的色彩理论知识,同时还需要擅于从生活中观察和提取灵感。以…

uboot中nfs和tftp方式获取文件

NFS文件系统挂载 服务器端配置如下 1.Server端需要安装NFS服务: sudo apt-get install nfs-kernel-server2.创建需要挂载的路径: mkdir -p /home/workspace/mercury/nfs_path3.创建共享目录: ①vim /etc/exports ②在文件中添加&#xff…

Java 中 HashSet 和 TreeSet 的区别

简介: 在Java开发中,HashSet和TreeSet都是常用的集合类,用于存储不重复的元素。虽然它们都实现了Set接口,并提供了相似的功能,但在内部实现和特性上存在一些区别。本文将深入探讨HashSet和TreeSet的差异,帮…

人机交互模块的发展

人机交互(Human-Computer Interaction,HCI)是指人与计算机之间进行交互和信息交换的过程。人机交互模块的发展经历了多个阶段,从早期的命令行界面到现在多样化的交互方式,不断发展和创新。以下是一些人机交互模块的发展…

蓝桥杯物联网竞赛_STM32L071_2_继电器控制

CubeMX配置: Function.c及Function.h: #include "Function.h" #include "gpio.h" void Function_LD5_ON(void){HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET); }void Function_LD5_OFF(void){HAL_GPIO_WritePin(LD5_…

角色管理--产品经理岗

研发组织管理--角色管理--产品经理岗 定位 相对稳定和简单产品的独立产品打造者,复杂产品的辅助者 所需资质 校招新人,拥有灵性拥有基础的产品力(认知,设计,创新,推进,学习)Axur…

解决Vue项目的runtime-only转为runtime-compiler

我们在vue.config.js中添加上 runtimeCompiler: true,然后再将main.js入口文件中的Vue实例改为以下即可 //修改前 new Vue({router,store,render: (h) > h(App) }).$mount(#app) //修改后 new Vue({el:#app,router,store, components:{App}, template:<App/>})

解锁word密码,忘记密码怎么办?

想要解密、找回或去除Word文档密码&#xff0c;可以按以下步骤操作&#xff1a;第一步&#xff0c;在百度上搜索【密码帝官网】&#xff0c;接着在用户中心上传需要解密的文件即可。这种方法安全、简单易操作&#xff0c;而且不用下载软件&#xff0c;手机和电脑都可以用。无论…

uniapp 使用Highcharts,多色曲线,多色阴影,百分比,网格等处理,accessibility.js提示错误处理

示例图 1.安装Highcharts npm install highcharts --save npm install highcharts-vue2.demo代码 <template><view class"charts-main"><view id"charts" style"width: 90%;height: 460rpx;"></view></view>&l…

虚拟机系列:windows 虚拟机相关功能、组件梳理

一. 简介 英文名称中文名称说明Container容器Guarded Host受保护的主机利用远程证明创建并运行受防护的虚拟机Hyper-V├Hyper-V Management ToolsHyper-V 管理工具包含 GUI 管理工具和 Power Shell 的 Hyper-V 模块└Hyper-V PlatformHyper-V 平台├Hyper-V HypervisorHyper-V …

如何实现高效的绩效面谈?

企业绩效面谈是绩效管理的核心工作之一&#xff0c;管理者需要对员工的绩效表现进行评价和交流、对前期的实施效果进行总结&#xff0c;以使绩效管理体系在下一个周期运行得更好&#xff0c;达到提升绩效的目的。然而在实际工作中&#xff0c;许多公司的绩效面谈并未能发挥其应…

全民 K 歌音频相关技术分享

日期 &#xff1a;2021.05.22 技术分享介绍&#xff1a;https://zhuanlan.zhihu.com/p/373506048 技术分享视频&#xff1a;https://app6ca5octe2206.pc.xiaoe-tech.com/p/t_pc/course_pc_detail/column/p_60ae5c89e4b00176519f2e5b

微服务负载均衡器Ribbon

1.什么是Ribbon 目前主流的负载方案分为以下两种&#xff1a; 集中式负载均衡&#xff0c;在消费者和服务提供方中间使用独立的代理方式进行负载&#xff0c;有硬件的&#xff08;比如 F5&#xff09;&#xff0c;也有软件的&#xff08;比如 Nginx&#xff09;。 客户端根据…

多线程 02

1.线程的常见构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用 Runnable 对象创建线程对象Thread(String name)创建线程对象&#xff0c;并命名Thread(Runnable target, String name)使用 Runnable 对象创建线程对象&#xff0c;并命名【了解】Thread(Threa…

JS文字操作库(亲测可用)

使用 <template><div class"app"><li class"main_right-btn" click"selectionColor(yellow)">题干标识</li><li class"main_right-btn" click"selectionColor(transparent)">取消标识</li…

K-means算法

K-means算法 Lloyd k-means Algorithm 样本矩阵&#xff1a; X [ x 1 , x 2 , . . . , x n ] ∈ R d n X[x_1,x_2,...,x_n] ∈R^{dn} X[x1​,x2​,...,xn​]∈Rdn&#xff0c;有n个 x i x_i xi​每个 x i x_i xi​是d维 簇集合&#xff1a; C [ C 1 , C 2 , . . . , C c …

自由飞翔之小鸟

一、创建文件、包、类、插入图片文件 二、app包 1、Gameapp类&#xff08;运行游戏&#xff09; package app;import main.GameFrame;public class Gameapp {public static void main(String[] args) {//游戏的入口new GameFrame();} } 三、main包 1、Barrier&#xff08;障…

【实验】配置用户自动获取IPv6地址的案例

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等​编辑https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【…