OpenCV自学笔记十八:模板匹配

2023-09-21 19:52:37

模板匹配是一种在图像中寻找指定模式的方法。OpenCV库提供了用于模板匹配的函数,可以帮助我们在图像中定位和识别特定的模式。下面是模板匹配的基础原理和一个示例:

模板匹配通过在待匹配图像上滑动一个固定大小的模板图像,并计算模板与图像之间的相似度来寻找匹配位置。相似度通常使用相关性或差异度量来衡量。在滑动过程中,当相似度达到最大值或阈值时,认为找到了一个匹配。

下面是一个使用OpenCV进行模板匹配的示例代码:

​
import cv2

import numpy as np

import matplotlib.pyplot as plt

# 读取主图像和模板图像

img = cv2.imread('main_image.jpg', 0)

template = cv2.imread('template_image.jpg', 0)

# 进行模板匹配

result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

# 获取匹配位置

top_left = max_loc

bottom_right = (top_left[0] + template.shape[1], top_left[1] + template.shape[0])

# 在主图像上绘制矩形框

cv2.rectangle(img, top_left, bottom_right, 255, 2)

# 显示结果

plt.subplot(131), plt.imshow(img, cmap='gray')

plt.title('Original Image'), plt.xticks([]), plt.yticks([])

plt.subplot(132), plt.imshow(template, cmap='gray')

plt.title('Template Image'), plt.xticks([]), plt.yticks([])

plt.subplot(133), plt.imshow(result, cmap='gray')

plt.title('Matching Result'), plt.xticks([]), plt.yticks([])

plt.show()

​

在上述示例中,我们首先使用`cv2.imread()`函数读取主图像和模板图像,并将它们转换为灰度图像。

然后,使用`cv2.matchTemplate()`函数进行模板匹配。该函数接受三个参数:待匹配的主图像、模板图像和匹配方法。在本例中,我们使用了`cv2.TM_CCOEFF_NORMED`作为匹配方法。

接下来,使用`cv2.minMaxLoc()`函数获取匹配结果中的最大值位置。这对应于找到的最佳匹配位置。

然后,我们使用找到的匹配位置,在主图像上绘制矩形框。

最后,使用Matplotlib库的`plt.subplot()`和`plt.imshow()`函数显示原始图像、模板图像和匹配结果图像。

运行上述代码,你将看到显示了原始图像、模板图像和匹配结果的窗口。匹配结果中的矩形框表示找到的最佳匹配位置。

更多推荐

微服务下怎么做权限管理

微服务下怎么做权限管理应用拆分微服务后,一个不可避免的问题就是权限问题。拆分后的各个微服务如何处理权限,怎么处理才能保证满足业务的需求,怎么处理才能保持架构的简单及可维护?今天的文章,让我们来深入微服务架构下的权限处理问题,看看这个没有最佳实践的领域,如何能够针对业务需求来设计的较为优雅。先来理解几个名词关于权限,可能

CSV 与 Excel(.xls)-有什么区别?

CSV和Excel的区别CSV和Excel都是常用的电子表格文件格式,但它们之间有一些区别。下面是CSV和Excel的具体区别:区别一:文件格式CSV是一种纯文本文件格式,它使用逗号分隔不同的数据字段。Excel是一种二进制文件格式,它使用二进制编码来存储数据。区别二:功能Excel是一款功能强大的电子表格软件,它提供

YashanDB混合存储揭秘:行式存储如何为高效TP业务保驾护航(下)

上一篇文章https://mp.weixin.qq.com/s/mQLzi2PSZxqwwACSsq49ng为大家讲述了行式存储中事务并发控制的关键设计和优化。YashanDB采用了In-placeUpdate的块级MVCC,能极大提高事务并发处理能力。本篇文章,我们将会详解插入性能优化和宽行存储的设计。插入性能优化Y

git详细教程

git详细教程区域划分单分支操作gitlog语法常用的参数及其详解gitlog结果gitrefloggitdiff常用的参数及其详解gitreset常用的参数及其详解gitcheckoutgitrm常用的参数及其详解gitremote常用的参数及其详解多分支切换代码融合gitswitch常用的参数及其详解gitbran

如何使用Java语言判断出geek是字符串参数类型,888是整数参数类型,[hello,world]是数组参数类型,2.5是双精度浮点数类型?

如何使用Java语言判断出geek是字符串参数类型,888是整数参数类型,[hello,world]是数组参数类型,2.5是双精度浮点数类型?Java是一种静态类型的编程语言,这意味着我们需要在编译时为变量指定具体的类型。但是,你可以使用instanceof关键字来检查某个对象是否属于某个特定类。以下是一个示例,用于检

Confidential Compute Architecture - Arm构架的TEE新模式

1简介如今,云计算在分布式计算资源按需使用方面起着重要的作用。许多公司,如亚马逊、谷歌或微软都提供云服务,但使用这些服务需要信任服务提供商。这意味着一方面依赖提供商对抗攻击者,但另一方面也要信任提供商本身。恶意的提供商可能最终滥用其客户的敏感数据。使用可信执行环境(TEE)可以帮助增加对提供商的信任。在传输过程中,通常

C++——string的模拟实现+详细讲解

文章目录迭代器构造函数拷贝构造函数赋值运算符重载函数析构函数获取字符串函数获取字符串的字符个数访问类对象中的成员实现对类对象中成员的访问和操作实现对类对象中的成员的常量访问字符串容量调整字符串大小调整尾部插入字符尾部插入字符串重载函数符+=字符串尾部添加字符字符串尾部添加字符串指定位置插入字符指定位置插入字符串删除指定

【数据结构】二叉树链式结构的实现(三)

目录一,二叉树的链式结构二,二叉链的接口实现1,二叉链的创建2,接口函数3,动态创立新结点4,创建二叉树5,前序遍历6,中序遍历7,后序遍历三,结点个数以及高度等1,接口函数2,结点个数3,叶子结点个数4,二叉树高度5,二叉树第k层结点个数6,二叉树查找值为x的结点一,二叉树的链式结构二叉树的链式存储结构是指,用链表来

CFimagehost私人图床本地部署结合cpolar内网穿透实现公网访问

文章目录1.前言2.CFImagehost网站搭建2.1CFImagehost下载和安装2.2CFImagehost网页测试2.3cpolar的安装和注册3.本地网页发布3.1Cpolar临时数据隧道3.2Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置)4.公网访问测试5.结语1.前言图片服务器

STC单片机定时器0手动状态脉冲定时器2自动状态脉冲加减速控制

/***定时器0中断运行函数判断电机运行为一启动输出***///ManuMTARUN_FLAG手动定时器电机A运行标志M_Speed//ManuMTBRUN_FLAG手动定时器电机B运行标志//a1=XAddSpeed;//X加速系数送缓冲器201845//b1=YAddSpeed;//Y加速系数送缓冲器201845v

C++学习(1)

一、C++概述(了解)C++在C语言的基础上添加了面向对象编程和泛型编程的支持二、helloword程序(掌握)#define_CET_SECURE_NO_WARNINGS//在开发软件visualstudio编译c文件时,visualstudio认为strcpy,scanf等函数不安全的导致报警告和错误,导致无法编译

热文推荐