【OpenCV-Python】教程:3-12 模板匹配

news2025/2/26 3:44:17

OpenCV Python 模板匹配

【目标】

  • 利用模板匹配的方法寻找目标
  • cv2.matchTemplate(), cv2.minMaxLoc()

【理论】

模板匹配是一个寻找大图像中目标位置的方法。OpenCV提供了函数 cv2.matchTemplate() 函数,通过在输入图像上滑动模板,将目标与滑动处的图像 patch 进行匹配,OpenCV中实现了很多种不同的方法,返回的是一个结果图像,结果图像的每个像素代表的滑动位置的匹配值。如果输入图像是 W ∗ H W*H WH, 模板图像大小是 w ∗ h w*h wh, 那么结果图像的大小为 ( W − w + 1 ) ∗ ( H − h + 1 ) (W-w+1)*(H-h+1) (Ww+1)(Hh+1)。最终可以使用 cv2.minMaxLoc函数获得匹配结果最大值或最小值的位置。

如果使用 cv2.TM_SQDIFF 作为比较方法,最小值代表越匹配。

【代码】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 

img = cv2.imread("assets/messi5.jpg", 0)
img2 = img.copy()

template = cv2.imread("assets/messi_face.png", 0)
w, h = template.shape

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()
    method = eval(meth)
  
    res = cv2.matchTemplate(img2, templ=template, method=method)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
  
    # 如果用的是 cv2.TM_SQDIFF 或 cv2.TM_SQDIFF_NORMED, 则用最小值
    if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
      
    bottom_right = (top_left[0] + w, top_left[1] + h)
  
    cv2.rectangle(img, top_left, bottom_right, color=255, thickness=2)
  
    # cv2.imshow('Match Res', res)
    # cv2.imshow('Det Res', img)
    # cv2.waitKey(0)
  
    plt.subplot(121), plt.imshow(res, cmap='gray')
    plt.title('Match Result'), plt.xticks([]), plt.yticks([])
    plt.subplot(122), plt.imshow(img, cmap='gray')
    plt.title('Detect Point'), plt.xticks([]), plt.yticks([])
    plt.suptitle(meth)
    plt.savefig(meth+'.png', bbox_inches='tight')
    plt.show()
  
# cv2.destroyAllWindows()
  • 多目标匹配

在这里插入图片描述

import cv2 
import numpy 
from matplotlib import pyplot as plt 

img = cv2.imread("assets/coin.png")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

template = cv2.imread("assets/coin_template.png", 0)
w, h = template.shape

res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8

loc = np.where(res >= threshold)

for pt in zip(*loc[::-1]):
    cv2.rectangle(img, pt, (pt[0]+w, pt[1]+h), (0, 255, 0), 2)

cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【接口】

  • matchTemplate
cv2.matchTemplate(	image, templ, method[, result[, mask]]	) ->	result

Compares a template against overlapped image regions.

  • image: 需要寻找目标的图像
  • templ: 模板(或目标)
  • method: 匹配方法
  • result: 32位单通道浮点图像,
  • mask: 大小和 templ 一致,通道数一致或为单通道。
  • TemplateMatchModes

在这里插入图片描述

  • minMaxLoc
cv2.minMaxLoc(	src[, mask]	) ->	minVal, maxVal, minLoc, maxLoc

寻找全局最大最小值以及位置
不适合多通道使用,如果确实要在多通道上使用,可以改变形状,或者分离通道等操作

  • src: 单通道图像或数据
  • minVal: 最小值
  • maxVal: 最大值
  • minLoc: 最小值的位置
  • maxLoc: 最大值的位置
  • mask: 掩码

【参考】

  1. OpenCV 官方文档

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

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

相关文章

[附源码]计算机毕业设计JAVA校园淘宝节系统

[附源码]计算机毕业设计JAVA校园淘宝节系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis …

【c++】STL--string

前言 最开始我们学习c语言的时候,我们发现刷题或者写代码都是比较麻烦的,如果说用c语言造一辆车,那么我需要用c语言先把轮子造好--各个零件,当我们造好之后再组装。那么c则是造好了轮子,只需要我们组装就好了。这里的的…

岩藻多糖-聚乙二醇-过氧化氢酶,Catalase-PEG-Fucoidan,过氧化氢酶-PEG-岩藻多糖

岩藻多糖-聚乙二醇-过氧化氢酶,Catalase-PEG-Fucoidan,过氧化氢酶-PEG-岩藻多糖 中文名称:岩藻多糖-过氧化氢酶 英文名称:Fucoidan-Catalase 别称:过氧化氢酶修饰岩藻多糖,过氧化氢酶-岩藻多糖 过氧化氢…

LiteFlow v2.9.4发布!一款能让你系统支持热更新,编排,脚本编写逻辑的国产规则引擎框架

前言 上海的天气降温让人猝不及防,但是我们的迭代速度却井然有序。 今天我们带来了LiteFlow v2.9.4版本。 我们每次的发布的issue有很大一部分依托于我们的使用者社区,社区人越来越多。我看到了使用者在使用过程中遇到的问题,也收集了很多…

【Java实战】这样写SQL语句性能嘎嘎好

目录 一、前言 二、SQL语句 1.【强制】不要使用 count(列名) 或 count(常量) 来替代 count(*),count(*) 是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。 2.【强制】count(distinct col) 计算该列除 NULL 之外的…

