Opencv模板匹配
使用OpenCV和C++来识别彩色图片中的特定物体,如黑桃♠,通常涉及几个步骤:预处理图像、特征提取、对象检测等。下面是一个基本的示例代码,演示如何使用OpenCV的模板匹配方法来识别图片中的黑桃♠。
函数原型
void matchTemplate(InputArray image, InputArray temp, OutputArray result, int method);void matchTemplate(InputArray image, // 输入的大图像InputArray templ, // 输入的模板图像OutputArray result, // 输出的匹配结果矩阵int method // 匹配方法
);参数说明:
image: 输入的大图像,它可以是灰度图像或者是彩色图像。
templ: 模板图像,它通常是较小的图像,我们希望在大图像中寻找这个模板的位置。
result: 匹配结果矩阵,输出的是一个二维矩阵,它的大小取决于输入图像和模板的大小,以及所选择的匹配方法。每个元素代表了相应位置的匹配程度。
method: 匹配的方法,有多种可选的方法,包括但不限于:
CV_TM_SQDIFF: 平方差匹配法
CV_TM_SQDIFF_NORMED: 归一化的平方差匹配法
CV_TM_CCORR: 互相关匹配法
CV_TM_CCORR_NORMED: 归一化的互相关匹配法
CV_TM_CCOEFF: 交叉系数匹配法
CV_TM_CCOEFF_NORMED: 归一化的交叉系数匹配法函数作用:
这个函数通过遍历输入图像中的每一个可能的位置,将模板图像与该位置上的图像区域进行比较,计算出一个相似度值。最终,所有的相似度值会被存储在一个矩阵中,这个矩阵就是 result 参数。在不同的匹配方法下,这个矩阵的值有不同的意义。
例如,对于归一化的交叉系数匹配法 (CV_TM_CCOEFF_NORMED),匹配得分接近于 1 表示非常好的匹配;而对于平方差匹配法 (CV_TM_SQDIFF),得分接近于 0 表示很好的匹配。使用示例: 如果你想找到一个模板图像在另一张大图像中的位置,你可以使用 matchTemplate 函数并随后分析 result 矩阵来确定最佳匹配位置。对于某些匹配方法,你需要找到矩阵中的最大值;而对于其他方法,则需要找到最小值。
void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray());
void minMaxLoc(const SparseMat& src, double* minVal, double* maxVal, int* minIdx=0, int* maxIdx=0);
minMaxLoc 是 OpenCV 库中的一个函数,用于查找数组中的全局最小值和最大值,同时也可以找出这些值的位置。此函数适用于多种类型的数组,包括稠密数组和稀疏数组。对于稠密数组(如 Mat 或 Umat):
void minMaxLoc(InputArray src, // 输入数组double* minVal, // 输出指针,指向最小值double* maxVal = 0, // 输出指针,指向最大值(可选)Point* minLoc = 0, // 输出指针,指向最小值的位置(可选)Point* maxLoc = 0, // 输出指针,指向最大值的位置(可选)InputArray mask = noArray() // 可选的掩码数组,用于指定要处理的像素子集
);对于稀疏数组(如 SparseMat):
void minMaxLoc(const SparseMat& src, // 输入稀疏数组double* minVal, // 输出指针,指向最小值double* maxVal, // 输出指针,指向最大值int* minIdx = 0, // 输出指针,指向最小值的索引(可选)int* maxIdx = 0 // 输出指针,指向最大值的索引(可选)
);参数说明:
src: 输入的数组,可以是多通道的数组。如果是多通道的数组,函数会分别在每个通道上查找最小值和最大值。
minVal: 输出指针,指向最小值。如果不需要这个值,可以传入 nullptr。
maxVal: 输出指针,指向最大值。如果不需要这个值,可以传入 nullptr。
minLoc: 输出指针,指向最小值的位置。对于多通道数组,返回的是通道索引和像素坐标。如果不需要这个位置信息,可以传入 nullptr。
maxLoc: 输出指针,指向最大值的位置。对于多通道数组,返回的是通道索引和像素坐标。如果不需要这个位置信息,可以传入 nullptr。
mask: 可选的掩码数组,用于指定要处理的像素子集。掩码数组应该是单通道的 8 位无符号整型数组。非零值表示对应的像素应该被处理,零值则表示对应的像素被忽略。
rectangle 函数是 OpenCV 库中的一个函数,用于在图像上绘制矩形。这个函数有两种重载形式,一种接受两个顶点来定义矩形的对角线,另一种接受一个 Rect 对象来定义矩形。下面是这两个函数的中文含义及参数说明:void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0);
void rectangle(Mat& img, Rect r, const Scalar& color, int thickness=1, int lineType=8, int shift=0);对于使用两个顶点定义矩形的情况:
void rectangle(Mat& img, // 要绘制矩形的图像Point pt1, // 矩形左上角的点Point pt2, // 矩形右下角的点const Scalar& color, // 矩形的颜色int thickness = 1, // 线条的厚度,如果为负值,则填充矩形int lineType = 8, // 线条类型,通常为 8 表示 8 连续性int shift = 0 // 坐标轴的位移量
);
对于使用 Rect 定义矩形的情况:
void rectangle(Mat& img, // 要绘制矩形的图像Rect r, // 矩形区域const Scalar& color, // 矩形的颜色int thickness = 1, // 线条的厚度,如果为负值,则填充矩形int lineType = 8, // 线条类型,通常为 8 表示 8 连续性int shift = 0 // 坐标轴的位移量
);参数说明:
img: 输入/输出图像,矩形将在其上绘制。
pt1: 矩形左上角的坐标。
pt2: 矩形右下角的坐标。
r: 代表矩形的 Rect 对象。
color: 矩形的颜色,由 Scalar 类型定义。例如 Scalar(0, 0, 255) 表示红色。
thickness: 线条的厚度,单位为像素。默认值为 1。如果设置为负数,例如 -1,则矩形会被填充。
lineType: 线条类型,默认为 8,意味着使用 8 邻域的抗锯齿线条。其他可能的值有 LINE_4, LINE_8, LINE_AA。
shift: 坐标轴的位移量。通常情况下,设置为 0 即可。

