OpenCV 的模板匹配
OpenCV中的模板匹配
模板匹配(Template Matching)是计算机视觉中的一种技术,用于在大图像中找到与小图像(模板)相匹配的部分。OpenCV提供了多种模板匹配的方法,主要包括基于相关性和基于平方差的匹配方法。
1. 基本原理
模板匹配的基本原理是通过滑动模板图像(template)在源图像(source)上,计算每个位置的匹配得分,从而找到最匹配的位置。
2. 函数接口
在OpenCV中,模板匹配主要通过cv2.matchTemplate()
函数来实现。其基本用法如下:
result = cv2.matchTemplate(image, template, method)
image
: 源图像(在其中搜索匹配区域)。template
: 模板图像(需要匹配的图像部分)。method
: 匹配方法,常用的方法有:cv2.TM_SQDIFF
: 平方差匹配。cv2.TM_SQDIFF_NORMED
: 归一化平方差匹配。cv2.TM_CCORR
: 相关匹配。cv2.TM_CCORR_NORMED
: 归一化相关匹配。cv2.TM_CCOEFF
: 相关系数匹配。cv2.TM_CCOEFF_NORMED
: 归一化相关系数匹配。
3. 方法选择
不同的方法适用于不同的应用场景:
cv2.TM_SQDIFF
和cv2.TM_SQDIFF_NORMED
: 适用于模板和图像之间的匹配误差较小时。cv2.TM_CCORR
和cv2.TM_CCORR_NORMED
: 适用于图像亮度变化不大的场景。cv2.TM_CCOEFF
和cv2.TM_CCOEFF_NORMED
: 适用于图像中存在线性亮度变化的情况。
4. 性能优化
模板匹配的计算复杂度较高,对于大图像和模板,计算时间可能较长。可以通过以下方法进行优化:
- 调整模板图像的大小。
- 使用多尺度匹配(Multi-Scale Matching),即在不同尺度下进行匹配。
- 使用图像金字塔(Image Pyramid)技术减少计算量。
通过合理选择匹配方法和优化策略,可以有效提高模板匹配的效率和准确性。
以下是详细介绍模板匹配的相关内容:
基本步骤
-
读取图像和模板:
使用cv2.imread
函数读取原始图像和模板图像。 -
转换为灰度图像:
使用cv2.cvtColor
将图像转换为灰度图像。模板匹配通常在灰度图像上进行,以减少计算复杂度。 -
执行模板匹配:
使用cv2.matchTemplate
函数在原图像中搜索模板图像,并返回匹配结果。 -
设置阈值并找到匹配位置:
使用numpy
函数找到匹配结果中大于或等于阈值的位置。 -
绘制矩形框标记匹配区域:
使用cv2.rectangle
函数在原图像中绘制矩形框标记匹配区域。 -
显示结果:
使用matplotlib
或 OpenCV 显示结果图像。
详细代码示例
import cv2
import numpy as np
from matplotlib import pyplot as plt# Load the images
original_img = cv2.imread('images/test.png')
template_img = cv2.imread('images/test_target.jpg')# Convert to grayscale
original_gray = cv2.cvtColor(original_img, cv2.COLOR_BGR2GRAY)
template_gray = cv2.cvtColor(template_img, cv2.COLOR_BGR2GRAY)# Perform template matching
result = cv2.matchTemplate(original_gray, template_gray, cv2.TM_CCOEFF_NORMED)# Define threshold and find locations above the threshold
threshold = 0.8
loc = np.where(result >= threshold)# Draw rectangles around detected matches
for pt in zip(*loc[::-1]):cv2.rectangle(original_img, pt, (pt[0] + template_gray.shape[1], pt[1] + template_gray.shape[0]), (0, 0, 255), 2)# Display the result
plt.figure(figsize=(10, 10))
plt.imshow(cv2.cvtColor(original_img, cv2.COLOR_BGR2RGB))
plt.title('Detected Matches')
plt.axis('off')
plt.show()
运行结果如下:
下面是详细的中文解释:
import cv2
import numpy as np
from matplotlib import pyplot as plt
导入库
cv2
:OpenCV库的Python接口,用于图像处理和计算机视觉。numpy
:数值计算库,用于处理多维数组。pyplot
:matplotlib库的一个子库,用于绘图和数据可视化。
# Load the images
original_img = cv2.imread('images/test.png')
template_img = cv2.imread('images/test_target.jpg')
加载图像
- 使用
cv2.imread
函数读取图像文件,将原始图像保存到original_img
变量中,将模板图像保存到template_img
变量中。 - 需要根据实际文件路径替换 ‘images/test.png’ 和 ‘images/test_target.jpg’。
# Convert to grayscale
original_gray = cv2.cvtColor(original_img, cv2.COLOR_BGR2GRAY)
template_gray = cv2.cvtColor(template_img, cv2.COLOR_BGR2GRAY)
转换为灰度图
- 使用
cv2.cvtColor
函数将原始图像和模板图像从 BGR 色彩空间转换为灰度图,以简化后续的计算。
# Perform template matching
result = cv2.matchTemplate(original_gray, template_gray, cv2.TM_CCOEFF_NORMED)
执行模板匹配
- 使用
cv2.matchTemplate
函数在灰度原图中搜索模板图像。 cv2.TM_CCOEFF_NORMED
是一种匹配方法,表示归一化的相关系数匹配。
# Define threshold and find locations above the threshold
threshold = 0.8
loc = np.where(result >= threshold)
定义阈值并找到匹配位置
- 设置匹配结果的阈值
threshold
为 0.8,表示只有相关系数大于或等于 0.8 的位置才被认为是匹配的。 - 使用
np.where
函数找到匹配结果矩阵中所有大于或等于阈值的位置,返回这些位置的坐标。
# Draw rectangles around detected matches
for pt in zip(*loc[::-1]):cv2.rectangle(original_img, pt, (pt[0] + template_gray.shape[1], pt[1] + template_gray.shape[0]), (0, 0, 255), 2)
绘制矩形框
- 遍历所有检测到的匹配位置,并在原图上绘制矩形框。
zip(*loc[::-1])
将匹配位置的坐标转换为 (x, y) 对,以便在图像上绘制矩形框。cv2.rectangle
函数用于绘制矩形框:- 第一个参数是图像。
- 第二个参数是矩形的左上角坐标。
- 第三个参数是矩形的右下角坐标。
- 第四个参数是矩形框的颜色,这里是红色
(0, 0, 255)
。 - 第五个参数是矩形框的粗细,这里设置为 2。
# Display the result
plt.figure(figsize=(10, 10))
plt.imshow(cv2.cvtColor(original_img, cv2.COLOR_BGR2RGB))
plt.title('Detected Matches')
plt.axis('off')
plt.show()
显示结果
- 使用 matplotlib 库显示带有矩形框的原图。
plt.figure
设置显示窗口的大小,这里是 10x10 英寸。plt.imshow
显示图像,并将图像从 BGR 色彩空间转换为 RGB,以便正确显示颜色。plt.title
设置图像的标题,这里是 ‘Detected Matches’。plt.axis('off')
隐藏坐标轴,以便更好地显示图像。plt.show
显示图像。
运行上述代码后,你会看到原始图像中标记出所有匹配模板的位置,每个匹配位置都会用红色矩形框标记出来。
模板匹配方法
OpenCV 提供了几种不同的模板匹配方法,可以通过 cv2.matchTemplate
函数的第三个参数指定:
- cv2.TM_SQDIFF: 平方差匹配法,计算平方差。数值越小越匹配。
- cv2.TM_SQDIFF_NORMED: 归一化平方差匹配法。
- cv2.TM_CCORR: 相关系数匹配法,计算相关系数。数值越大越匹配。
- cv2.TM_CCORR_NORMED: 归一化相关系数匹配法。
- cv2.TM_CCOEFF: 相关匹配法,计算相关值。数值越大越匹配。
- cv2.TM_CCOEFF_NORMED: 归一化相关匹配法。
示例中的关键函数
cv2.imread(filename, flags)
: 读取图像。cv2.cvtColor(src, code)
: 转换颜色空间。cv2.matchTemplate(image, templ, method)
: 执行模板匹配。np.where(condition)
: 返回满足条件的数组索引。cv2.rectangle(img, pt1, pt2, color, thickness)
: 绘制矩形框。
注意事项
- 模板匹配是一个计算密集型任务,对于较大的图像和模板,计算时间会显著增加。
- 匹配结果受图像噪声、旋转、缩放等因素的影响,因此在实际应用中,可能需要预处理图像或结合其他方法(如特征匹配)来提高准确性。
实际应用
模板匹配广泛应用于图像识别、物体检测等领域,例如:
- 在游戏中检测特定图案或标志。
- 在工业视觉系统中检测缺陷或零部件位置。
- 在医学图像中检测特定器官或病变。
相关文章:

