[OpenCV] 数字图像处理 C++ 学习——17模板匹配详细讲解+附完整代码

文章目录

  • 前言
  • 1.理论基础
    • 1.1模板匹配介绍
    • 1.2匹配算法介绍
  • 2.代码实现
    • 2.1模块匹配(matchTemplate)
    • 2.2最佳匹配函数(minMaxLoc())
  • 3.完整代码

前言

模板匹配是图像处理和计算机视觉领域中的一种经典技术,它通过在大图像中搜索与小图像(模板)匹配的位置来实现目标检测和定位。OpenCV 提供了简单易用的 cv::matchTemplate 函数来实现模板匹配,本篇博客将详细讲解模板匹配的原理、使用方法,并结合完整的 C++ 代码来演示如何实现模板匹配。

1.理论基础

1.1模板匹配介绍

在这里插入图片描述

  • 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。
  • 所以模板匹配首先需要一个模板图像T(给定的子图像)
  • 另外需要一个待检测的图像-源图像S
  • 工作方法,在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。

1.2匹配算法介绍

enum TemplateMatchModes {
		TM_SQDIFF        = 0, // 计算平方不同
		TM_SQDIFF_NORMED = 1, // 计算归一化平方不同
		TM_CCORR         = 2, // 计算相关性
		TM_CCORR_NORMED  = 3, // 计算归一化相关性
		TM_CCOEFF        = 4, // 计算相关系数
		TM_CCOEFF_NORMED = 5, // 计算归一化相关系数
};

①计算平方数(TM_SQDIFF)

R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) − I ( x + x ′ , y + y ′ ) ) 2 R(x,y)= \sum_{x',y'} (T(x',y') - I(x+x',y+y'))^2 R(x,y)=x,y(T(x,y)I(x+x,y+y))2

②计算归一化平方数(TM_SQDIFF_NORMED)

R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) − I ( x + x ′ , y + y ′ ) ) 2 ∑ x ′ , y ′ T ( x ′ , y ′ ) 2 ⋅ ∑ x ′ , y ′ I ( x + x ′ , y + y ′ ) 2 R(x,y)= \frac{\sum_{x',y'} (T(x',y') - I(x+x',y+y'))^2}{\sqrt{\sum_{x',y'} T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}} R(x,y)=x,yT(x,y)2x,yI(x+x,y+y)2 x,y(T(x,y)I(x+x,y+y))2

③计算相关性(TM_CCORR)

R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) ⋅ I ( x + x ′ , y + y ′ ) ) R(x,y)= \sum_{x',y'} (T(x',y') \cdot I(x+x',y+y')) R(x,y)=x,y(T(x,y)I(x+x,y+y))

④计算归一化相关性(TM_CCORR_NORMED)

R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) ⋅ I ( x + x ′ , y + y ′ ) ) ∑ x ′ , y ′ T ( x ′ , y ′ ) 2 ⋅ ∑ x ′ , y ′ I ( x + x ′ , y + y ′ ) 2 R(x,y)= \frac{\sum_{x',y'} (T(x',y') \cdot I(x+x',y+y'))}{\sqrt{\sum_{x',y'} T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}} R(x,y)=x,yT(x,y)2x,yI(x+x,y+y)2 x,y(T(x,y)I(x+x,y+y))

⑤计算相关系数(TM_CCOEFF)

R ( x , y ) = ∑ x ′ , y ′ ( T ′ ( x ′ , y ′ ) ⋅ I ′ ( x + x ′ , y + y ′ ) ) R(x,y)= \sum_{x',y'} \left( T'(x',y') \cdot I'(x+x',y+y') \right) R(x,y)=x,y(T(x,y)I(x+x,y+y))

其中:

T ′ ( x ′ , y ′ ) = T ( x ′ , y ′ ) − 1 w ⋅ h ⋅ ∑ x ′ ′ , y ′ ′ T ( x ′ ′ , y ′ ′ ) T'(x',y') = T(x',y') - \frac{1}{w \cdot h} \cdot \sum_{x'',y''} T(x'',y'') T(x,y)=T(x,y)wh1x′′,y′′T(x′′,y′′)

I ′ ( x + x ′ , y + y ′ ) = I ( x + x ′ , y + y ′ ) − 1 w ⋅ h ⋅ ∑ x ′ ′ , y ′ ′ I ( x + x ′ ′ , y + y ′ ′ ) I'(x+x',y+y') = I(x+x',y+y') - \frac{1}{w \cdot h} \cdot \sum_{x'',y''} I(x+x'',y+y'') I(x+x,y+y)=I(x+x,y+y)wh1x′′,y′′I(x+x′′,y+y′′)

⑥计算归一化相关系数(TM_CCOEFF_NORMED)

