OpenCV官方教程中文版 —— 模板匹配

OpenCV官方教程中文版 —— 模板匹配

  • 前言
  • 一、原理
  • 二、OpenCV 中的模板匹配
  • 三、多对象的模板匹配

前言

在本节我们要学习:

  1. 使用模板匹配在一幅图像中查找目标

  2. 函数:cv2.matchTemplate(),cv2.minMaxLoc()

一、原理

模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。OpenCV 为我们提供了函数:cv2.matchTemplate()。和 2D 卷积一样,它也是用模板图像在输入图像(大图)上滑动,并在每一个位置对模板图像和与其对应的输入图像的子区域进行比较。OpenCV 提供了几种不同的比较方法(细节请看文档)。返回的结果是一个灰度图像,每一个像素值表示了此区域与模板的匹配程度。

如果输入图像的大小是(WxH),模板的大小是(wxh),输出的结果的大小就是(W-w+1,H-h+1)。当你得到这幅图之后,就可以使用函数cv2.minMaxLoc() 来找到其中的最小值和最大值的位置了。第一个值为矩形左上角的点(位置),(w,h)为 模板矩形的宽和高。这个矩形就是找到的模板区域了。

二、OpenCV 中的模板匹配

我们这里有一个例子:我们在梅西的照片中搜索梅西的面部。所以我们要制作下面这样一个模板:

在这里插入图片描述
我们会尝试使用不同的比较方法,这样我们就可以比较一下它们的效果了。
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('ball.png', 0)
img2 = img.copy()
template = cv2.imread('ball_face.png', 0)
w, h = template.shape[::-1]
# All the 6 methods for comparison in a list
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR','cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
for meth in methods:img = img2.copy()
# exec 语句用来执行储存在字符串或文件中的 Python 语句。
# 例如,我们可以在运行时生成一个包含 Python 代码的字符串,然后使用 exec 语句执行这些语句。
# eval 语句用来计算存储在字符串中的有效 Python 表达式method = eval(meth)
# Apply template Matchingres = cv2.matchTemplate(img, template, method)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# 使用不同的比较方法,对结果的解释不同
# If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimumif method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:top_left = min_locelse:top_left = max_locbottom_right = (top_left[0] + w, top_left[1] + h)cv2.rectangle(img, top_left, bottom_right, 255, 2)plt.subplot(121), plt.imshow(res, cmap='gray')plt.title('Matching Result'), plt.xticks([]), plt.yticks([])plt.subplot(122), plt.imshow(img, cmap='gray')plt.title('Detected Point'), plt.xticks([]), plt.yticks([])plt.suptitle(meth)plt.tight_layout()plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们看到 cv2.TM_CCORR 和 cv2.TM_SQDIFF 的效果不想我们想的那么好。

三、多对象的模板匹配

