图像处理之模板匹配(C++)

news/2024/5/19 8:26:23

图像处理之模板匹配(C++)


文章目录

  • 图像处理之模板匹配(C++)
  • 前言
  • 一、基于灰度的模板匹配
    • 1.原理
    • 2.代码实现
    • 3.结果展示
  • 总结


前言

模板匹配的算法包括基于灰度的匹配、基于特征的匹配、基于组件的匹配、基于相关性的匹配以及局部变形匹配。本文对常见的模板匹配方法进行C++实现和应用。

常见模板匹配种类和应用场景:

  1. 基于灰度的匹配一般应用在没有缩放和旋转,颜色变化不大的场合。
  2. 基于特征的匹配一般应用在具有缩放和旋转,颜色变化较大的场合。
  3. 在模板各个组件有相对位移的情况下,使用基于组件的匹配算法。
  4. 在图像模糊,目标定位不依赖于边缘的情况下一般使用基于相关性的匹配。
  5. 目标有局部变形的情况使用局部变形匹配算法。

一、基于灰度的模板匹配

1.原理

基于灰度的模板匹配原理是在给定图像中寻找与预先定义的模板图像最相似的部分。该方法的基本思想是通过模板图像对给定图像(源图像)进行遍历计算两个图像之间的相似度。
相似度计算公式:
1.平方差匹配(匹配度越高,值越接近于0)
方差匹配方法
2.标准平方差匹配(匹配度越高,值越接近于0)
标准平方差匹配
3.相关匹配(匹配度越高,值越接近于1)
相关匹配
4.标准相关匹配(匹配度越高,值越接近于1)
标准相关匹配
5.相关系数匹配(匹配度越高,值越接近于1)
相关系数匹配
6.标准相关系数匹配(匹配度越高,值越接近于1)
标准相关系数匹配
参数解释:
T‘表示模板图像,I表示源图像;
x‘,y’对应模板矩阵对应的元素坐标;
x,y对应模板遍历源图像时左上角元素在源图像上的坐标;
T’(x’,y’)表示模板在(x’,y’)位置对应的灰度值;
I’ (x’+x,y’+y)表示源图像在(x’+x,y’+y)位置对应的灰度值;
备注:上述的0和1不是实际值,而是对实际值进行归一化后的结果。
备注:图片来自opencv.org截图

2.代码实现

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>using namespace std;
using namespace cv;/*
* @param cv::Mat src    源图像,CV_8U或CV_32F
* @param cv::Mat temp   模板图像,CV_8U或CV_32F,src数据类型一致
* @param cv::Mat result 结果图
* @apram int method     相似度计算准则
* (cv::TM_SQDIFF、 cv::TM_SQDIFF_NORMED指方差匹配法、归一化方差匹配法)
* (cv::TM_CCORR、cv::TM_CCORR_NORMED、cv::TM_CCOEFF、cv::TM_CCOEFF_NORMED指相关、标准相关、相关系数、标准相关系数匹配)
* @brief 基于OpenCV实现的灰度模板匹配
*/
void MatchFunction(const cv::Mat& src,const cv::Mat& templ,cv::Mat& result,int match_method,cv::Point& matchLoc)
{// 计算结果图的尺寸int result_cols = src.cols - templ.cols + 1;int result_rows = src.rows - templ.rows + 1;result.create(result_rows, result_cols, CV_32FC1);//执行模板匹配matchTemplate(src, templ, result, match_method);//归一化normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());//定位模板匹配最相似的位置double minVal; double maxVal; Point minLoc; Point maxLoc;minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());if (match_method == cv::TM_SQDIFF || match_method == cv::TM_SQDIFF_NORMED){matchLoc = minLoc;}else{matchLoc = maxLoc;}rectangle(result, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar::all(0), 2, 8, 0);
}int main()
{/// 以灰度图的形式加载源图像和模板图像cv::Mat img = cv::imread("F://work_study//algorithm_demo//baby.jpg", cv::IMREAD_GRAYSCALE);cv::Mat templ = cv::imread("F://work_study//algorithm_demo//template.jpg", cv::IMREAD_GRAYSCALE);if (img.empty() || templ.empty()){cout << "Can't read one of the images" << endl;return -1;}cv::Mat result;Point matchLoc;MatchFunction(img,templ, result, 0, matchLoc);cv::rectangle(img, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar::all(0), 2, 8, 0);cv::imshow("result", result);cv::imshow("src_result", img);waitKey(0);return 0;
}

