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

目录

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;elsetemLoc = 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.rhkb.cn/news/245462.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gradle学习笔记:Gradle的简介、下载与安装

文章目录 一、什么是Gradle二、为什么选择Gradle三、下载并安装Gradle四、Gradle的bin目录添加到环境变量五、测试Gradle是否安装正常 一、什么是Gradle Gradle是一个开源构建自动化工具&#xff0c;专为大型项目设计。它基于DSL&#xff08;领域特定语言&#xff09;编写&…

SpringCloud(二)

Spring Cloud 文章目录 Spring Cloud任务三&#xff1a;Spring Cloud与微服务架构1.Spring Cloud课程内容介绍2.单体应用架构2.1 互联网应用架构演进2.2 单体应用架构 3.垂直应用架构4.SOA应用架构5.微服务应用架构介绍6.微服务架构核心思想及优缺点7.微服务架构的核心概念8.Sp…

如何使用Jellyfin+cpolar搭建私人影音平台实现无公网ip远程访问

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

3d gaussian splatting介绍整理

3D 高斯分布是用于实时辐射场渲染的 3D 高斯分布中描述的一种光栅化技术&#xff0c;它允许实时渲染从小图像样本中学习到的逼真场景。 paper github 本文翻译整理自&#xff1a; blog: Introduction to 3D Gaussian Splatting DDPMs - Part 2 给出一些2D图片&#xff0c;用…

[实战]加密传输数据解密

前言 下面将分享一些实际的渗透测试经验&#xff0c;帮助你应对在测试中遇到的数据包内容加密的情况。我们将以实战为主&#xff0c;技巧为辅&#xff0c;进入逆向的大门。 技巧 开局先讲一下技巧&#xff0c;掌握好了技巧&#xff0c;方便逆向的时候可以更加快速的找到关键…

【iOS ARKit】人脸检测追踪基础

在计算机人工智能&#xff08;Artificial Inteligence,AI&#xff09;物体检测识别领域&#xff0c;最先研究的是人脸检测识别&#xff0c;目前技术发展最成熟的也是人脸检测识别。人脸检测识别已经广泛应用于安防、机场、车站、闸机、人流控制、安全支付等众多社会领域&#x…

Linux 一键部署grafana

grafana 前言 Grafana 是一款开源的数据可视化和监控仪表盘工具。它提供了丰富的数据查询、可视化和报警功能,可用于实时监控、数据分析和故障排除等领域。 通过 Grafana,您可以连接到各种不同的数据源,包括时序数据库(如 Prometheus、InfluxDB)和关系型数据库(如 MySQ…

UE创建数据资产 UDataAsset

UE创建数据资产 需要一个继承自UDataAsset的子类 在编辑器里创建后的效果 如果在子类中写多个集合 和 其它数据 所以数据资产在我觉得只是该子类的一个实例对象

C#用DateAndTime.DateDiff方法和TimeSpan分别计算时间间隔

目录 一、计算时间间隔的方法 1.用DateAndTime.DateDiff方法计算时间间隔 2.使用TimeSpan获取日期时间间隔 二、实例 1.示例一&#xff1a;用DateAndTime.DateDiff方法计算时间间隔 2.示例二&#xff1a;使用TimeSpan获取日期时间间隔 一、计算时间间隔的方法 1.用Date…

jar手动上传到Nexus私服

jar手动上传到Nexus私服 一简介二上传方法1.登录nexus,打开nexus控制台。upload---maven-release2.上传jar3.验证jar包是否上传成功4、注意事项 一简介 在maven项目中我们可以通过相关配置可以将项目打包成jar&#xff0c;然后deploy上传到私服中。要是别人提供的第三方jar&am…

图像处理------调整色调

什么是色调&#xff1f; 色调&#xff0c;在画面上表现思想、感情所使用的色彩和色彩的浓淡。分为暖色调和冷色调。 from cv2 import destroyAllWindows, imread, imshow, waitKey#创建棕褐色色调 def make_sepia(img, factor: int):pixel_h, pixel_v img.shape[0], img.shap…

【GitHub项目推荐--DiligentEngine: 一个开源跨平台的底层图形库和渲染框架】【转载】

Diligent Engine 一个现代的Cross-PlatformLow-Level三维图形库 Diligent引擎是一个轻量级的cross-platform图形API抽象库和呈现框架。它的设计充分利用了Direct3D12、Vulkan和Metal&#xff0c;同时通过Direct3D11、OpenGL和OpenGLES支持较旧的平台。Diligent引擎公开公共的f…

EtherNet/IP开发:C++开发CIP源代码

① 介绍一下CIP CIP是一种考虑到自动化行业而设计的通用协议。然而&#xff0c;由于其开放性&#xff0c;它可以并且已经应用于更多的领域。CIP网络库包含若干卷&#xff1a; 第1卷介绍了适用于所有网络自适应的CIP的常见方面。本卷包含通用对象库和设备配置文件库&#xff0…

数据采集与预处理01: 项目1 数据采集与预处理准备

数据采集与预处理01&#xff1a; 项目1 数据采集与预处理准备 任务1 认识数据采集技术&#xff0c;熟悉数据采集平台 数据采集&#xff1a;足够的数据量是企业大数据战略建设的基础&#xff0c;因此数据采集成为大数据分析的前站。数据采集是大数据价值挖掘中重要的一环&#…

OpenCV书签 #互信息的原理与相似图片搜索实验

1. 介绍 互信息&#xff08;Mutual Information&#xff09; 是信息论中的一个概念&#xff0c;用于衡量两个随机变量之间的关联程度。在图像处理和计算机视觉中&#xff0c;互信息常被用来度量两幅图像之间的相似性。 互信息可以看成是一个随机变量中包含的关于另一个随机变…

FastDeploy项目简介,使用其进行(图像分类、目标检测、语义分割、文本检测|orc部署)

FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具&#xff0c; 支持云边端部署。提供超过 &#x1f525;160 Text&#xff0c;Vision&#xff0c; Speech和跨模态模型&#x1f4e6;开箱即用的部署体验&#xff0c;并实现&#x1f51a;端到端的推理性能优化。包括 物…

win10+elasticsearch8.12 安装教程

Elasticsearch是一种搜索引擎&#xff0c;本地安装完成之后&#xff0c;可使用其他编程语言&#xff08;例如python&#xff09;与elasticsearch建立连接&#xff0c;然后使用python脚本搜索elasticsearch中的数据 1下载 elasticsearch elasticsearch最新版官网下载链接 点击…

如何降低微服务复杂度丨云栖大会微服务主题分享实录

作者&#xff1a;谢吉宝 本文整理自阿里云资深技术专家、中间件负责人谢吉宝在2023云栖大会《极简微服务模式&#xff0c;降低微服务复杂度的最佳实践》的分享 2023 云栖大会现场 当面临复杂的挑战时&#xff0c;"分而治之"的方法往往能取得显著的效果。微服务架构…

HCIA——25FTP 的工作原理、功能、TFTP、控制连接、数据连接的选择、解答

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

使用 Redis 的 List 数据结构实现分页查询的思路

假设有一个存储数据的 List&#xff0c;每个元素代表一个记录&#xff0c;例如 recordsList。 按页存储数据&#xff1a; 每页存储一定数量的记录。例如&#xff0c;第一页存储索引 0 到 N-1 的记录&#xff0c;第二页存储索引 N 到 2N-1 的记录&#xff0c;以此类推。 分页查…