OpenCV4(C++)——模板匹配

news2024/10/5 2:09:25

matchTemplate

模板匹配和卷积运算大致相同,模板图类似于卷积核,从原图的左上角开始进行滑动窗口的操作,最后得到一个特征图,这个特征图里的数值就是每次计算得到的相似度,通用匹配方式,相似值是(0-1)之间。
(最简单的一个例子,用两张相同的图片传入模板匹配函数中,只会进行一次相似计算,最后得到的特征图数值为([1,])

  OpenCV中的模板匹配函数为matchTemplate,参数如下,其中的result就是得到的特征图,里面记录了每次匹配计算的相似度。

void cv::matchTemplate(InputArray image,
                       InputArray templ,
                       OutputArray result,
                       int  method, // 匹配方法:TM_SQDIFF、TM_CCORR、TM_CCOEFF等
                       InputArray mask = noArray()
                    )

  得到相似度特征图后,再找到其中最大的值(或自定义一个阈值)的坐标,根据模板图的宽高,就能找到在原图的所在位置。
下面是最大值的例子:

int main()
{
	cv::Mat image = cv::imread("C:/Users/Opencv/temp/yuan.png");
	cv::Mat matchImg = cv::imread("C:/Users/Opencv/temp/match.png");

	if (image.empty() || matchImg.empty()) {
		cout << "打开图片失败" << endl;
		return -1;
	}

	cv::Mat result;
	cv::matchTemplate(image, matchImg, result, cv::TM_CCOEFF_NORMED);

	double maxVal, minVal;
	cv::Point minLoc, maxLoc;
	//寻找匹配结果中的最大值和最小值以及坐标位置
	minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);
	// 绘制最佳匹配区域
	cv::rectangle(image, cv::Rect(maxLoc.x, maxLoc.y, matchImg.cols, matchImg.rows), cv::Scalar(0, 0, 255), 2);

	cv::imshow("原图", image);
	cv::imshow("模板图", matchImg);
	cv::imshow("结果图", result);
	cv::waitKey(0);
	cv::destroyAllWindows();

	return 0;
}

在这里插入图片描述
result图的数值为灰度值,最白的那个点就是匹配度最高的那个创建。再来看一下result里的数值
在这里插入图片描述

  使用最大值的操作,只能匹配到一个位置。而在实际应用中,往往遇到的场景是一副图片中存在多个相似目标需要被找到,可以要设定阈值来进行判定。

代码如下(示例):

int main()
{
	cv::Mat img0 = cv::imread("C:/Users/jutze/ljw_C++/Opencv/temp/on.png");
	cv::Mat img1 = img0.clone();
	//cv::Mat img1;
	//cv::flip(img, img1, 0);
	cv::Mat img2 = img0.clone();
	cv::Mat img3 = img0.clone();
	cv::Mat out1, out2, image;
	cv::hconcat(img0, img1, out1);
	cv::hconcat(img2, img3, out2);
	cv::vconcat(out1, out2, image);

	cv::Mat matchImg = cv::imread("C:/Users/jutze/ljw_C++/Opencv/temp/onmatch.png");

	if (image.empty() || matchImg.empty()) {
		cout << "打开图片失败" << endl;
		return -1;
	}

	cv::Mat result;
	cv::matchTemplate(image, matchImg, result, cv::TM_CCOEFF_NORMED);


	float threshold = 0.85;
	cv::Mat Loc;
	cv::findNonZero(result >= threshold, Loc);  // 寻找大于阈值的点

	for (int i = 0; i < Loc.total(); i++)
	{
		cv::Point pt = Loc.at<cv::Point>(i);
		cv::rectangle(image, pt, cv::Point(pt.x + matchImg.cols, pt.y + matchImg.rows), cv::Scalar(0, 0, 255), 1);
	}

	cv::imshow("原图", image);
	cv::imshow("模板图", matchImg);
	cv::imshow("结果图", result);

	cv::waitKey(0);
	cv::destroyAllWindows();

	return 0;
}