在前面的部分,我们在图片中搜素梅西的脸,而且梅西只在图片中出现了一次。假如你的目标对象只在图像中出现了很多次怎么办呢?函数cv.imMaxLoc() 只会给出最大值和最小值。此时,我们就要使用阈值了。在下面的例子中我们要经典游戏 Mario 的一张截屏图片中找到其中的硬币。

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
img_rgb = cv2.imread('mario.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.png',0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
#umpy.where(condition[, x, y])
#Return elements, either from x or y, depending on condition.
#If only condition is given, return condition.nonzero().
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
cv2.imwrite('res.png',img_rgb)

结果:
在这里插入图片描述

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

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

相关文章

BUUCTF Reverse 新年快乐

下载文件先查壳,可以看到有UPX壳 用upx脱壳 拖到ida pro32,shiftF12查看字符串,看到关键字flag,双击进去 双击然后f5查看伪代码 main函数伪代码 关键函数: strncmp(const char *str1, const char *str2, size_t n)…

Epinoia-有状态网络的意图验证模块,略读

Epinoia relies on a unified model for NFs by leveraging the causal precedence relationshipsthat exist between NF packet I/Os and states. 这句话的意思是:“Epinoia依靠一种统一的网络功能(NF)模型,通过利用存在于 NF 包…

群智能算法之模拟退火算法

1.模拟退火算法简介: 2.模拟退火算法的关键点: (1)随机的更新可行解x,判断可行解x对应的函数值和原来函数值之间的大小:如果优于原来的函数值,则让新的可行解x为问题的解;否则以一定的概率(大于…

FL Studio21.2.0.3421最新汉化破解版中文解锁下载完整版本

音乐在人们心中的地位日益增高,近几年音乐选秀的节目更是层出不穷,喜爱音乐,创作音乐的朋友们也是越来越多,音乐的类型有很多,好比古典,流行,摇滚等等。对新手友好程度基本上在首位,…

【存储】lotusdb的原理及实现

最近看了lotusdb的源码。lotusdb是一个golang实现的嵌入式的持久化kv存储。 从整体设计上看,lotusdb采用了类似LSM树的架构,并采用了针对SSD的优化,将key和value分开存储。在此基础上,lotusdb将LSM树中存储key的SST使用B树或者ha…

WORD中的表格内容回车行距过大无法调整行距

word插入表格,编辑内容,换行遇到如下问题: 回车后行距过大,无法调整行距。 解决方法(并行): 方法1:选中要调整的内容,菜单路径:“编辑-清除-格式” 方法2&am…

银河麒麟服务器版v4安装程序缺少依赖包,改为利用手机联网在线安装

1 将安卓手机连接使用usb转typec线连接到服务器的usb口。(linux桌面版)也可以类似的方法手机联网。 2 在手机热点中打开usb共享 3 使用ifconfig命令找到手机被服务器识别成的网卡名 4 使用dhclient “手机网卡名”命令,使服务器能上网。 5 变…

No173.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Java SE 学习笔记(十八)—— 注解、动态代理

目录 1 注解1.1 注解概述1.2 自定义注解1.3 元注解1.4 注解解析1.5 注解应用于 junit 框架 2 动态代理2.1 问题引入2.2 动态代理实现 1 注解 1.1 注解概述 Java 注解(Annotation)又称Java标注,是JDK 5.0引入的一种注释机制,Java语…

Unity ScrollView最底展示

Unity ScrollView最底展示 问题方案逻辑 问题 比如在做聊天界面的时候我们肯定会使用到ScrollView来进行展示我们的聊天内容,那么这个时候来新消息的时候就需要最底展示,我认为这里有两种方案; 一种是通过算法每一条预制体的高度*一共多少…

NPMCM历年赛题汇总

题目来源:全国研究生数学建模大赛 2021–2023年 年份题号题目2022A移动场景超分辨定位问题2022B方形件组批优化问题2022C汽车制造涂装–总装缓存调序区调度优化问题2022DPIAS架构芯片资源排布问题2022E草原放牧策略问题2022FCOVID-19疫情期间生活物资的科学管理问题2021A相关…

Docker中Failed to initialize NVML: Unknown Error

参考资料 Docker 中无法使用 GPU 时该怎么办(无法初始化 NVML:未知错误) SOLVED Docker with GPU: “Failed to initialize NVML: Unknown Error” 解决方案需要的条件: 需要在服务器上docker的admin list之中. 不需要服务器整体的admin权限.…

驼峰命名法

文章目录 前言(一)大驼峰(二)小驼峰 前言 驼峰命名法 增加代码的可读性 (一)大驼峰 命名 类 所有单词的首字母都要大写 (二)小驼峰 命名 变量名 和 方法名 如果有一个单词&#…

汇编运算符和表达式

运算符: 汇编语言由表达式和运算符组成,运算符分为数值运算符和属性运算符。属性运算符面向变量或标号。 数值运算符: 算术运算符: 运算符类型 ✓ ( 正号 ) 、 -( 负号 ) ✓ ( 加 ) 、 -( 减 ) 、 *( 乘 ) 、 /( 除 ) 、 MO…

Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三)

前言: 万事开头难,如果我们在开发板上开发出第一个应用程序,第一个驱动程序,那么后续的开发就会稍微简单点,下面让我们来进行第一个应用程序和第一驱动程序的开发吧。 目录 一、开发板的第1个APP实验 1.通过Git仓库…

批量去除pdf每一页相同未知的同样的内容

例如我想去除每一页右下角的www.alevelcollege.com ①打开acrobat pro ②编辑文件和图像 ③ctrlF输入字符串www.alevelcollege.com替换为空 ④鼠标点击替换 ⑤回车键按下不放,会自动翻页,直到翻页到最后一页。

算法训练|数据流中的中位数

LCR 160. 数据流中的中位数 - 力扣(LeetCode) 总结:这题自己最开始的想法是直接使用vector容器,每次取中位数的时候就进行一次排序,超时。题解很巧妙的利用大根堆和小根堆来解决问题,大根堆和小根堆各存一…

mac安装jenkins

1、安装jenkins之前确认是否安装了homebrew 2、开始安装jenkins 安装完如下图则安装完成 3、不想用默认ip和端口的自己改一下ip和端口 4、启动jenkins brew services restart jenkins 使用自己修改后的ip:port http://0.0.0.0:8088 根据提示信息,拿到管理员密码&…

nodejs处理图片的几种方法,使用sharp,jimp,webconvert

使用sharp Sharp是一款快速高效的Node.js图片处理库,支持图片格式转换、尺寸调整、压缩、裁剪、旋转、水印等功能。以下是使用Sharp库的基本步骤: 1. 安装Sharp库 安装Sharp库可以使用npm命令: npm install sharp2. 调用Sharp库 在代码中…

深度学习中Transformer的简单理解

Transformer 网络结构 Transformer也是由编码器和解码器组成的。 每一层Encoder编码器都由很多层构成的,编码器内又是self-attention和前馈网络构成的。Self-attention是用来做加权平均,前馈网络用来组合。 但是decoder有点不同,多了一层En…