OpenCV-模板匹配

news2024/9/22 7:38:41

文章目录

  • 一、简介
    • 1.定义与原理
    • 2.算法与方法
    • 3.参数解释
  • 二、代码实现
    • 1.读取数据
    • 2.检查图像是否成功加载
    • 3.获取模板的高度和宽度
    • 4.模板匹配
    • 5.计算匹配区域坐标
    • 6.显示图像
    • 7.全部代码
  • 三、总结

一、简介

在OpenCV中,模型匹配(或称为模板匹配)是一种用于在图像中查找与给定模板最相似区域的技术。OpenCV提供了cv2.matchTemplate()函数来实现模板匹配。这个函数通过滑动模板图像在输入图像上来比较模板和每个可能的窗口区域,并计算它们之间的相似度。

1.定义与原理

模板匹配是一种最原始、最基本的模式识别方法,其核心在于通过已知的小图像(模板)在另一幅大图像中搜寻相同或相似的目标物,并确定其位置。这一过程主要依赖于计算模板图像与待搜索图像中各个区域的相似度。

2.算法与方法

模板匹配算法通常包括以下几个步骤:

读取图像和模板:首先,你需要读取包含要搜索对象的图像(称为输入图像)以及你想要匹配的模板图像。
执行模板匹配:使用cv2.matchTemplate()函数在输入图像上搜索与模板最相似的区域。
查找最佳匹配:通过比较cv2.matchTemplate()函数返回的相似度图,找到与模板最匹配的区域。这通常是通过找到相似度图中的最大值(或最小值,取决于你使用的匹配方法)来完成的。
提取匹配区域:一旦找到最佳匹配的位置,你可以从原始图像中提取该区域的图像。

3.参数解释

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

  • image:输入图像,需要是8位或32位浮点型。
  • templ:模板图像,大小和类型与输入图像相同。
  • method:指定匹配方法的标志。OpenCV提供了几种不同的方法,如下:
    • TM_SQDIFE平方差匹配法:该方法采用平方差来进行匹配;匹配越好,值越小;匹配越差,值越大。
    • TN_CCORR相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
    • TN_CCOEFF相关系数匹配法:数值越大表明匹配程度越好。
    • TN_SQDIFF_NORMED归一化平方差匹配法,匹配越好,值越小;匹配越差,值越大。
    • TN_CCORR_NORMED归一化相关匹配法,数值越大表明匹配程度越好。
    • TN_CCOEFF_NORMED归一化相关系数匹配法,数值越大表明匹配程度越好。
  • result:匹配结果存储在这个矩阵中,类型为32位浮点数。如果未提供,则自动创建。
  • mask:模板的掩码。只有当模板掩码中的相应元素非零时,才考虑模板或输入图像中的这些元素。

二、代码实现

1.读取数据

import cv2  
  
# 读取图像和模板  
kele = cv2.imread('kl.png')  
template = cv2.imread('template.png')  
  • 使用cv2.imread()函数读取名为’kl.png’的图像文件,并将其存储在变量kele中,同样地,读取名为’template.png’的模板图像文件,并将其存储在变量template中

2.检查图像是否成功加载

if kele is None or template is None:  
    print("Error: Unable to load images.")  
else:  
    # 显示原始图像和模板  
    cv2.imshow('kele', kele)  
    cv2.imshow('template', template)  
    cv2.waitKey(0)  
  • 检查kele和template变量是否为None,即检查图像是否成功加载,如果任一图像未成功加载,则打印错误信息。
  • 如果图像成功加载,则显示原始图像和模板。
    在这里插入图片描述

3.获取模板的高度和宽度

    h, w = template.shape[:2]  
  • 使用shape属性获取模板图像的高度和宽度,并分别存储在h和w中。

4.模板匹配

    res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED)  
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  
  • 在kele图像上搜索与template模板最相似的区域,使用归一化相关系数匹配方法。
  • 使用cv2.minMaxLoc()函数找到res矩阵中的最小值和最大值及其位置。

5.计算匹配区域坐标

    top_left = max_loc  
    bottom_right = (top_left[0] + w, top_left[1] + h)  
   
    kele_template = cv2.rectangle(kele.copy(), top_left, bottom_right, (0, 255, 0), 2) 
  • 匹配区域的左上角坐标,并根据模板的宽度和高度计算匹配区域的右下角坐标。
  • 在kele图像的副本上绘制矩形,并设置颜色为绿色(0, 255, 0),线宽为2