OpenCV 的模板匹配
OpenCV中的模板匹配 模板匹配(Template Matching)是计算机视觉中的一种技术,用于在大图像中找到与小图像(模板)相匹配的部分。OpenCV提供了多种模板匹配的方法,主要包括基于相关性和基于平方差的匹配方法。…...

26.0 Http协议
1. http协议简介 HTTP(Hypertext Transfer Protocol, 超文本传输协议): 是万维网(WWW: World Wide Web)中用于在服务器与客户端(通常是本地浏览器)之间传输超文本的协议.作为一个应用层的协议, HTTP以其简洁, 高效的特点, 在分布式超媒体信息系统中扮演着核心角色. 自1990年提…...

IO流打印流
打印流 IO流打印流是Java中用来将数据打印到输出流的工具。打印流提供了方便的方法来格式化和输出数据,可以用于将数据输出到控制台、文件或网络连接。 分类:打印流一般是指:PrintStream,PrintWriter两个类 特点1:打印流只操作文件目的地,…...
Cohere reranker 一致的排序器
这本notebook展示了如何在检索器中使用 Cohere 的重排端点。这是在 ContextualCompressionRetriever 的想法基础上构建的。 %pip install --upgrade --quiet cohere %pip install --upgrade --quiet faiss# OR (depending on Python version)%pip install --upgrade --quiet…...

