15- OpenCV:模板匹配(cv::matchTemplate)

news2025/1/12 1:52:29

目录

1、模板匹配介绍

2、cv::matchTemplate

3、模板匹配的方法(算法)

4、代码演示


1、模板匹配介绍

模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。

它可以在一幅图像中寻找与给定模板最相似的部分。

模板匹配的步骤:

(1)首先需要一个模板图像T(给定的子图像);

(2)另外需要一个待检测的图像-源图像S;

(3)工作方法:在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。

需要注意的是:matchTemplate函数可以用于在图像中进行目标检测、模式识别等应用,但需要注意模板的大小和比例与输入图像的匹配程度,以及选择合适的匹配方法来获取准确的匹配结果

2、cv::matchTemplate

void cv::matchTemplate(

InputArray image,// 源图像,必须是8-bit或者32-bit浮点数图像

InputArray templ,// 模板图像,类型与输入图像一致

OutputArray result,// 输出结果,必须是单通道32位浮点数,假设源图像WxH,模板图像wxh,                  则结果必须为W-w+1, H-h+1的大小。

int method,//使用的匹配方法

InputArray mask=noArray() //(optional) 可选的掩码图像,用于指定要处理的区域。

)

3、模板匹配的方法(算法)

enum TemplateMatchModes {
    TM_SQDIFF                    = 0,  // 计算平方不同
    TM_SQDIFF_NORMED  = 1,  // 计算归一化平方不同
    TM_CCORR                    = 2,  // 计算相关性
    TM_CCORR_NORMED  = 3,  // 计算归一化相关性
    TM_CCOEFF                   = 4,  // 计算相关系数
    TM_CCOEFF_NORMED = 5   // 计算归一化相关系数
};

相关的公式表示:

4、代码演示
#include<opencv2\opencv.hpp>
#include<iostream>
#include <math.h>

using namespace cv;
using namespace std;

// 模板匹配
Mat src, temp, dst;
int match_method = TM_SQDIFF;
int max_track = 5;
const char* INPUT_T = "input image";
const char* OUTPUT_T = "result image";
const char* match_t = "template match-demo";
void Match_Demo(int, void*);
int main(int argc, char** argv) 
{
	// 待检测图像
	src = imread("cat.png");
	// 模板图像
	temp = imread("ear.png");
	if (src.empty() || temp.empty()) 
	{
		printf("could not load image...\n");
		return -1;
	}

	namedWindow(INPUT_T, CV_WINDOW_AUTOSIZE);
	namedWindow(OUTPUT_T, CV_WINDOW_NORMAL);
	namedWindow(match_t, CV_WINDOW_AUTOSIZE);
	imshow(INPUT_T, temp);
	const char* trackbar_title = "Match Algo Type:";
	createTrackbar(trackbar_title, OUTPUT_T, &match_method, max_track, Match_Demo);
	Match_Demo(0, 0);

	waitKey(0);
	return 0;
}

void Match_Demo(int, void*) 
{
	int width = src.cols - temp.cols + 1;
	int height = src.rows - temp.rows + 1;
	Mat result(width, height, CV_32FC1);//32位浮点数,单通道

	matchTemplate(src, temp, result, match_method, Mat());
	normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());

	Point minLoc;
	Point maxLoc;
	double min, max;
	src.copyTo(dst);
	Point temLoc;

	// 用于在给定矩阵中找到最小值、最大值及其对应的位置。
	minMaxLoc(result, &min, &max, &minLoc, &maxLoc, Mat());
	if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED) 
		temLoc = minLoc;
	else
		temLoc = maxLoc;

	// 绘制矩形
	rectangle(dst, Rect(temLoc.x, temLoc.y, temp.cols, temp.rows), Scalar(0, 0, 255), 2, 8);
	rectangle(result, Rect(temLoc.x, temLoc.y, temp.cols, temp.rows), Scalar(0, 0, 255), 2, 8);

	imshow(OUTPUT_T, result);
	imshow(match_t, dst);
}