在这里插入图片描述
上面的图是作了一个拼接处理,但一般实际应用的图中,目标通常会存在一些旋转角度,尺寸大小不一致等问题,这些都会影响匹配结果,如下图所示。目前我自己所用到解决方式:一种是对原图进行旋转、缩放等相关处理。另一种是对模板图进行旋转、缩放等处理。都是通过多次匹配来进行,无疑会增加很大时间消耗,可能会有更好的办法吧,以后遇到再说。
在这里插入图片描述

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

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

相关文章

【博客搭建】1、拾壹博客本地启动遇到的问题和需要注意的坑

一、后端&#xff08;blog&#xff09;启动 1、修改application.yml中的数据库链接与密码&#xff0c;Redis账号密码&#xff0c;即可启动成功&#xff1b; 2、运行之前先导入sql&#xff1b; 3、 如需上传文件保存至本地&#xff08;例如相册的照片&#xff09;&#xff0c;需…

Verilog功能模块——异步FIFO

前言 FIFO的功能 FIFO在FPGA中应用很多&#xff0c;它主要有以下功能&#xff1a; 数据缓存&#xff0c;很多时候数据发送速度和数据接收速度并不实时匹配&#xff0c;而在其中插入一个FIFO&#xff0c;来临时存储数据&#xff0c;就能平衡发送和接收速度组合与分解数据&…

什么是系统架构师?什么是系统架构?

1. 什么是系统架构师&#xff1f; 系统架构设计师(System Architecture Designer&#xff09;是项目开发活动中的关键角色之一。系统架构是系统的一种整体的高层次的结构表示&#xff0c;是系统的骨架和根基&#xff0c;其决定了系统的健壮性和生命周期的长短。 系统架构设计…

允许访问:掌握权限的艺术

回到20世纪&#xff0c;网络攻击更难实施&#xff0c;因为大多数计算机没有联网&#xff0c;互联网并不普及&#xff0c;只有少数人群可以访问计算机&#xff0c;更重要的是&#xff0c;没有足够的动机来进行攻击。 访问控制政策 而今天&#xff0c;情况完全不同。在糟糕的数据…

【特纳斯电子】血氧饱和度监测仪设计-实物设计

视频及资料链接&#xff1a;血氧饱和度监测仪设计-实物设计 - 电子校园网 编号&#xff1a; T5662203M-SW 设计简介&#xff1a; 本设计是基于STM32的血氧饱和度监测仪系统&#xff0c;主要实现以下功能&#xff1a; 1. STM32单片机作为微处理器 2. MAX30102进行心率血氧检…

