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;
}

运行结果

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

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

相关文章

【Mac】植物大战僵尸杂交版 for Mac(经典策略塔防游戏)游戏介绍

游戏介绍 植物大战僵尸杂交版 for Mac是一款非常受欢迎的策略塔防游戏&#xff0c;植物大战僵尸游戏以其独特的主题、幽默的风格和富有挑战性的关卡设计而著称。玩家需要种植各种植物来防御入侵的僵尸&#xff0c;每种植物都有其特定的功能和攻击方式。植物大战僵尸杂交版&…

老友记台词 第一季 第十五集 Friends 115(全英版)

文章目录 115 The One With the Stoned Guy[Scene: Central Perk, Rachel is serving Joey, Ross, and Monica their drinks.][Scene: Chandlers job, Chandler is typing data into his computer, he keeps typing even while taking a drink of coffee with one hand. One of…

VScode前端环境搭建

前言 VScode是企业中最常用的前端开发工具&#xff0c;本文描述如何利用VScode搭建前端开发环境 一、安装VScode 下载Vscode 点击前往下载页面 安装 安装时一直点击下一步即可 二、环境配置 1&#xff09;更改语言 点击拓展搜索Chinese后下载第一个&#xff0c;下载完后…

Bruno API 工具

Bruno 是Postman 和Insomnia 的开源桌面替代品&#xff0c;用于 API 的测试、开发和调试。它将测试集合保存在本地&#xff0c;因此可以使用 Git 或其他版本控制工具来进行协作。 下载地址: https://www.usebruno.com/downloads 功能 1. 左边菜单 Collections Create Collec…

影院订票系统/电影院售票系统/电影院购票系统的设计与实现/影院管理系统

摘 要 “互联网”的战略实施后&#xff0c;很多行业的信息化水平都有了很大的提升。但是目前很多电影院日常业务仍是通过人工管理的方式进行&#xff0c;需要在影院订票投入大量的人力进行很多重复性工作&#xff0c;这样就浪费了许多的人力物力&#xff0c;工作效率较低&…

Nginx 核心配置详解

目录 1 配置文件说明 1.1 nginx 配置文件格式说明 1.2 Nginx 主配置文件的配置指令方式&#xff1a; 1.3 主配置文件结构&#xff1a;四部分 1.4 nginx 文件作用解释 1.5 配置文件说明 2 nginx-web应用 2.1 定义进程数以及进程绑定 2.2 定义进程优先级与文件打开上限 2.3 even…

解锁冻结的 iPhone 和 iPad 的具体教程

许多苹果用户选择 iDevices 主要是因为他们认为苹果产品更稳定&#xff0c;使用效果也更好。然而&#xff0c;一些苹果用户报告说他们的 iPhone 或 iPad 屏幕没有响应。换句话说&#xff0c;他们的 iOS 设备被冻结了。如果你想解决这样的故障并恢复 iOS 数据&#xff0c;你可以…

挺进大别山(一)

大别山坐落于安徽省、湖北省、河南省交界处&#xff0c;是长江与淮河的分水岭。8月3日&#xff0c;我们早上8点&#xff0c;从马村出发&#xff0c;穿越郑州--许昌--周口--驻马店--信阳&#xff0c;日行5百多公里&#xff0c;到了安徽进入了大别山。近距离的领略了它的魅力。 雨…

Cesium模型制作,解决Cesium加载glb/GLTF显示太黑不在中心等问题

Cesium模型制作&#xff0c;解决Cesium加载glb/GLTF显示太黑不在中心等问题 QQ可以联系这里&#xff0c;谢谢

鸿蒙环境和模拟器安装

下载华为开发者工具套件&#xff0c;并解压 https://developer.harmonyos.com/deveco-developer-suite/enabling/kit?currentPage1&pageSize10 双击dmg安装ide 复制并解压sdk 安装模拟器 https://yuque.antfin-inc.com/ainan.lsd/cm586u/po19k1mi9b2728da?singleDoc#…

算法【Java】—— 双指针算法

双指针算法 常见的双指针有对撞指针&#xff0c;快慢指针以及前后指针&#xff08;这个前后指针是指两个指针都是从从一个方向出发&#xff0c;去往另一个方法&#xff0c;也可以认为是小学学习过的两车并行&#xff0c;我也会叫做同向指针&#xff09;&#xff0c;在前后指针…

使用VNC-viewer对树莓派5 远程连接桌面—详细记录笔记版

树莓派5 的远程桌面连接&#x1f680; 在完成了对树莓派镜像的安装&#xff0c;以及点亮了屏幕之后&#xff0c;接下来就是为开发做一些准备&#xff0c;就是配置树莓派5的远程的桌面的操作&#xff0c;因为如果不这样的话&#xff0c;我在PC上和树莓派系统上分别进行作业的时候…

CSS 布局

CSS 页面布局技术允许我们拾取网页中的元素&#xff0c;并且控制它们相对正常布局流、周边元素、父容器或者主视口/窗口的位置。布局有一下几种 正常布局流display属性弹性盒子网格浮动定位CSS 表格布局多列布局 每种布局都有它们的用途&#xff0c;各有优缺点&#xff0c;相…

实时监控Windows服务器:使用Prometheus和Grafana的终极方案

1. 下载并安装 Prometheus 下载 Prometheus&#xff1a; 访问 Prometheus 下载页面。下载适用于 Windows 的压缩包&#xff08;.zip 文件&#xff09;。prometheus-2.53.2.windows-amd64.zip 下载其中一个就行 安装 Prometheus&#xff1a; 解压下载的压缩包到你选择的目录&a…

Centos7主机带宽限速

需求&#xff1a;最近有两个主机经常把带宽打满。咨询了阿里云无法对内网网卡做限制。这边想使用linux默认的TC工具。 限速之前测试带宽。这时带宽有 168.4MB/s。 ]# scp filebeat-8.8.2-x86_64.rpm 172.116.47.54:/root/100% 26MB 168.4MB/s 00:00 1. 限制出站&#xff0…

Python编码系列—掌握Python Web开发:Flask与FastAPI实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

ubuntu 24.04 安装 Nvidia 显卡驱动 + CUDA + cuDNN,配置 AI 深度学习训练环境,简单易懂,一看就会!

ubuntu 24.04 安装 Nvidia 显卡驱动 CUDA cuDNN&#xff0c;配置 AI 深度学习训练环境&#xff0c;简单易懂&#xff0c;一看就会&#xff01; 1.查看本机显卡型号 lspci | grep -i nvidia输出如下&#xff1a; 01:00.0 3D controller: NVIDIA Corporation GM108M [GeForc…

C语言常用的内存函数

在上一篇博客中我为大家分享了一些常用的字符串函数&#xff0c;以及它们的用法和模拟实现。通过字符串函数中的strcpy&#xff0c;我们能够做到将一个字符串中的内容拷贝到另一个字符串上&#xff0c;可如果有一天我们想把一个整型数组中的内容拷贝到另一个整型数组中呢&#…

KV存储之ETCD

ETCD 是一种分布式键值存储系统&#xff0c;主要用于分布式系统中的配置管理、服务发现和分布式协调。它由 CoreOS 团队开发&#xff0c;现在是 CNCF&#xff08;云原生计算基金会&#xff09;托管的一个开源项目。ETCD 在设计时非常注重一致性、可用性和性能&#xff0c;通常被…

Eclipse的使用配置教程:必要设置、创建工程及可能遇到的问题(很详细,很全面,能解决90%的问题)

Eclipse的使用配置&#xff1a; Ⅰ、Eclipse 的必要配置&#xff1a;1、Eclipse 的安装&#xff1a;其一、将 Eclipse 解压或安装到没有中文且没有空格的路径下。其二、拿到 eclipse.exe 文件&#xff0c;傻瓜式安装即可; 2、设置工作空间(workspace)&#xff1a;其一、首次启动…