c++视觉处理----图像模板匹配

news2024/11/28 1:52:48

模板匹配matchTemplate()

matchTemplate() 是OpenCV中用于模板匹配的函数之一。它的主要作用是在一幅图像中搜索模板图像的位置,即找到模板在图像中的匹配位置。

函数原型如下:

void cv::matchTemplate(
    InputArray image,
    InputArray templ,
    OutputArray result,
    int method
);

其中:

  • image 是源图像,你要在这幅图像中搜索模板。
  • templ 是模板图像,你要搜索的目标。
  • result 是输出参数,用于存储匹配结果。
  • method 是匹配方法,指定匹配时要使用的算法,可以是以下之一:
    • TM_SQDIFF: 平方差匹配,最匹配的位置是结果最小的位置。
    • TM_SQDIFF_NORMED: 标准化平方差匹配,最匹配的位置是结果最小的位置。
    • TM_CCORR: 相关性匹配,最匹配的位置是结果最大的位置。
    • TM_CCORR_NORMED: 标准化相关性匹配,最匹配的位置是结果最大的位置。
    • TM_CCOEFF: 系数匹配,最匹配的位置是结果最大的位置。
    • TM_CCOEFF_NORMED: 标准化系数匹配,最匹配的位置是结果最大的位置。

使用 matchTemplate() 后,result 图像中会包含匹配结果。你可以通过在 result 图像中找到最小(TM_SQDIFFTM_SQDIFF_NORMED)或最大(其他方法)的值的位置来定位匹配的区域。

这个函数对于目标检测、物体跟踪和模式识别等应用非常有用。

图像模板匹配

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;

// 定义窗口标题
#define WINDOW_NAME1 "Original Image"
#define WINDOW_NAME2 "Matching Result"

// 全局变量
Mat g_srcImage;
Mat g_templateImage;
Mat g_resultImage;
int g_nMatchMethod;
int g_nMaxTrackbarNum = 5;

// 回调函数声明
void onMatching(int, void*);

int main()
{
	// 载入原始图像和模板图像
	g_srcImage = imread("1.jpg");
	g_templateImage = imread("1112.jpg");

	// 创建窗口
	namedWindow(WINDOW_NAME1, CV_WINDOW_AUTOSIZE);
	namedWindow(WINDOW_NAME2, CV_WINDOW_AUTOSIZE);

	// 创建滑动条并进行一次初始化
	createTrackbar("Method", WINDOW_NAME1, &g_nMatchMethod, g_nMaxTrackbarNum, onMatching);
	onMatching(0, 0);

	waitKey(0);

	return 0;
}

void onMatching(int, void*)
{
	// 给局部变量初始化
	Mat srcImage;
	g_srcImage.copyTo(srcImage);

	// 初始化结果输出矩阵
	int resultImageCols = g_srcImage.cols - g_templateImage.cols + 1;
	int resultImageRows = g_srcImage.rows - g_templateImage.rows + 1;
	g_resultImage.create(resultImageRows, resultImageCols, CV_32FC1);

	// 执行模板匹配
	matchTemplate(g_srcImage, g_templateImage, g_resultImage, g_nMatchMethod);
	normalize(g_resultImage, g_resultImage, 0, 1, NORM_MINMAX, -1, Mat());

	// 定位最佳匹配位置
	double minValue, maxValue;
	Point minLocation, maxLocation, matchLocation;

	minMaxLoc(g_resultImage, &minValue, &maxValue, &minLocation, &maxLocation, Mat());

	// 根据不同的匹配方法,计算匹配位置
	if (g_nMatchMethod == TM_SQDIFF || g_nMatchMethod == TM_SQDIFF_NORMED)
	{
		matchLocation = minLocation;
	}
	else
	{
		matchLocation = maxLocation;
	}

	// 在原始图像上绘制匹配位置的矩形
	rectangle(srcImage, matchLocation, Point(matchLocation.x + g_templateImage.cols, matchLocation.y + g_templateImage.rows), Scalar(0, 0, 255), 2, 8, 0);

	// 在结果图像上绘制匹配位置的矩形
	rectangle(g_resultImage, matchLocation, Point(matchLocation.x + g_templateImage.cols, matchLocation.y + g_templateImage.rows), Scalar(0, 0, 255), 2, 8, 0);

	// 显示图像
	imshow(WINDOW_NAME1, srcImage);
	imshow(WINDOW_NAME2, g_resultImage);
}

在这里插入图片描述

调用本地相机进行模版匹配