A股风格因子看板 (2023.10 第03期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格暴露等。 今日为该因子跟踪第03期&#xff0c;指数组合数据截止日2023-09-30&#xff0c;要点如下 近1年A股风格因子检验统…

【环境】ubuntu下anaconda虚拟环境中安装的pytorch终于配置成功了!

前请提要 配置情况&#xff1a;双系统——win10ubuntu20.04&#xff1b;anaconda安装与虚拟环境创建&#xff1a;在安装conda的过程中&#xff0c;我修改了安装路径&#xff08;很清楚的记得&#xff09;&#xff1b;昨晚的状态&#xff1a;通过pytorch中的conda命令&#xff…

Linux磁盘常见知识

目录 一、基础概念 1.1 文件系统类型 1.2 主分区、扩展分区、逻辑分区三者关系 1.3 UUID 1.4 lvm逻辑卷管理系统 二. 常用命令 2.1 查看命令 2.2 分区命令 2.3 格式化命令 1.4 挂载命令 三、扩容根目录 一、基础概念 1.1 文件系统类型 文件系统类型决定了向分区中存放、读取数…

再一次整理一下spring框架步骤

1.pom.xml依赖 2.applicationbean.xml 3.类 小树叶可以跟bean联动起来 不写接口直接写类 实现类 4.测试 两种方法的实现

第二证券:锂矿板块发力走高,江特电机涨停,中矿资源等拉升

锂矿板块12日盘中发力走高&#xff0c;到发稿&#xff0c;江特电机涨停&#xff0c;中矿资源、融捷股份涨超4%&#xff0c;天齐锂业、天华新能、永兴资料、赣锋锂业等涨逾3%。 音讯面上&#xff0c;江特电机“探转采”作业取得开展。 10月9日&#xff0c;国家天然资源部官网闪…

2023年中国鸡蛋市场供需现状、市场规模及产品价格走势分析[图]

鸡蛋具有高营养、易消化、用途广等特点&#xff0c;已成为世界公认的必备优质食材&#xff0c;它同肉品、乳品、蔬菜、粮食一样&#xff0c;是人们日常生活中的重要营养食品。鸡蛋的主要品种包括谷物蛋、绿色蛋、素养蛋、OMG营养蛋等。 蛋鸡是指专门产蛋以供应人们食用和加工蛋…

获央视报道 联通智网科技全面引领车联网发展

当前&#xff0c;我国正由交通大国阔步迈向交通强国&#xff0c;涌现出了一批交通行业的专精特新企业&#xff0c;带动了我国交通行业的蓬勃发展。联通智网科股份有限公司作为中国联通在车联网领域的专精特新企业&#xff0c;一直坚持融合创新并积极探索车联网和智慧交通相关领…

Unity基础课程之物理引擎8-扔保龄球游戏案例(完)

三个脚本&#xff1a; 1.给求添加力 2.分数管理器 3.检测是否发生碰撞 ----------------------------------------------- 脚本源码 1.给求添加力 using System.Collections; using System.Collections.Generic; using UnityEngine;public class RoleControl : MonoBeha…

通讯网关软件022——利用CommGate X2MQTT实现MQTT访问MSSQL服务器

本文介绍利用CommGate X2MQTT实现MQTT访问MS SQL数据库。CommGate X2MQTT是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现上位机通过MQTT来获取MS SQL数据库的数据。 【解决方案】设置网…

EDUSRC-记某擎未授权与sql注入

目录 360天擎 - 未授权与sql注入 信息收集 FOFA语法 鹰图搜索 360天擎未授权访问 - 数据库信息泄露 漏洞复现 修复方案 360天擎终端安全管理系统ccid处SQL注入 漏洞复现 手动测试方法 修复方案 360天擎 - 未授权与sql注入 通常访问的页面如下&#xff0c;存在登录框…

Vue2 router详解

vue2 router详解 一、前端路由的概念与原理1. 什么是路由2. SPA与前端路由3. 什么是前端路由4. 前端路由的工作方式5. 实现简易的前端路由 二、vue-router的基本用法1. 什么是 vue-router2. vue-router 安装和配置的步骤2.2 创建路由模块2.3 导入并挂载路由模块2.4 声明路由链接…

怎么把人声和BGM分开?只想要人声部分~

当我们在听一段人声和背景音混合在一起的视频时&#xff0c;会因为周围环境比较嘈杂就很难听清音频了&#xff0c;这时&#xff0c;我们可以利用音分轨人声分离软件来搞定&#xff0c;快速提取人声部分&#xff01; 第一步&#xff1a;打开【音分轨】APP&#xff0c;进入首页点…

Remix 开发小技巧

文章目录 请求搜索参数重定向进行服务器端分页从 URL 读取查询参数不要覆盖其他查询参数使用提交按钮而不是链接向按钮添加标签 Loaders & Actions 中中止异步调用全局类型及类型安全 请求搜索参数重定向 假设您要确保始终设置特定的搜索参数。为此&#xff0c;您可以首先…

MyBatis基础之结果集映射

基本概念 [!danger] 注意 配置结果集映射&#xff0c;只用看 SQL 执行结果&#xff0c;不看 SQL 语句&#xff01; 在前面的内容中&#xff0c;由于我们的 PO 类的属性名与数据库中表的列名是一致的&#xff0c;因此&#xff0c;在 Mapper.xml 配置文件中&#xff0c;Mybatis 省…

对paddleOCR中的字符识别模型转ONNX

对paddle OCR中的模型转换成ONNX。 转换代码&#xff1a; import os import sys import yaml import numpy as np import cv2 import argparse import paddle from paddle import nnfrom argparse import ArgumentParser, RawDescriptionHelpFormatter import paddle.distribu…