如何实现网站首页变为黑白色?

某些时候,网站会根据要求将页面调成黑白色,一开始我还以为是将连夜把图片和文字都搞成黑白色,但是转念一想,像推送产品的京东、淘宝,以及展示up内容的B站、CSDN等,刷新之后可能展示的内容均不同&#xff0c…

从上帝视角认识SpringMVC预览

前言 SpringMVC提供了很多可拓展的组件,例如:参数解析器、拦截器、异常处理器等等。但是如果想要理解/找到这些组件工作的位置/时机,很多时候总是容易迷失在其层层调用的源码之中。因此才想从上帝视角来剖析它。而所谓上帝视角,就…

[附源码]Python计算机毕业设计Django海南琼旅旅游网

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

22.12.1打卡 漫步校园 记忆化搜索

题目里很显然只走最短路, 直接用bfs从终点到起点搜一遍将每一步到终点所需要的最短的时间存在一个dis数组中, 然后你就会发现原来的地图变成了这样 上面是地图下面是dis数组, 再看看经典记忆化搜索模板题滑雪的地图 对的, 非常地相似, 接下来的操作和滑雪基本一样, 只不过起点是…

SQL创建新的输出字段

SQL创建新的输出字段1、准备数据2、对单个字段或者多个字段进行数值计算3、数值计算4、字段拼接5、字段使用别名6、 CASE WHEN逻辑转换case when 语法一case when 语法二case when 注意点查询的值可以为任何值(例如可以: select *)可以重命名…

Docker 快速安装Jenkins完美教程 (亲测采坑后详细步骤)(转)

转载至:https://www.cnblogs.com/fuzongle/p/12834080.html Docker 快速安装Jenkins完美教程 (亲测采坑后详细步骤) Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作&#xff0…

组织:阿米巴-事业部-成员公司

昨天有朋友讲到阿米巴-内部交易的成本与效率、讲到乌合之众山头团伙合并财报。昨天也都谈到方向大致正确品质大致不错极低规模成本、方向老钻错牛角尖品质精密高成本。我这篇文章就是:群中单句交流-朋友圈提炼段落-公众号整理成文章,这么来的。阿米巴&am…

从零开始带你实现一套自己的CI/CD(一)Jenkins

目录一、简介二、环境准备2.1 安装Docker和Docker-compose2.2 远程仓库Github/Gitee/GitLab2.3 部署Jenkins三、配置Jenkins3.1 Jenkins配置源码拉取地址3.2 Jenkins配置Maven构建代码3.2.1 准备jdk3.2.2 配置Maven3.2.3 Jenkins配置JDK&Maven并保存3.3 配置Jenkins任务构建…

【日常折腾】重新安装Windows7,做好ghost备份,迁移主目录,日常软件office,chrome,搜狗输入法,电脑管家,一键ghost进行备份。

目录前言1,关于Windows2,电脑起码分两个盘c、d盘3,因为主目录切换了,相关的其他人软件的数据都会迁移过去4,安装office软件3件套,不要全家桶5,安装电脑管家,还是选择腾讯吧6&#xf…

17条卢松松近期言论汇总

我是卢松松,点点上面的头像,欢迎关注我哦! 本文汇集了前段时间卢松松写的段子,有心情感悟、工作感悟、做直播带货、创业的感悟。关注互联网、草根创业者的朋友可以看看! (1) 人最舒服的是什么时候呢?我认为&#xff…

RabbitMQ的工作模式

一.RabbitMQ的一些知识 1.消息属性 RabbitMQ是基于AMQP消息传输协议来实现的消息中间件;类似HTTP有header和body两部分数据,Message是RabbitMQ中的消息体概念。 Message由Properties和Body组成,前者是一些元信息,如消息的优先级…

【LeetCode】1769.移动所有球到每个盒子所需的最小操作数

题目描述 有 n 个盒子。给你一个长度为 n 的二进制字符串 boxes ,其中 boxes[i] 的值为 ‘0’ 表示第 i 个盒子是 空 的,而 boxes[i] 的值为 ‘1’ 表示盒子里有 一个 小球。 在一步操作中,你可以将 一个 小球从某个盒子移动到一个与之相邻的…

整理Ubuntu深度学习服务器初始化操作

前言 这两年总是换服务器,每次配置都挺麻烦的要搜一堆东西,干脆直接整理一下供自己以后参考。 版本说明 Ubuntu 20.04 桌面版 系统配置 配置SSH 安装ssh sudo apt update sudo apt install openssh-server检查ssh状态 sudo systemctl status ssh…

js将图片或者文件转成base64格式的两种方法

场景一,项目assets资源里面的图片本地图片,重点如下 需要了解 canvas的基本操作,canvas.toDataURL 方法 HTMLCanvasElement.toDataURL() 方法返回一个包含图片展示的 data URI 。可以使用 type 参数其类型,默认为 PNG 格式。图片…

session和cookie的区别

文章目录一概念理解1、无状态的HTTP协议:2、会话(Session)跟踪:二cookie1、会话Cookie和持久Cookie2、Cookie具有不可跨域名性三. Session1、两个问题:2、session的创建:3、禁用cookie:四. 总结…