《OpenCV计算机视觉》—— 模板匹配

2024-09-05 13:52

本文主要是介绍《OpenCV计算机视觉》—— 模板匹配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、模板匹配简单介绍
  • 二、三个主要函数的介绍
    • 1.执行模板匹配函数-cv2.matchTemplate()
    • 2.查找最佳匹配函数-cv2.minMaxLoc()
    • 3.在原图上绘制匹配区域函数-cv2.rectangle()
  • 三、代码实现

一、模板匹配简单介绍

  • 在Python中,模板匹配是一种在图像中查找与给定模板最相似区域的技术。

  • 模板匹配的基本步骤包括:

    • 1.加载图像和模板:首先,你需要加载你想要搜索的图像(通常称为“原图”)和你想要匹配的模板图像。模板图像应该是原图中的一个较小部分。
    • 2.执行模板匹配:使用OpenCV的cv2.matchTemplate()函数在原图上滑动模板,并计算每个位置的匹配度。这个函数会返回一个矩阵,其中每个元素表示模板在原图对应位置上的匹配程度。
    • 3.查找最佳匹配:使用cv2.minMaxLoc()函数在匹配度矩阵中找到最大值(或最小值,取决于你使用的匹配方法)及其位置。这个位置就是模板在原图中最佳匹配的位置。
    • 4.在原图上绘制匹配区域:为了可视化结果,你可以在原图上绘制一个矩形来标记匹配到的区域。

二、三个主要函数的介绍

1.执行模板匹配函数-cv2.matchTemplate()

  • result = cv2.matchTemplate(image, template, method, mask=None)
  • 参数说明:
    • image:要在其中搜索模板的原图像。
    • template:要在原图中搜索的模板图像。它应该比原图小。
    • method:用于比较模板和原图的区域的匹配方法,OpenCV 提供了几种不同的方法:
      • TM_SQDIFF :平方差匹配法:该方法采用平方差来进行匹配;匹配越好,值越小;匹配越差,值越大。
      • TM_CCORR :相关匹配法:该方法采用乘法作;数值越大表明匹配程度越好。
      • TM_CCOEFF :相关系数匹配法:数值越大表明匹配程度越好。
      • TM_SQDIFF_NORMED :归一化平方差匹配法,匹配越好,值越小;匹配越差,值越大。
      • TM_CCORR_NORMED :归一化相关匹配法,数值越大表明匹配程度越好。
      • TM_CCOEFF_NORMED :归一化相关系数匹配法,数值越大表明匹配程度越好。
  • 返回值 result 是一个矩阵,其大小取决于原图和模板的大小以及使用的匹配方法。矩阵中的每个元素都表示模板在原图对应位置上的匹配程度。对于某些方法(如平方差匹配),值越小表示匹配程度越高;而对于其他方法(如相关匹配),值越大表示匹配程度越高。

2.查找最佳匹配函数-cv2.minMaxLoc()

  • minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(src, mask=None)

  • 参数说明:

    • src:输入的二维数组(如灰度图像或匹配结果矩阵)。
    • mask:一个与 src 相同大小的掩码图像,用于指定 src 中哪些区域应该被考虑(通常不用)。
  • 返回值:

    • minVal:数组中的最小值。
    • maxVal:数组中的最大值。
    • minLoc:最小值的坐标(一个二元组,(x, y))。
    • maxLoc:最大值的坐标(一个二元组,(x, y))。

3.在原图上绘制匹配区域函数-cv2.rectangle()

  • cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)

  • 参数说明:

    • img:要在其上绘制矩形的图像。这应该是一个单通道(灰度)图像或三通道(彩色)图像。
    • pt1:矩形的一个角的坐标,这是一个二元组(tuple),格式为 (x, y)。
    • pt2:矩形对角线上的另一个角的坐标,也是一个二元组,格式为 (x, y)。注意,这个对角线上的点不需要是矩形的右下角或右上角,它只需要与 pt1 形成对角线即可。
    • color:矩形的颜色。对于灰度图像,这是一个介于0(黑色)和255(白色)之间的标量。对于彩色图像,这是一个三元组,分别代表蓝色、绿色和红色的强度,值的范围也是从0到255。
    • thickness:线条的粗细(可选)。如果设置为 -1,则填充矩形。默认值是 1。
    • lineType:线条的类型(可选)。例如,cv2.LINE_8 表示8连接线,cv2.LINE_AA 表示抗锯齿线。如果未指定,则默认为 cv2.LINE_8。
    • shift:坐标点和线条粗细的小数位数(可选)。这个参数通常保持为默认值 0。
  • 返回绘制好的图片

三、代码实现

import cv2# 读取原图和标签图
kele = cv2.imread('kele.png')
template = cv2.imread('template.png')
# 显示原图和标签图
cv2.imshow('kele', kele)
cv2.imshow('template', template)# 进行模板匹配
res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED)  # 返回匹配结果的矩阵# 查找最佳匹配
# cv2.minMaxLoc可以获取矩阵中的最小值和最大值,以及最小值坐标和最大值坐标
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # 最佳匹配位置(数组)中的:最小值、最大值、最小值坐标、最大值坐标
top_left = max_loc  # 左上角点的坐标就是最大值位置的坐标
h, w = template.shape[:2]  # 获取标签图的高和宽
bottom_right = (top_left[0] + w, top_left[1] + h)  # 右下角点的坐标
# 绘制矩形
kele_template = cv2.rectangle(kele, top_left, bottom_right, (0, 255, 0), 2)# 显示绘制后的原图
cv2.imshow('kele_template', kele_template)# 等待任意键按下后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 结果如下
    在这里插入图片描述

这篇关于《OpenCV计算机视觉》—— 模板匹配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139143

相关文章

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。