6.显示图像

    cv2.imshow('kele_template', kele_template)  
    cv2.waitKey(0)  
  
    cv2.destroyAllWindows()
  • 显示带有矩形标记的kele图像副本,窗口标题为’kele_template’
    -

7.全部代码

import cv2  
  
# 读取图像和模板  
kele = cv2.imread('kl.png')  
template = cv2.imread('template.png')  
  
# 检查图像是否成功加载  
if kele is None or template is None:  
    print("Error: Unable to load images.")  
else:  
    # 显示原始图像和模板  
    cv2.imshow('kele', kele)  
    cv2.imshow('template', template)  
    cv2.waitKey(0)  
  
    # 获取模板的高度和宽度  
    h, w = template.shape[:2]  
  
    # 执行模板匹配  
    res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED)  
  
    # 查找最佳匹配(即相似度最高的位置)  
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  
  
    # 计算匹配区域的左上角和右下角坐标  
    top_left = max_loc  
    bottom_right = (top_left[0] + w, top_left[1] + h)  
  
    # 在原始图像上绘制矩形以标记匹配区域  
    kele_template = cv2.rectangle(kele.copy(), top_left, bottom_right, (0, 255, 0), 2)  
  
    # 显示带有匹配区域的图像  
    cv2.imshow('kele_template', kele_template)  
    cv2.waitKey(0)  
  
    # 清理所有OpenCV窗口  
    cv2.destroyAllWindows()

这段代码展示了如何使用OpenCV进行模板匹配,并在原始图像上标记出匹配的区域。首先检查图像是否成功加载,然后显示原始图像和模板,执行模板匹配,找到最佳匹配位置,并在原始图像的副本上绘制矩形以标记该位置。最后,显示带有匹配区域的图像并关闭所有窗口。

三、总结

OpenCV中的模板匹配是一种在图像中寻找与给定模板最相似区域的方法。改方法相对简单,比较容易理解和实现,同时也可以应用于多种场景,如物体检测、图像识别、图像处理等领域,并且OpenCV中也提供了多种模板匹配算法,可以根据具体情况来选择合适的算法,但是模板匹配对尺度变换比较敏感,比如我们对模板图像进行放大或者缩小操作后,可能会导致无法找到准确的位置,且因为需要遍历待检测图像中的每一个可能位置,并与模板图像进行比较,所有耗时较大。

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

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

相关文章

机器学习-逻辑回归原理及其公式

逻辑回归(Logistic Regression)是一种广泛应用于分类任务的统计学方法,尤其是在二分类问题中表现尤为突出。尽管它的名字中包含“回归”,但实际上逻辑回归是一种分类算法。逻辑回归的目标是预测一个样本属于某一类别的概率&#x…

如何在本地Windows运行hadoop

我们在本地运行hadoop的时候,发现了报错: 两种情况: 1、没有配置winutils 这种情况只能从本地上传文件到hdfs,但是不能从hdfs下载文件到windows本地,也无法在本地运行MapReduce的过程。如果连上传的时候都报这种错误…

Linux shell编程学习笔记78:cpio命令——文件和目录归档工具

0 前言 在Linux系统中,除了tar命令,我们还可以使用cpio命令来进行文件和目录的归档。 1 cpio命令的功能,帮助信息,格式,选项和参数说明 1.1 cpio命令的功能 cpio 名字来自 "copy in, copy out"&#xf…

NLP基础及其代码-tokenizer

基础知识 NLP-分词器:SentencePiece【参考Chinese-LLaMA-Alpaca在通用中文语料上训练的20K中文词表并与原版LLaMA模型的32K词表进行合并的代码】_sentencepiece 中文训练-CSDN博客 【OpenLLM 008】大模型基础组件之分词器-万字长文全面解读LLM中的分词算法与分词器…

链表题目训练

https://leetcode.cn/problems/remove-linked-li​​​​​​st-elements/description/第一题:移除链表元素 https://leetcode.cn/problems/remove-linked-li​​​​​​st-elements/description/ 第二题:反转链表 https://leetcode.cn/problems/reve…

前端JS常见面试题

数据双向绑定 Bug解决 集成工作涉及 版本node 依赖包报错 版本问题!!!ElementUI、Cesium、ant-design 配置、代码和其他 混入 在Vue中,混入(Mixins)是一种非常有用的功能,它允许你创建可复…