3.结果展示

模板图片
模板图片
结果图
结果图


总结

`本文实现了基于Opencv的灰度模板匹配技术,后续扩展多目标多角度、基于(边缘)特征、局部变形等的模板匹配技术,以提高模板在不同光照、不同角度下的鲁棒性。
因为笔者水平有限,有错误欢迎指出,代码本人均在本地运行实验正确,大家放心使用。


http://www.mrgr.cn/p/33252506

相关文章

分布式版本控制工具 Git 的使用方式

文章目录 Git简介下载安装基本使用起始配置Git 的三个区域基本操作流程查看仓库状态删除&#xff08;撤销暂存区&#xff09;差异对比查看版本日志版本回退修改提交日志分支概念&#xff1a;创建分支与切换分支合并分支&#xff08;快速合并&#xff09;合并分支&#xff08;提…

Pandas 2.2 中文官方教程和指南(一)

原文:pandas.pydata.org/docs/安装原文:pandas.pydata.org/docs/getting_started/install.html安装 pandas 的最简单方法是作为Anaconda发行版的一部分安装,这是一个用于数据分析和科学计算的跨平台发行版。Conda包管理器是大多数用户推荐的安装方法。 还提供了从源代码安装…

Pandas 2.2 中文官方教程和指南(十三)

原文:pandas.pydata.org/docs/写时复制(CoW)原文:pandas.pydata.org/docs/user_guide/copy_on_write.html注意 写时复制将成为 pandas 3.0 的默认设置。我们建议现在就启用它以从所有改进中受益。 写时复制首次引入于版本 1.5.0。从版本 2.0 开始,大部分通过 CoW 可能实现…

Pandas 2.2 中文官方教程和指南(十七)

原文:pandas.pydata.org/docs/重复标签原文:pandas.pydata.org/docs/user_guide/duplicates.htmlIndex对象不需要是唯一的;你可以有重复的行或列标签。这一点可能一开始会有点困惑。如果你熟悉 SQL,你会知道行标签类似于表上的主键,你绝不希望在 SQL 表中有重复项。但 pan…

Pandas 2.2 中文官方教程和指南(三)

原文:pandas.pydata.org/docs/如何操作文本数据原文:pandas.pydata.org/docs/getting_started/intro_tutorials/10_text_data.html将所有名称字符改为小写。 In [4]: titanic["Name"].str.lower() Out[4]: 0 braund, mr. owen har…

Pandas 2.2 中文官方教程和指南(十八)

原文:pandas.pydata.org/docs/可空整数数据类型原文:pandas.pydata.org/docs/user_guide/integer_na.html注意 IntegerArray 目前处于实验阶段。其 API 或实现可能会在没有警告的情况下发生变化。使用pandas.NA作为缺失值。 在处理缺失数据中,我们看到 pandas 主要使用NaN来…

【解决NodeJS项目无法在IDEA中调试的问题】使用JetBrains IDEA 2023 调试nodejs项目

项目采用Ant Design Pro React&#xff0c;使用前后端分离开发方式&#xff0c;后端可以很容易的打断点调试&#xff0c;但是前端通过网页进行调试&#xff0c;在IDEA中加了调试断点&#xff0c;但是没有什么用处。 解决方案如下&#xff1a; 点击新建运行配置 新建JavaScrip…

蓝桥杯管道

一开始拿到这道题没有什么头绪。综合各路大佬题解&#xff0c;一下子豁然开朗。 题眼&#xff1a;每一段感受器都感受到水的最早时间。由于整个管道&#xff0c;分为多个段&#xff0c;每个段都有一个感受器。所以题眼翻译为&#xff1a;覆盖满整条管道&#xff0c;所需要的最短…

数据结构(学习笔记)王道

一、绪论 1.1 数据结构的基本概念 数据&#xff1a;是信息的载体&#xff0c;是描述客观事物属性的数、字符以及所有输入到计算机中并被计算机程序识别和处理的符号的集合。&#xff08;计算机程序加工的原料&#xff09;数据元素&#xff1a;数据的基本单位&#xff0c;由若干…

Python GUI开发- PyQt5 开发小工具环境入门

前言 常见的python开发gui的库有 Tkinter, PyQt5, wxPython等。本教程是选择PyQt5 开发桌面小工具。 环境准备 只需pip安装即可快速准备好开发环境 pip install pyqt5快速开始 创建一个空的window窗口 Qapplication():每个GUI都必须包含一个Qapplication,argv表示获取命令行…

CentOS 7.9.2007 中Docker使用GPU

一、安装nvidia驱动 1.1&#xff0c;查看显卡驱动 # 查看显卡型号 lspci | grep -i nvidia 1.2&#xff0c;进入 PCI devices &#xff0c;输入上一步查询到的 2204 1.3&#xff0c;进入 官方驱动 | NVIDIA&#xff0c;查询 Geforce RTX 3090 驱动并下载 1.4&#xff0c;禁用…

QFD赋能人工智能:打造智能化需求分析与优化新纪元

在科技飞速发展的今天&#xff0c;人工智能(AI)已经渗透到我们生活的方方面面。然而&#xff0c;如何让AI更加贴合用户需求&#xff0c;提供更加精准和个性化的服务&#xff1f;这成为了一个亟待解决的问题。质量功能展开&#xff08;Quality Function Deployment&#xff0c;简…

kubernetes安装ingress-nginx

下载安装文件 首先&#xff0c;需要匹配Ingress-nginx版本和kubernetes版本。 在https://github.com/kubernetes/ingress-nginx可以找到&#xff0c;如下图所示&#xff1a; 这里一定要选择kubernetes对应的ingress-nginx版本 要不会报一些奇怪的错误&#xff01; 博主k8s版本…

oracle连接数据库报错ORA-12541:TNS:无监听程序

最近闲来无事修改了电脑的用户名,本来以为不会影响什么,后来发现oracle数据库连接不上了,报错如下图:查看服务发现确实停止了,启动也启动不起来了搜索Net Manager查看配置, 发现配置里面是我修改前的电脑名,才发现问题所在,随后我又把电脑名称改回来了数据库才能正常连…

Pandas 2.2 中文官方教程和指南(二十二)

原文:pandas.pydata.org/docs/时间增量原文:pandas.pydata.org/docs/user_guide/timedeltas.html时间增量是时间之间的差异,以不同的单位表示,例如天、小时、分钟、秒。它们可以是正数也可以是负数。 Timedelta是datetime.timedelta的子类,并且行为类似,但也允许与np.tim…

钉钉OA审批评论接口,如何@ 人并发送通知

钉钉OA审批评论接口&#xff0c;如何 人并发送通 问题描述&#xff1a; 相关接口&#xff1a;https://oapi.dingtalk.com/topapi/process/instance/comment/add 我希望在钉钉oa审批流程中&#xff0c;添加评论的同时通过“”或者其他方式提醒流程发起人去跟进审批工作。 但我…

Pandas 2.2 中文官方教程和指南(二)

原文:pandas.pydata.org/docs/如何在 pandas 中创建图表?原文:pandas.pydata.org/docs/getting_started/intro_tutorials/04_plotting.htmlIn [1]: import pandas as pdIn [2]: import matplotlib.pyplot as plt 本教程使用的数据:空气质量数据 本教程使用关于(NO_2)的空气…

ROS轻松入门(一)—— 基本概念:node节点、topic通信、service通信

node节点 ROS 中的每个节点都应该负责单一的、模块化的目的&#xff0c;例如控制车轮马达或发布来自激光测距仪的传感器数据。每个节点都可以通过主题、服务、操作或参数从其他节点发送和接收数据。 一个完整的机器人系统由许多协同工作的节点组成。在 ROS 2 中&#xff0c;单…

数据库之数据库恢复技术思维导图+大纲笔记

大纲笔记&#xff1a; 事务的基本概念 事务 定义 用户定义的一个数据库操作系列&#xff0c;这些操作要么全做&#xff0c;要么全不做&#xff0c;是一个不可分割的基本单位 语句 BEGIN TRANSACTION 开始 COMMIT 提交&#xff0c;提交事务的所有操作 ROLLBACK 回滚&#xff0c…

什么是敏捷发布规划

敏捷发布规划基于项目路线图和产品发展愿景,提供了高度概括的发布进度时间轴(通常是 3 到 6个月)。同时,敏捷发布规划还确定了发布的迭代或冲刺次数,使产品负责人和团队能够决定需要开发的内容,并基于业务目标、依赖关系和障碍因素确定达到产品放行所需的时间。 对客户而…