#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main()
{
	VideoCapture cap(0); // 打开默认相机,0代表第一个摄像头
	if (!cap.isOpened())
	{
		std::cout << "Could not open the camera!" << std::endl;
		return -1;
	}

	Mat templateImage = imread("122.jpg", IMREAD_COLOR); // 读取要匹配的模板图像
	if (templateImage.empty())
	{
		std::cout << "Could not open or find the template image!" << std::endl;
		return -1;
	}

	int templateWidth = templateImage.cols;
	int templateHeight = templateImage.rows;

	while (true)
	{
		Mat frame;
		cap >> frame; // 从摄像头捕获一帧

		Mat result;
		matchTemplate(frame, templateImage, result, TM_CCOEFF_NORMED);

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

		Point matchLoc = maxLoc;

		rectangle(frame, matchLoc, Point(matchLoc.x + templateWidth, matchLoc.y + templateHeight), Scalar(0, 0, 255), 2);

		imshow("Camera", frame);

		char key = waitKey(30);
		if (key == 27) // 按ESC键退出
			break;
	}

	cap.release();
	destroyAllWindows();

	return 0;
}

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

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

相关文章

生物信息学研究方向

一、生信的两个大类研究方向&#xff1a; 目录 一、生信的两个大类研究方向&#xff1a; 前者偏理论&#xff0c;后者偏向证明 第一类研究方向&#xff1a; 第二类研究方向&#xff1a; 二、具体的研究方向 1、序列分析 2、计算进化生物学 3、生物多样性的度量 4、蛋…

云原生与服务网格

云原生与服务网格 目录 文章来源 【优点知识】 istio课程大纲&#xff1a; https://youdianzhishi.com/web/course/1047 1、云原生技术范畴解读 什么是云原生 2大架构特征&#xff1a;不可变基础设施&#xff0c;声明式API CNCF 云原生整体视图 provisioning 供应 compli…

摩尔信使MThings数据配置参数详述

摩尔信使MThings支持丰富的数据配置方法&#xff0c;以适配一定程度的非标Modbus场景。 针对标准Modbus数据协议&#xff0c;用户仅需修改少量的配置&#xff0c;如寄存器地址、数量&#xff0c;其他参数默认即可。 同时为了便于用户全面了解配置参数&#xff0c;文中详述了每…

我献出这篇 go 精华总结,阁下该如何应对

文章目录 1.初识包管理2.输出3.注释4.初识数据类型5.变量5.1 声明变量的意义&#xff1f;5.2 变量名要求5.3 变量简写5.4 作用域5.5 赋值及内存相关注意事项 阶段练习题6.常量6.1 因式分解6.2 全局6.3 iota 7.输入8.条件语句8.1 最基本8.2 多条件判断8.3 嵌套 9. 荐书 《Go编程…

什么是Token?一文带你深入理解Token

Token在各种技术领域和应用场景中都扮演着重要的角色&#xff0c;它的含义和用途也是非常广泛的。下面我将从不同角度对Token进行深入解析&#xff0c;带你全面了解Token的含义、用途和重要性。 一、计算机科学和网络安全 在计算机科学和网络安全领域&#xff0c;Token通常指的…

400电话-申请400电话-400电话如何申请-400电话申请指南:简单步骤助您顺利获得400电话

引言&#xff1a; 随着企业竞争日益激烈&#xff0c;提供优质客户服务和建立品牌形象变得至关重要。而拥有一个易记且专业的400电话&#xff0c;不仅能提升企业形象&#xff0c;还能为客户提供便利与信任。本文将为您介绍如何申请400电话&#xff0c;帮助您顺利获得专属电话号码…

双因子认证是什么? 安当加密

双因素认证常见类型 知识证据&#xff1a; 这包括密码、问题和答案等。这种类型的证据通常容易被忘记或被猜测出来&#xff0c;因此&#xff0c;它们常常需要额外的安全措施&#xff0c;例如在密码丢失时重置。物理证据&#xff1a; 这包括指纹、面部、声音和手部特征等。这种…

【绝地求生】轻松提升战斗力,分享顶级吃鸡干货!

大家好&#xff01;作为一名热爱绝地求生的玩家&#xff0c;您是否想要提高自己的游戏战斗力&#xff0c;分享顶级的吃鸡干货呢&#xff1f;在本文中&#xff0c;我将带领大家探索如何通过一些实用工具和技巧来实现这些目标。 首先&#xff0c;让我们来了解绝地求生作图工具推荐…

-带你看懂11种API类型及应用-

一起走进多样的API&#xff0c;多样的精彩 随着互联网行业的日益发展&#xff0c;API(Application Programming Interface)这个名词对于绝大多数来说都已不再陌生。然而&#xff0c;实际上&#xff0c;根据不同标准可以划分出不同类型的API。今天&#xff0c;让我们来走…

