25 OpenCV模板匹配算法

文章目录

  • 介绍
  • 匹配算法介绍
  • matchTemplate 模板匹配算子
  • minMaxLoc 找出图像中的最大值最小值
  • 代码示例

介绍

模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。
所以模板匹配首先需要一个模板图像T(给定的子图像)
另外需要一个待检测的图像-源图像S
工作方法,在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。
在这里插入图片描述

匹配算法介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述其中 TM_SQDIFF 和 TM_SQDIFF_NORMED 方法的相似度值越小代表匹配程度越高,而其他方法则是相反,相似度值越大代表匹配程度越高。

matchTemplate 模板匹配算子

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)
)

minMaxLoc 找出图像中的最大值最小值

double cv::minMaxLoc(InputArray src, OutputArray minVal, OutputArray maxVal, OutputArray minLoc, OutputArray maxLoc, InputArray mask = noArray());
src:输入图像或矩阵,可以是单通道、多通道或彩色图像。
minVal:输出参数,指向一个double类型的指针,用于存储计算得到的最小值。
maxVal:输出参数,指向一个double类型的指针,用于存储计算得到的最大值。如果不提供此参数,则默认为0。
minLoc:输出参数,指向一个Point类型的指针,用于存储计算得到的最小值的位置。如果不提供此参数,则默认为0。
maxLoc:输出参数,指向一个Point类型的指针,用于存储计算得到的最大值的位置。如果不提供此参数,则默认为0。
mask:可选参数,输入图像或矩阵,用于指定感兴趣区域。只有位于mask内的像素才会被计算最小值和最大值。如果不提供此参数,则默认为noArray()

minMaxLoc 的用法以及场景

图像分割:在图像分割中,需要找到图像中的前景和背景,可以使用minMaxLoc函数来确定前景和背景的阈值。
目标检测:在目标检测中,需要找到目标的位置,可以使用minMaxLoc函数来确定目标的边界框。
特征提取:在特征提取中,需要找到图像中的特征点,可以使用minMaxLoc函数来确定特征点的位置

代码示例

#include <opencv2/opencv.hpp>
#include <iostream>

#include <math.h>
using namespace std;
using namespace cv;

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("D:/vcprojects/images/flower.png");
	temp = imread("D:/vcprojects/images/t2.png");
	if (src.empty() || temp.empty()) {
		printf("could not load image...\n");
		return -1;
	}

	// 创建窗口并显示图像
	namedWindow(INPUT_T);
	namedWindow(OUTPUT_T);
	namedWindow(match_t);
	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);

	// 进行模板匹配
	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;
	//其中 TM_SQDIFF 和 TM_SQDIFF_NORMED 方法的相似度值越小代表匹配程度越高,
	//而其他方法则是相反,相似度值越大代表匹配程度越高
	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);
}


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

必看!想入行嵌入式该准备些什么?

近日&#xff0c;很多人问华妹&#xff1a;想入行嵌入式该怎么准备。很能理解大家对于嵌入式的关注&#xff0c;嵌入式系统是当今科技领域中的重要组成部分&#xff0c;它存在于我们生活的方方面面&#xff0c;各行各业。智能化时代的到来也让嵌入式技术炙手可热&#xff01; …

高通平台初步

网上找的图&#xff0c;大体差不多&#xff0c;但是有些细节有点奇怪。 上面的图有点小怪&#xff0c;主要是Libraies&#xff0c;Framework&#xff0c;App&#xff0c;这部分感觉应该是Google的。其他的没啥问题。 大概整理一下编译流程吧。 首先是安装环境&#xff0c;一些…

如何对静态IP进行测试?静态IP有什么优点?

随着互联网的普及&#xff0c;越来越多的人开始使用动态IP进行上网。但是在某些情况下&#xff0c;我们可能需要使用静态IP进行测试或特定的网络设置。本文将介绍如何获取静态IP进行测试以及静态IP的优点。 一、如何获取静态IP进行测试&#xff1f; 1.联系ISP&#xff08;Int…

Controller中接收数组参数

1、场景 需要根据用户id集合批量删除用户数据&#xff0c;前端使用post请求&#xff0c;controller中参数接收数组参数并根据用户id删除用户基本信息 2、分析处理&#xff1a; 2.1、前端请求类型contentType:application/json 请求体中为json字符串&#xff0c;后端新建一个U…

力扣23. 合并 K 个升序链表(最小堆)

Problem: 23. 合并 K 个升序链表 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.创建虚拟头节点dummy并创建辅助指针p指向dummy&#xff1b; 2.创建最小堆minHeap将每个链表的头节点存入; 3.当minHeap不为空时每次让p指向从最小堆堆顶取出的节点node&#xff0…

【小沐学AI】Google AI大模型的一点点学习(Python)

文章目录 1、Google AI简介1.1 Google AI Studio1.2 Bard1.3 PaLM1.4 Gemini1.5 Gemini API1.6 Vertex AI1.7 Gemma 2、Google AI开发2.1 快速入门2.1.1 配置开发环境2.1.2 列出所有模型2.1.3 从文本输入生成文本2.1.4 从图像和文本输入生成文本2.1.5 聊天对话 结语 1、Google …