//minMaxLoc 函数举例#include <opencv2/opencv.hpp>
#include <iostream>int main()
{cv::Mat image = cv::imread("10.jpg", cv::IMREAD_GRAYSCALE);if (image.empty()){std::cout << "Could not open or find the image" << std::endl;return -1;}double minVal, maxVal;cv::Point minLoc, maxLoc;cv::minMaxLoc(image, &minVal, &maxVal, &minLoc, &maxLoc);std::cout << "Minimum value: " << minVal << " at (" << minLoc.x << ", " << minLoc.y << ")" << std::endl;std::cout << "Maximum value: " << maxVal << " at (" << maxLoc.x << ", " << maxLoc.y << ")" << std::endl;system("pause");return 0;
}
原图

截取模板

代码
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>using namespace std;
using namespace cv;int main()
{Mat srcImage = imread("10.jpg", IMREAD_COLOR);//读取源图像Mat templateImage = imread("10_0.jpg", IMREAD_COLOR);//读模板图像if (srcImage.empty() || templateImage.empty()){cout << "读入的图片有空资源!" << endl;}//转化为灰度图、以减少计算复杂度Mat graySrc, grayTemplate;cvtColor(srcImage, graySrc, COLOR_BGR2GRAY);cvtColor(templateImage, grayTemplate, COLOR_BGR2GRAY);//执行模板匹配Mat result;matchTemplate(graySrc, grayTemplate, result, TM_CCOEFF_NORMED);//设定阈值,找到匹配位置double minVal, maxVal;Point minLoc, maxLoc;minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);//如果匹配得分足够高,则在原图上标出匹配区域int width = templateImage.cols;int height = templateImage.rows;if (maxVal > 0.8)//设置一个阈值,根据实际情况调整{rectangle(srcImage, maxLoc, Point(maxLoc.x + width, maxLoc.y + height), Scalar(0, 0, 255), 2);}//显示结果imshow("源图像", srcImage);imshow("模板图像", templateImage);waitKey(0);return 0;
}
运行结果