R ( x , y ) = ∑ x ′ , y ′ ( T ′ ( x ′ , y ′ ) ⋅ I ′ ( x + x ′ , y + y ′ ) ) ∑ x ′ , y ′ T ′ ( x ′ , y ′ ) 2 ⋅ ∑ x ′ , y ′ I ′ ( x + x ′ , y + y ′ ) 2 R(x,y)= \frac{\sum_{x',y'} \left( T'(x',y') \cdot I'(x+x',y+y') \right)}{\sqrt{\sum_{x',y'} T'(x',y')^2 \cdot \sum_{x',y'} I'(x+x',y+y')^2}} R(x,y)=x,yT(x,y)2x,yI(x+x,y+y)2 x,y(T(x,y)I(x+x,y+y))

2.代码实现

2.1模块匹配(matchTemplate)

void 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) 可选的掩码图像,用于指定要处理的区域。
                    );

使用示例:

matchTemplate(src, temp, result, TM_SQDIFF, Mat());

2.2最佳匹配函数(minMaxLoc())

minMaxLoc() 是 OpenCV 中用于查找数组或图像中最大值和最小值及其位置的函数。在图像处理任务(如模板匹配、特征检测)中经常使用,用来确定某个区域内的极值点。

// OpenCV 函数 minMaxLoc 函数介绍
void minMaxLoc( InputArray src, 
                double* minVal, double* maxVal, 
                Point* minLoc, Point* maxLoc, 
                InputArray mask = noArray() )
  • src: 输入数组,可以是单通道的 cv::Mat 或其他支持的 OpenCV 数据类型。
  • minVal: 指向一个双精度浮点型变量的指针,用于存储找到的最小值。
  • maxVal: 指向一个双精度浮点型变量的指针,用于存储找到的最大值。
  • minLoc: 指向 Point 结构体的指针,用于存储找到的最小值位置。
  • maxLoc: 指向 Point 结构体的指针,用于存储找到的最大值位置。
  • mask (可选): 用于掩模操作的输入数组,标识出需要考虑的像素。

结果:

在这里插入图片描述

3.完整代码

#include<opencv2/opencv.hpp>
#include<highgui.hpp>
#include<iostream>
#include<math.h>

using namespace cv;
using namespace std;

Mat src, temp, dst;
int max_track = 5;
int match_method = TM_SQDIFF;
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 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;
	else
		temLoc = 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);

}

void Template_matching()
{
	
	src = imread("cat.jpg");
	//模板图像
	temp = imread("cat_nose.jpg");
	if (src.empty() || temp.empty())
	{
		cout << "ERROR: Could not load image." << endl;
		return;
	}
	namedWindow(INPUT_T, WINDOW_AUTOSIZE);
	namedWindow(OUTPUT_T, WINDOW_NORMAL);
	namedWindow(match_t, 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);

}