Covalent Network(CQT)与 Celo 集成,推动 Web3 下一代现实资产解决方案的发展

Covalent Network&#xff08;CQT&#xff09;是一个统一的区块链 API 提供商&#xff0c;其已正式与 Celo 集成&#xff0c;Celo 是一个以移动优先的 EVM 兼容链。这一重要的里程碑旨在提升 Celo 生态系统中开发者的能力&#xff0c;通过授予他们访问关键链上数据的权限&#…

踏“时间”与“空间”前来探寻复杂度的奥妙(Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

基于WTR096-28SS芯片方案的宠物喂食器实现智能化喂食功能

一、简介 本方案宠物喂食器采用了WTR096-28SS芯片方案来实现智能化的喂食功能。该方案结合了先进的技术和设计理念&#xff0c;提供了便捷、智能和个性化的宠物喂食解决方案。 该宠物喂食器具备定时、定量喂食功能&#xff0c;可以根据主人设定的时间和食物量&#xff0c;自动…

xercesc库保存XML功能实现

目录 一 参考链接 二 运行结果 三 代码 一 参考链接 DOM Programming Guide (apache.org) Xerces-c DOM XML文件的构造_xerces-c domimplementation-CSDN博客 Xerces-c库的使用-CSDN博客 二 运行结果 三 代码 #if 1//参考链接&#xff1a; https://blog.csdn.net/RGBMa…

HarmonyOS NEXT应用开发之SideBarContainer侧边栏淡入淡出动效实现案例

介绍 在2in1或平板上&#xff0c;群聊侧边栏是一种较为常用的功能&#xff0c;虽然HarmonyOS已经具备了基本的动效&#xff0c;但是部分情况下开发者可能有定制侧边栏动效的需求&#xff0c;本例主要介绍了如何基于显式动画实现侧边栏的淡入淡出动效。 效果图预览 使用说明&a…

【区间、栈】算法例题

目录 六、区间 48. 汇总区间 ① 49. 合并区间 ② 50. 插入区间 ② 51. 用最少数量的箭引爆气球 ② 七、栈 52. 有效的括号 ① 53. 简化路径 ② 54. 最小栈 ② 55. 逆波兰表达式求值 ② √- 56. 基本计算器 ③ 六、区间 48. 汇总区间 ① 给定一个 无重复元素 的 …

静态代理IP如何测试?

随着互联网的普及&#xff0c;越来越多的人开始使用动态IP进行上网。但是在某些情况下&#xff0c;我们可能需要使用静态IP进行测试或特定的网络设置。本文将介绍如何获取静态IP进行测试以及静态IP的优点。 一、如何获取静态IP进行测试&#xff1f; 1.联系ISP&#xff08;Int…

DM-达梦数据库实时主备搭建

dm实时主备说明 将主库产生的 Redo日志传输到备库&#xff0c;备库接收并重演Redo日志&#xff0c;从而实现备库与主库的数据同步。 一、环境准备 1.1、配置环境准备 首先搭建实时主备&#xff0c;要规划好机器的&#xff0c;我准备两台机器服务器 主服务器 mast…

7-5 表格输出

题目链接&#xff1a;7-5 表格输出 一. 题目 1. 题目 2. 输入输出格式 3. 限制 二、代码 实现一 1. 代码实现 #include <stdio.h>int main(void){printf("------------------------------------\n\ Province Area(km2) Pop.(10K)\n\ ------------------…

14|CAMEL:通过角色扮演脑暴一个鲜花营销方案

能否让 ChatGPT 自己生成这些引导文本呢&#xff1f; CAMEL 交流式代理框架 CAMEL 框架旨在通过角色扮演来促进交流代理之间的自主合作&#xff0c;并为其“认知”过程提供洞察。这种方法涉及使用启示式提示来指导聊天代理完成任务&#xff0c;同时保持与人类意图的一致性。…

【virtio-networking 和 vhost-net 简介】

文章目录 Virtio 基本构建块Virtio spec 和 vhost 协议Vhost-net/virtio-net architectureVirtio-networking and OVS总结参考链接 Virtio 是作为虚拟机 (VM)访问简化device&#xff08;如块设备和网络适配器&#xff09;的 标准化开放接口而开发的。Virtio-net是一种虚拟以太…

大众EA111发动机

大众EA111发动机_什么是大众EA111发动机_太平洋汽车百科 大众EA111发动机_什么是大众EA111发动机_太平洋汽车百科 大众的EA111系列发动机是大众公司小排量发动机的主力&#xff0c;有1.2L、1.4L、1.6L三种排量。大众的EA111系列发动机融合了缸内直喷、涡轮增压等先进技术&…

鸿蒙Harmony应用开发—ArkTS-转场动画(页面间转场)

当路由进行切换时&#xff0c;可以通过在pageTransition函数中自定义页面入场和页面退场的转场动效。详细指导请参考页面转场动画。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 为了实现更好的转场效…

稀碎从零算法笔记Day22-LeetCode:存在重复元素 II

题型&#xff1a;哈希表、数组 链接&#xff1a;219. 存在重复元素 II - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] …