// 简易版例子
#if 0
int main()
{
	// 读取输入图像和模板图像

	cv::Mat image = cv::imread("cat.png", cv::IMREAD_COLOR);
	cv::Mat templ = cv::imread("ear.png", cv::IMREAD_COLOR);

	// 创建结果矩阵

	cv::Mat result;

	// 进行模板匹配

	cv::matchTemplate(image, templ, result, cv::TM_CCOEFF_NORMED);

	// 寻找最大匹配值和对应位置

	double minVal, maxVal;
	cv::Point minLoc, maxLoc;
	cv::minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);

	// 绘制矩形框标记匹配位置

	cv::rectangle(image, maxLoc, cv::Point(maxLoc.x + templ.cols, maxLoc.y + templ.rows), cv::Scalar(0, 255, 0), 2);

	// 显示结果图像

	cv::imshow("Result", image);
	cv::waitKey(0);

	return 0;
}
#endif

效果展示:

注意:当选择2的时候,有可能找不到,原因在于我们选择的模板有关,有可能存在失真的效果。所以对于模板如何选择也很关键。

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

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

相关文章

中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备2

接前一篇文章&#xff1a;中移&#xff08;苏州&#xff09;软件技术有限公司面试问题与解答&#xff08;4&#xff09;—— virtio所创建的设备1 在上一篇文章中&#xff0c;对于面试所提出的问题“virtio会创建哪些设备&#xff1f;”&#xff0c;有了初步答案&#xff0c;即…

基于python和定向爬虫的商品比价系统实现

目录 前言 一、系统设计 1. 系统需求分析 2. 系统设计思路 二、系统实现 1. 爬虫部分 2. 比价部分 3. 完整系统代码 三、系统优化 1. 多线程爬取 2. 引入数据库 四、总结 前言 商品比价系统是一种可以帮助用户快速找到最优价格商品的系统。本文将介绍如何使用pyth…

开源的API Gateway项目- Kong基于OpenResty(Nginx + Lua模块)

Kong 是一个在 Nginx 内运行的开源 API 网关和微服务抽象层。它是用于处理 API 流量的灵活、可扩展、可插入的工具。 Kong 提供了以下功能&#xff1a; 用户登录&#xff1a;Kong 提供了多种认证插件&#xff0c;像 JWT、OAuth 2.0 等&#xff0c;可以满足用户登录需求。Toke…

Linux---文件系统

在基础IO中&#xff0c;我们所讲的都是对被打开文件的管理&#xff0c;但是不是所有的文件都是被打开的&#xff0c;对那些在磁盘中保存的没有被打开的文件&#xff0c;我们同样也需要管理&#xff0c;这个就像是快递站中等待被人取走的快递&#xff0c;我们需要将它们分门别类…

Java项目:15 springboot vue的智慧养老手表管理系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统共分为两个角色&#xff1a;家长&#xff0c;养老院管理员 框架&#xff1a;springboot、mybatis、vue 数据库&#xff1a;mysql 5.7&…

Fink CDC 1.0 至3.0的从古至今