MySQL系列-语法说明以及基本操作(二)
1、MySQL数据表的约束 1.1、MySQL主键 “主键(PRIMARY KEY)”的完整称呼是“主键约束”。 MySQL 主键约束是一个列或者列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可以强制表的实体完整性。 …...
【STM32】步进电机及其驱动
设计和实现基于STM32微控制器的步进电机驱动系统是一个涉及硬件设计、固件编程和电机控制算法的复杂任务。以下是一个概要设计,包括一些基本的代码示例。 1. 硬件设计 1.1 微控制器选择 选择STM32系列微控制器,因为它提供了丰富的GPIO端口和足够的处理…...

Excel自定义排序和求和
概览 excel作为办公的常备工具,好记性不如烂笔头,在此梳理记录下,此篇文章主要是记录excel的自定义排序和求和 一. 自定义排序 举个例子 1. 填充自定义排序选项 实现步骤: 选定目标排序值;文件->选项->自定…...

若依RuoYi-Vue分离版—免登录直接访问
若依RuoYi-Vue分离版—免登录直接访问 如何不登录直接访问前端:后端:方法1:在SecurityConfig.java中设置httpSecurity配置匿名访问方法2:在对应的方法或类上面使用Anonymous注解。 如何不登录直接访问 官网有说明:如何不登录直接…...

java基础知识漏洞记录一
下面是我在阅读JavaGuide面试资料时遇到的不熟悉的知识点总结 JDK9中JRE与JDK新关系 从 JDK 9 开始,就不需要区分 JDK 和 JRE 的关系了,取而代之的是模块系统(JDK 被重新组织成 94 个模块) jlink 工具 (随 Java 9 一起发布的新命…...

html的网页制作代码分享
<!-- prj_8_2.html --> <!DOCTYPE html> <html lang "EN"><head><meta charset"utf-8" /><title>页面布局设计</title><style type "text/css">*{padding: 0px;margin:0px;}#header{back…...

【PIXEL】2024年 Pixel 解除 4G限制
首先在谷歌商店下载 Shizuku 和 pixel IMS 两个app 然后打开shizuku ,按照它的方法启动 推荐用adb 启动( 电脑连手机 ,使用Qtscrcpy最简洁) 一条指令解决 shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.ap…...

C#、C++、Java、Python 选择哪个好?
选择哪种编程语言取决于你的需求和偏好,以及你打算做什么类型的项目。我这里有一套编程入门教程,不仅包含了详细的视频 讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我…...
爬虫补环境,ES6 Class在环境模拟中的应用与优势
相比于使用传统的Object实现补环境框架结构,使用 ES6 的 Class 具有以下优势: 代码维护更方便:Class的语法更简洁直观,方便开发者阅读和维护。组织结构更清晰:Class提供了明确的层次结构,有助于代码的模块…...

linuxcentos将本地库JAR/arr批量导入到Nexus3.x
背景 我们现在要搞一个私服maven来管理对应的依赖包,需要上传包。用nexus只能单个文件搞,批量导入不行,而且还要单独配置groupID什么的。不多BB,上教程 建脚本 vi mavenimport.sh内容是这个 #!/bin/bash # copy and run this script to t…...
js之操作元素属性和定时器以及相关案例倒计时
这里写目录标题 一级目录二级目录三级目录 Web APIs01四、操作元素属性1.操作元素常用属性2.操作元素样式属性通过style属性操作css1.修改样式通过style属性引出2.如果属性有-连接符,需要转换为小驼峰命名法3.赋值的时候,需要的时候不要忘记加css单位 通…...
高考计算机专业 热门专业方向
人工智能(AI):随着技术进步,人工智能成为计算机技术的新方向,涵盖自动驾驶、智能机器人、语音识别等应用。该领域对人才的需求持续增长,是计算机专业的一个热门方向。数据科学与大数据分析:随大…...

《web应用技术》第十一次作业
1、验证过滤器进行权限验证的原理。 代码展示: Slf4j WebFilter(urlPatterns "/*") public class LoginCheckFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) thro…...
Scala学习笔记11: 操作符
目录 第十一章 操作符1- 标识符2- 中置操作符3- 一元操作符4- 赋值操作符5- 操作符的优先级6- 结合性7- apply和update方法8- 提取器end 第十一章 操作符 在Scala中, 操作符是用来执行特定操作的符号或符号组合 ; Scala允许开发人员自定义操作符, 这些操作符可以是字母、数字…...

项目五串行通信系统 任务5-3温度信息上传
任务描述:DS18B20测量温度,单片机采集温度数据转换显示代码,并通过串行口发送到上位机显示。 底层文件: /********************************************* ds18b20底层函数:能完成一次温度数据读取 ***************************…...
前端 JS 经典:统一 Vite 中图片转换逻辑
在 Vue Vite 项目中有这样一段代码如下,引入了两个图片,一大一小。然后 console 出来引入结果。 import bigImg from "./assets/big.png"; import smallImg from "./assets/small.png";console.log(bigImg); console.log(smallImg…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...