因为不写注释引发的惨案

程序员对代码注释可以说是又爱又恨又双标……你是怎么看待程序员不写注释这一事件的呢&#xff1f; 一、一个关于注释的故事 2022年吧&#xff0c;我在写代码的时候&#xff0c;因为太懒惰了&#xff0c;没有写注释。结果&#xff0c;过了几个月我再来看的时候&#xff0c;完…

从零开始学习 Java:简单易懂的入门指南之线程池(三十六)

线程池 1.1 线程状态介绍1.2 线程池-基本原理1.3 线程池-Executors默认线程池1.4 线程池-Executors创建指定上限的线程池1.5 线程池-ThreadPoolExecutor1.6 线程池-参数详解1.7 线程池-非默认任务拒绝策略 1.1 线程状态介绍 当线程被创建并启动以后&#xff0c;它既不是一启动…

WLAN 无线案例(华为AC控制器配置模板)

实验说明&#xff1a; 无线用户VLAN 30 192.168.30.0/24 AP和AC用VLAN 20 192.168.20.0/24 有线网段 VLAN 10 192.168.10.0/24 步骤一&#xff1a;全网互通 sw1&#xff1a; sysname sw1 # vlan batch 10 20 30 # dhcp enable # ip pool 20 gateway-list 192.168.20.1…

【RocketMQ 系列三】RocketMQ集群搭建(2m-2s-sync)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

Python 脚本中的 FFmpeg

FFmpeg 是快进运动图像专家组的缩写。 它是一个开源项目&#xff0c;提供了ffmpeg、ffplay、ffprobe等工具来处理多媒体文件。 FFmpeg 是一个命令行实用程序&#xff0c;可帮助转换视频/音频格式、压缩视频、从视频中提取音频、创建 GIF、剪切视频等。 本篇文章将介绍在Pytho…

数据库中了mkp勒索病毒,mkp勒索病毒解密,数据恢复

最近一段时间网络上的mkp勒索病毒比较猖獗&#xff0c;给企业的服务器数据库带来了严重影响。通过这一波的mkp勒索病毒攻击&#xff0c;云天数据恢复中心的工程师发现&#xff0c;大部分被攻击的企业&#xff0c;主要是因为网络安全意识不高&#xff0c;服务器安全防护没有做到…

基于STM32的森林火灾监控系统设计

一、设计简述 基于STM32设计的森林火灾监控系统(OneNet) 1.1 项目背景 近年来,随着全球气候变暖和人类活动的不断增加,森林火灾成为全球性的重大灾害之一。据统计,每年全球因森林火灾造成的经济损失高达数十亿美元,严重威胁着生态环境和人民生命财产安全。如何及时预警和响…

2023 年 42 周

2023 年 42 周 说句题外话&#xff0c;上次写这玩意儿居然都是两年前的事情了……这次换个方式计算&#xff0c;直接用周数来 学习 &#x1f4d1; 进度 本周其实进度有那么点乱&#xff0c;学了一些 JPA/Hibernate 的内容&#xff0c;LC 刷题进度也拖慢了一些&#xff0c;基本…

会声会影2023中文旗舰版crack 2023注册机百度网盘下载

会声会影2023中文旗舰版功能非常强大的视频编辑软件&#xff0c;非常专业的使用效果&#xff0c;会声会影2023中文版可以针对剪辑电影进行使用&#xff0c;非常强大的色彩校正方式&#xff0c;无论什么光线下进行拍摄&#xff0c;都可以通过后期进行调整&#xff0c;并且里面超…

论文速递 | 8月下旬9月上旬Operations ResearchManagement Science文章精选

编者按 本期我们选取了8月下旬及9月上旬Operations Research文章2篇&#xff0c;Management Science文章4篇期刊文章&#xff0c;着眼于各种不同场景下对于风险的预测、量化及管理&#xff0c;通过聚焦于风险这一主题&#xff0c;体系化地形成文章精选。 文章1 Computation of…

【云计算网络安全】DDoS 攻击类型:什么是 ACK 洪水 DDoS 攻击

文章目录 一、什么是 ACK 洪水 DDoS 攻击&#xff1f;二、什么是数据包&#xff1f;三、什么是 ACK 数据包&#xff1f;四、ACK 洪水攻击如何工作&#xff1f;五、SYN ACK 洪水攻击如何工作&#xff1f;六、文末送书《AWD特训营》内容简介读者对象 一、什么是 ACK 洪水 DDoS 攻…