本文主要分享Flink CDC 1.0 至3.0的发展历程,了解其背后的关键特性和发展趋势,探讨其在大数据领域的影响和价值。 一、CDC概述 CDC是一种用以掌控数据变化的软件架构(技术思路),用于捕获和传递数据库中发生的数据变化。当数据库中发生增(INSERT)/删(DELETE)/改(UPD…

#GPU|LLM|AIGC#集成显卡与独立显卡|显卡在深度学习中的选择与LLM GPU推荐

区别 核心区别&#xff1a;显存&#xff0c;也被称作帧缓存。独立显卡拥有独立显存&#xff0c;而集成显卡通常是没有的&#xff0c;需要占用部分主内存来达到缓存的目的 集成显卡&#xff1a; 是集成在主板上的&#xff0c;与主处理器共享系统内存。 一般会在很多轻便薄型的…

win11 C盘出现感叹号

Win11系统中&#xff0c;出现本地磁盘上出现黄色感叹号&#xff0c;是BitLocker未关闭或者正在激活导致 解决方案&#xff1a; 鼠标右键点击开始菜单 &#xff0c;之后选择“Windows终端”管理员 管理-bde状态&#xff1b;# #检查状态 管理-bde&#xff1f;# #查看帮助 Mana…

Docker 配置 Gitea + Drone 搭建 CI/CD 平台

Docker 配置 Gitea Drone 搭建 CI/CD 平台 配置 Gitea 服务器来管理项目版本 本文的IP地址是为了方便理解随便打的&#xff0c;不要乱点 首先使用 docker 搭建 Gitea 服务器&#xff0c;用于管理代码版本&#xff0c;数据库选择mysql Gitea 服务器的 docker-compose.yml 配…

Python如何让程序实现开机自启功能(随Windows启动)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 实现步骤 📒📝 方法一:使用Windows任务计划程序📝 方法二:添加注册表🎈 创建注册表项🎈 检查注册表项是否成功创建⚓️ 相关链接 ⚓️📖 介绍 📖 为了方便省事,我们很多时候需要给软件添加一个开机自启的功能,…

《微信小程序开发从入门到实战》学习九十三

7.1 视图容器组件 7.1.3 swiper与swiper-item组件 swiper组件的显示效果如下图所示&#xff1a; indicator-dots、indicator-color和indicator-active-color三个属性用于设置swiper组件下方的指示点。设置指示点的颜色时&#xff0c;可以使用HexColor&#xff0c;也可以使用r…

vscode开发FPGA(1)---TEROS_HDL插件报错

一、TerosHDL:modelsim(vlog-66)报错 Error: (vlog-66) Execution of vlib.exe failed 解决办法&#xff1a; 1.新建modelsim工程&#xff0c;并随意编译一个.v文件&#xff0c;将产生的work目录复制到modelsim安装路径下。 2.再将vscode设置verilog>linting>modelsim…

etcd技术解析:构建高可用分布式系统的利器

1. 引言 随着云原生技术的兴起&#xff0c;分布式系统的构建变得愈发重要。etcd作为一个高可用的分布式键值存储系统&#xff0c;在这个领域发挥着至关重要的作用。本文将深入探讨etcd的技术细节&#xff0c;以及如何利用它构建高可用的分布式系统。 2. etcd简介 etcd是一个开…

苗情监测站有什么作用?

苗情监测站是一种针对植物生长情况的监测设施&#xff0c;主要用于实时监测和分析植物生长环境中的各种因素&#xff0c;如温度、湿度、光照、土壤温湿度等&#xff0c;从而为农业生产提供科学的依据和技术支持。 具体来说&#xff0c;苗情监测站的作用包括以下几个方面&#…

EasyExcel实现导出图片到excel

pom依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.0</version> </dependency> 实体类&#xff1a; package com.aicut.monitor.vo;import com.aicut.monit…

京东云开发者DDD妙文欣赏(3-4)什么时候厨师是Actor

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 京东云开发者DDD妙文欣赏&#xff08;1-2&#xff09;报菜名和化繁为简的创新>> 图8 《餐厅》中的“用例图” &#xff08;01&#xff09; 原文 用例图 赏析 揉一揉眼睛仔细…

全新PHP短网址生成系统,短链接生成系统,URL缩短器系统源码

PHP短网址系统URL缩短器平台&#xff0c;它使您可以轻松地缩短链接&#xff0c;根据受众群体的位置或平台来定位受众&#xff0c;并为缩短的链接提供分析见解。 系统使用了Laravel框架编写&#xff0c;前后台双语言使用&#xff0c;可以设置多域名&#xff0c;还可以开设套餐等…

架构师之路(十六)计算机网络(传输层)

前置知识&#xff08;了解&#xff09;&#xff1a;计算机基础。 作为架构师&#xff0c;我们所设计的系统很少为单机系统&#xff0c;因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。 既然网络层已经…

Linux服务器配置与管理(第一次实验)

实验目的及具体要求 1.熟悉Ubuntu桌面环境和基本操作 2.熟悉命令语法格式 3.掌握Linux各类命令的使用方法 4.熟悉Linux操作环境 实验仪器、设备和材料 笔记本电脑 软件VMware Workstation 17 Player Ubuntu 64 位操作系统 实验内容、步骤及实验数据记录 &#xff08;一…

【医学图像隐私保护】联邦学习:密码学 + 机器学习 + 分布式 实现隐私计算,破解医学界数据孤岛的长期难题

联邦学习&#xff1a;密码学 机器学习 分布式 提出背景&#xff1a;数据不出本地&#xff0c;又能合力干大事联邦学习的问题 分布式机器学习&#xff1a;解决大数据量处理的问题横向联邦学习&#xff1a;解决跨多个数据源学习的问题纵向联邦学习&#xff1a;解决数据分散在多…