相关文章:
Opencv模板匹配
使用OpenCV和C来识别彩色图片中的特定物体,如黑桃♠,通常涉及几个步骤:预处理图像、特征提取、对象检测等。下面是一个基本的示例代码,演示如何使用OpenCV的模板匹配方法来识别图片中的黑桃♠。 函数原型 void matchTemplate(Inp…...
JavaScript DOM事件监听器:深入解析与实践应用
引言 在JavaScript中,DOM(文档对象模型)事件监听器是与用户交互的核心机制之一。它们允许开发者响应用户的行为,如点击、滚动、输入等,从而创建动态和交互式的网页。本文将深入探讨DOM事件监听器的工作原理、类型以及…...
iOS的App启动详细过程(底层知识)
1.虚拟内存 & ASLR 在早期计算机中数据是直接通过物理地址访问的,这就造成了下面两个问题 1.内存不够用 2.数据安全问题 内存不够 ---> 虚拟内存 虚拟内存就是通过创建一张物理地址和虚拟地址的映射表来管理内存,提高了CPU利用率,…...
【轨物推荐】创新者的钥匙:如何破解创新的最大难题
原创 混沌学园 混沌学园 2021年12月27日 19:55 本文重点在于,将纷繁复杂现象中,针对创新的灵魂问题“不创新是等死,创新是找死”,给出本质上的解读、解析和解答。将创新在保守和发散的两难选择中,下探本质找到那个价值…...
SpringCloud的能源管理系统-能源管理平台源码
介绍 基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码 软件架构...
Mybatis获取主键自增的方法
原本的方法 使用原本的JDBC去获取主键自增的方法如下图所示: 在这段代码中,通过连接对象 conn 的 prepareStatement 方法创建了一个PreparedStatement对象,并将SQL语句和 RETURN_GENERATED_KEYS 常量作为参数传递给该方法。这意味着执行SQL…...
strip 、objdump、objcopy 差异与区别
strip 、objdump、objcopy 差异与区别 strip 命令用于从已编译的可执行文件或目标文件中移除调试信息和其他非必要数据。这可以减小文件的大小,并且有助于保护源代码不被轻易反编译。通常,在发布软件时会使用 strip 命令来减少二进制文件的体积 objdump…...
本地phpstudy部署算命系统,用户端是H5页面,支持微信支付宝支付,支持微信支付宝登录
算命系统本地部署教程 0. 技术架构1. 启动Apache、MySQL服务2. 创建前台和后台两个网站3. Navicat连接数据库4. 登录后台是长这个样子5. 登录前台登录样子6. 代码结构是 0. 技术架构 前端:HTMLCSSJquery 后端:PHP 数据库:MySQL 1. 启动Ap…...
APP上架苹果App Store被拒原因及解决方案
苹果官方商店的审核大致分为三部分:预审、机审和人工审核,审核流程包括:初步提交、审核队列、审核过程、结果通知等步骤。#iOS App Store审核是非常严格的,很多很多APP,并不是能够一次上架成功,大部分APP都…...
docker-compose的下载
方式一:使用二进制文件安装。 GitHub官方下载安装(推荐,速度慢但不会出错) 1.GitHub官方下载(测试,已成功) curl -SL https://github.com/docker/compose/releases/download/v2.29.1/docker-c…...
h3c虚拟园区网概述
虚拟园区网概述 H3C虚拟园区网的解决方案 企业园区网作为企业网络的核心部分,连接了企业总部的办公、生产、研发、财务等多种重要的机 构。在网络建设中占有重要的地位。园区网内部终端种类众多,接入用户数量庞大,对网络的性能、可 靠性、可管理性都有较高的要求…...
云原生和安装Ubuntu 22系统
一.云原生简介 2004年开始,Google已在内部大规模地使用容器技术。 2008年,Google将 Cgroups合并进入了Linux内核。2013年,Docker项目正式发布。2014年,Kubernetes项目正式发布。2015年,由Google、Redhat 以及微软等大…...
HTTP代理IP如何助力旅游大数据领域?怎么建立安全的代理隧道连接?
在旅游行业,数据的准确性和实时性至关重要。随着大数据分析的兴起,HTTP代理IP成为了这一领域中不可或缺的工具。本文将探讨HTTP代理IP如何帮助旅游大数据领域,并介绍如何建立安全的代理隧道连接。 1. HTTP代理IP在旅游大数据领域的应用 1.1…...
AIGC从入门到实战:基础理论【核心算法与模型】
历史导读: 三、AIGC从入门到实战:基础理论【模型微调】 二、AIGC从入门到实战:AIGC基础理论 一、AIGC从入门到实战:为什么要了解AIGC 核心算法与模型 在人工智能生成内容(AIGC)领域,技术的飞速进步催生了一系列高效且创新的生成模型&…...
极狐GitLab 17.2发布了哪些 JH-Only 的功能?
极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…...
css中的高度塌陷
CSS高度塌陷(或称为高度坍塌)是指在某些特定情况下,元素的高度无法被正确计算或显示的现象。这通常发生在具有浮动属性的元素或使用绝对定位的元素周围。 原因 高度塌陷通常发生在父元素包含着一个或多个浮动元素时。由于浮动元素被移出了正…...
怎样使用sudo的时候不需要输入密码?
在Ubuntu等Linux系统下,经常要在个人账户使用sudo命令来执行一些需要root权限的命令,但是需要输入该账户的密码,有时候显得很繁琐, 那么怎样使用sudo的时候不需要输入密码呢? 有如下两种方法: 常规方法1…...
kettle的Javascript组件获取T-1天和T+1天
// 获取T-1的时间 var currentDate new Date(); currentDate.setDate(currentDate.getDate() - 1); var currentYear currentDate.getFullYear(); var currentMonth (0 (currentDate.getMonth() 1)).slice(-2); var currentDay (0 currentDate.getDate()).slice(-2); va…...
YoloV8改进策略:Block改进|LeYOLO,一种用于目标检测的新型可扩展且高效的CNN架构|复现LeYolo,轻量级Yolo改进
摘要 LeYOLO是在YOLO系列,特别是可能受到YOLOv8启发的基础上进行的一系列改进,旨在提升目标检测模型的高效性、可扩展性和精度。其主要特点包括: 高效骨干网络缩放方法: LeYOLO借鉴了倒置瓶颈(Inverted Bottleneck&am…...
ODX(Open Diagnostic Data Exchange)简介
ODX(Open Diagnostic Data Exchange)是一种由ASAM制定的开放标准,用于描述和交换ECU(电子控制单元)诊断数据,广泛应用于车辆诊断。ODX文件采用XML格式,包含通讯参数,如ISO15765-2/3时间参数。 ASAM(Association for Standardisation of Automation and Measuring Syst…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