int main() 
{
	Template_matching();
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

gewechat免费开源微信机器人开发

​聊天机器人&#xff0c;是一种通过自然语言模拟人类进行对话的程序。通常运行在特定的软件平台上&#xff0c;如PC平台或者移动终端设备平台。聊天机器人系统的主要功能是同用户进行基本沟通并自动回复用户有关产品或服务的问题&#xff0c;以实现降低企业客服运营成本、提升…

Tkinter 的布局pack() and grid()笔记

#encodingutf-8 import tkinter import re import tkinter.messagebox import tkinter.simpledialog import sys import os def get_resources_path(relative_path):if getattr(sys,frozen, False):base_pathsys._MEIPASS#获取临时文件else:base_pathos.path.dirname(".&q…

鸿蒙应用开发----西西购物商城(一)

目录 前言 一、项目介绍 二、项目结构 三、开发工具 四、样式展示 前言 harmonyos是华为推出的一款新一代操作系统&#xff0c;致力于打破设备间的边界&#xff0c;构建统一的智能生态。西西购物商城作为一款基于harmonyos开发的应用&#xff0c;能够利用鸿蒙的分布式技术…

R语言绘制Venn图(文氏图、温氏图、维恩图、范氏图、韦恩图)

Venn图&#xff0c;又称文氏图&#xff0c;标题中其他名字也是它的别称&#xff0c;由封闭圆形组成&#xff0c;代表不同集合。圆形重叠部分表示集合交集&#xff0c;非重叠处为独有元素。在生物学、统计学等领域广泛应用&#xff0c;可展示不同数据集相似性与差异&#xff0c;…

大数据新视界 --大数据大厂之大数据在智慧城市建设中的应用:打造智能生活的基石

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【MR开发】在Pico设备上接入MRTK3(一)——在Unity工程中导入MRTK3依赖

写在前面的话 在Pico上接入MRTK3&#xff0c;目前已有大佬开源。 https://github.com/Phantomxm2021/PicoMRTK3 也有值得推荐的文章。 MRTK3在PICO4上的使用小结 但由于在MacOS上使用MRTK3&#xff0c;无法通过Mixed Reality Feature Tool工具管理MRTK3安装包。 故记录一下…

集合collection和泛型

collection可以直接打印内容&#xff0c;而不是地址&#xff0c;内部已经重写了。 List家族&#xff1a; package com.itheima.d6_collection_update_delete;import java.util.ArrayList; import java.util.Iterator; import java.util.List;/**目标&#xff1a;研究集合遍历并…

Fooocus模型部署指南

一、介绍 Fooocus是一款开源的AI绘画工具&#xff0c;由斯坦福大学博士生张吕敏&#xff08;Github上用户名lllyasviel&#xff09;开发。是一款结合StableDiffusion和Midjourney理念的图像生成工具&#xff0c;提供离线、开源且易于使用的界面。它简化安装步骤&#xff0c;用…

【软件测试】JUnit

Junit 是一个用于 Java 编程语言的单元测试框架&#xff0c;Selenium是自动化测试框架&#xff0c;专门用于Web测试 本篇博客介绍 Junit5 文章目录 Junit 使用语法注解参数执行顺序断言测试套件 Junit 使用 本篇博客使用 Idea集成开发环境 首先&#xff0c;创建新项目&#…

【深度学习】评价指标

https://zhuanlan.zhihu.com/p/479060683 https://blog.csdn.net/fyfugoyfa/article/details/136414958 Confusion Matrix&#xff0c;是一个用来衡量模型好坏的统计量&#xff0c;其中Accuracy&#xff0c;Precision&#xff0c;F1 score&#xff0c;Recall&#xff0c;ROC曲线…

[SAP ABAP] SE11定义数据类型(结构与表类型)

1.定义结构 使用事务码SE11创建数据类型(结构)&#xff0c;输入自定义的数据类型名称&#xff0c;点击创建按钮 勾选结构并点击确定按钮 填写简短描述&#xff0c;并在"组件"页签上添加相关字段信息&#xff0c;点击激活按钮即可生效该结构ZSPO_HEADER_437 2.定义表…

企业网站设计之网站结构设计

创意主题网站的结构设计更是需要更为精心的策划和执行&#xff0c;以确保吸引并保持用户的注意力。以下是创意主题网站结构设计的关键要素&#xff1a; 1. 目标明确的导航栏 导航栏是用户进入网站并浏览内容的入口。在创意主题网站中&#xff0c;导航栏的设计要突显网站的主…

【大数据算法】一文掌握大数据算法之:大数据算法分析技术。

大数据算法分析技术 1、引言2、 大数据分析技术2.1 时间/空间复杂度2.2 I/O 复杂度2.3 结果质量2.4 通信复杂度 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;最近更文有些不频繁了哈。 小鱼&#xff1a;这一个月不见&#xff0c;你这说话方式也变了。 小屌丝&#xff…

Electron-(一)创建桌面应用

一、概述 本文通过核心步骤介绍&#xff0c;形成使用Electron进行桌面应用创建的概述性内容。 在当今的软件开发领域&#xff0c;Electron 作为一款强大的工具&#xff0c;为开发者提供了一种便捷的方式来创建跨平台的桌面应用。本文将通过详细介绍核心步骤&#xff0c;带您领…

PPT自动化:掌握 python-pptx 的基础元素

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 PPT 📒📝 什么是 Slide?📝 了解 Shape📝 深入 Paragraph📝 探索 Run⚓️ 相关链接 ⚓️📖 介绍 📖 初学python-pptx,掌握 python-pptx 与 PPT 元素的对应关系是至关重要的一步。今天,我们一起来了解一下 PPT 中…

Python基于OpenCV的实时疲劳检测

2.检测方法 1&#xff09;方法 与用于计算眨眼的传统图像处理方法不同&#xff0c;该方法通常涉及以下几种组合&#xff1a; 1、眼睛定位。 2、阈值找到眼睛的白色。 3、确定眼睛的“白色”区域是否消失了一段时间&#xff08;表示眨眼&#xff09;。 相反&#xff0c;眼睛长…

【Redis】数据结构(中)----ZipList(压缩列表)

文章目录 ZipList(压缩列表)概念ZipList的结构Entry的内部结构previous_entry_lengthEncoding存储字符串存储整数 content ZipList会存在的问题查询中间数据连锁更新 总结 ZipList(压缩列表) 概念 ZipList是一种特殊的"双端链表",由一系列特殊编码的连续内存块组成…

解决Git拉取项目后右侧边栏无Maven的问题

从gitlab上拉取新项目&#xff0c;当你配置好maven仓库地址&#xff0c;配置文件&#xff0c;各种库都配置好了&#xff0c;但是没有Maven&#xff0c;找不到下图的package因此打包不了项目解决办法 非常简单&#xff0c;只需一步&#xff01; 右击项目里面的pom.xml,再点击add…

uniapp小程序自定义聚合点

注&#xff1a; 1.默认的聚合点可以点击自动展示子级点位&#xff0c;但是自定义的聚合点在ios上无法触发markerClusterClick的监听&#xff0c;至今未解决&#xff0c;不知啥原因 2.ios和安卓展示的点位样式还有有差别 源码附上 <template><view class"marke…

算法——python实现归并排序

文章目录 归并排序NB三人组总结 归并排序 """ 归并排序 """""" 时间复杂度 &#xff1a; O(N*logN) 空间复杂度 &#xff1a; O(N) 需要额外生成一个临时变量&#xff0c;最大是N长 思路&#xf…