C语言-数据结构 无向图迪杰斯特拉算法(Dijkstra)邻接矩阵存储

在迪杰斯特拉中,相比普利姆算法,是从顶点出发的一条路径不断的寻找最短路径,在实现的时候需要创建三个辅助数组,记录算法的关键操作,分别是Visited[MAXVEX]记录顶点是否被访问,教材上写的final数组但作用是…

springboot请求传参常用模板

注释很详细,直接上代码 项目结构 源码 HelloController package com.amoorzheyu.controller;import com.amoorzheyu.pojo.User; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.*;import java.ti…

选择开放式耳机时应该注重哪些?值得入手的四款蓝牙耳机推荐

在选择开放式耳机时,以下这些方面需要重点关注: 舒适度方面: 设计与材质考量:耳挂和耳翼的设计必须合理,能够与不同的耳朵形状及大小相契合,保证佩戴牢固且不会过紧,防止对耳朵造成挤压。例如…

【解决bug之路】npm install node-sass(^4.14.1)连环报错解决!!!(Windows)

有关node-sass的深入分析可参考:又报gyp ERR!为什么有那么多人被node-sass 坑过? 主要有如下三方面错误,请自查: 1.node,npm版本需与node-sass版本匹配,像node-sass(^4.14.1&#x…

李沐关于大模型应用及职业发展的分享

前几天看了 李沐 在上海交大做的一个 分享 , 主要分享了他对于大模型的一些看法和他个人的经历。 我很喜欢李沐,技术厉害,看起来比较接地气,录制的 课程 也比较容易看懂。 大模型的应用 下面这张图是他对当前大模型应用的看法。…

前端学习笔记-Web APls篇-03

Dom事件进阶 1.事件流 事件流和两个阶段说明 事件流指的是事件完整执行过程中的流动路径 说明:假设页面里有个div,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段简单来说:捕获阶段是 从父到子【大到小】 …

【鸿蒙开发工具报错】Build task failed. Open the Run window to view details.

Build task failed. Open the Run window to view details. 问题描述 在使用deveco-studio 开发工具进行HarmonyOS第一个应用构建开发时,通过Previewer预览页面时报错,报错信息为:Build task failed. Open the Run window to view details.…

第三部分:5---进程等待、进程终止

目录 进程的两种终止方式: 正常终止——进程退出码: 查看最近一次进程退出的退出码: 自定义退出码对应的文本信息: 退出码和C语言的错误码的关系: 异常终止——操作系统发送信号: —————————…

java基础-IO(6)转换流InputStreamReader、OutputStreamWriter

引入: 从第一节可知,流分为两类:字节流和字符流,转换流就是在两者之间进行转换。 字节流转换为字符流; 字符流转换为字节流。 字符集 字符集:定义了可用字符及其对应的数字编码的集合。常见的字符集有UT…

1.Python解释器和Pycharm安装设定

Python是一种动态的,解释型语言,需要安装Python解释器。安装Python后,可以使用其自带的编码工具来编写代码。也可以使用第三方的工具,这里使用Pycharm,它有很多优点,可以提高代码编写和编码调试效率。 一、Python解释…

nacos 安装 centos7 docker

一、拉取镜像 docker pull nacos/nacos-server二、创建容器 ①一般 docker run -d --name nacos-server -p 8848:8848 -e MODEstandalone nacos/nacos-server②通过配置文件配置相关环境变量 1上传文件 2创建 docker run -d \ --name nacos \ --env-file ./nacos/custom.env …

【C++ Primer Plus习题】14.3

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "queuetp.h&quo…

151-钓鱼篇邮件钓鱼SPF绕过自建邮件系统SwaksGophish

前置内容: 1、什么是SPF: 发件人策略框架(Sender Policy Framework)电子邮件认证机制中文译为发送方策略框架&#xff0c;主要作用是防止伪造邮件地址。可以把 SPF 记录看成是一个合法 IP 地址的白名单&#xff0c;当进来的邮件来自一个白名单中指定的 IP 地址&#xff0c;SP…

Java中的常用类及包装类

目录 Java中的常用类及包装类 Math类 Math类常用方法 BigInteger类 创建BigInteger类对象 常用方法 BigDecimal类 创建BigDecimal类对象 常用方法 Date日期类 创建Date类对象 常用方法 Calendar类 获取Calendar类实例 常用方法 SimpleDateFormat类 创建SimpleDateFormat类对象 …