OpenCV 模板匹配 matchTemplate

news2024/12/23 10:20:24

一、模板匹配概念

  模板匹配是一项在一副图像中寻找与另一幅模板图像最匹配(相似)部分的技术。模板匹配不是基于直方图的,而是通过在输入图像上滑动图像块(模板)同时对比相似度,来对模板和输入图像进行匹配的一种方法。

应用:

  (1)目标查找定位

  (2)运动物体跟踪

1、模板匹配 --- matchTemplate()

CV_EXPORTS_W void matchTemplate(InputArray image, InputArray temp1, OutputArray result, int method);

  image:待搜索图像(大图)

  temp1:搜索模板,需和原图一样数据类型且尺寸大小不能大于源图像

  reuslt:比较结果的映射图像,其必须为单通道的,32位浮点型图像,如果原图(待搜索图像)尺寸为W*H,二temp1的尺寸为w*h,则result的尺寸一定是(W-w+1)*(H-h+1)

  method:指定的匹配方法,有如下六种:

1     TM_SQDIFF --- 平方差匹配法(最好匹配0)
2     TM_SQDIFF_NORMED --- 归一化平方差匹配法(最好匹配0)
3     TM_CCORR --- 相关匹配法(最坏匹配0)
4     TM_CCORR_NORMED ---归一化相关匹配法(最坏匹配0)
5     TM_CCOEFF --- 系数匹配法(最好匹配1)
6     TM_CCOEFF_NORMED --- 归一化系数匹配法(最好匹配1)

 平方差匹配 method=TM_SQDIFF:最好匹配为0,匹配越差,匹配值越大

 

标准平方差匹配 method=TM_SQDIFF_NORMED:

3f306594ef0755bbb64fc9dfb3a4ebcb.webp (418×62)

相关匹配 method=TM_CCORR

这类方法采用模板和图像间的乘法操作,所以较大的数表示匹配程度较高,0标识最坏的匹配效果。

img

 标准相关匹配 method=TM_CCORR_NORMED

相关匹配 method=TM_CCOEFF

8b2c94f1f4e9a1bb7a9948cc4e35abf9.webp (329×42)

 img

 标准相关匹配 method=TM_CCOEFF_NORMED

img

 

这类方法将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示匹配很差,0表示没有任何相关性(随机序列)。

2、矩阵归一化 --- normalize()

1 C++: void normalize(InputArray src,OutputArray dst, double alpha=1, 
            double beta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray() )

  src:输入源图像,Mat类型

  dst:输出结果图像,需要和原图一样的尺寸和类型

  alpha:归一化后的最小值,默认为1

  beta:归一化后的最大值,默认为0

  norm_type:归一化类型,可选:NORM_INF, NORM_L1, NORM_L2(默认)等

  dtype:默认值为-1,此参数为负值时,输出矩阵和src有同样的类型

  mask:可选的掩码操作

normallize()函数的作用是进行矩阵归一化。

3、寻找最值 --- minMaxLoc()

1 CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT double* minVal, CV_OUT double* maxVal = 0, 
                  CV_OUT Point* minLoc=0, CV_OUT Point* maxLoc=0, 
                  InputArray mask=noArray());

  src:输入源图像,单通道图像

  minVal:返回最小值的指针,若无需返回,则置为0

  maxVal:返回最大值的指针,若无需返回,则置为0

  minLoc:返回最小位置的指针,若无需返回,则置为0

  maxLoc:返回最大位置的指针,若无需返回,则置为0

  mask:可选的掩码操作

minMaxLoc()函数的作用是在数组中找到全局最小值和最大值

单模板匹配code:

#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
  
using namespace std;
using namespace cv;

int main()
{
    Mat temp=imread("zi.jpg");
    Mat src=imread("mu.jpg");
    Mat dst=src.clone();
    imshow("temp",temp);

    int width=src.cols-temp.cols+1;//result宽度
    int height=src.rows-temp.rows+1;//result高度

   Mat result(height,width,CV_32FC1);//创建结果映射图像
    matchTemplate(src, temp, result, TM_SQDIFF); //平方差匹配法(最好匹配0)
     //matchTemplate(srcImg, templateImg, resultImg, CV_TM_SQDIFF_NORMED); //归一化平方差匹配法(最好匹配0)
    //matchTemplate(srcImg, templateImg, resultImg, CV_TM_CCORR); //相关匹配法(最坏匹配0)
    //matchTemplate(srcImg, templateImg, resultImg, CV_TM_CCORR_NORMED); //归一化相关匹配法(最坏匹配0)
    //matchTemplate(srcImg, templateImg, resultImg, CV_TM_CCOEFF); //系数匹配法(最好匹配1)
    //matchTemplate(src,temp,result, TM_CCOEFF);//化相关系数匹配,最佳值1
    imshow("result",result);
    normalize(result,result,0,1,NORM_MINMAX,-1);//归一化到0-1范围

   double minValue,maxValue;
    Point minLoc,maxLoc;
    minMaxLoc(result,&minValue,&maxValue,&minLoc,&maxLoc);
   cout<<"minValue="<<minValue<<endl;
    cout<<"maxValue="<<maxValue<<endl;

    rectangle(dst,maxLoc,Point(maxLoc.x+temp.cols,maxLoc.y+temp.rows),Scalar(0,255,0),2,8);
    imshow("dst",dst);

    waitKey(0);
    return 0;
}

另:模板匹配要求图片一定是 32位 图片,详情见零一博客

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

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

相关文章

【IoT】如何使用软件加密(文件夹加密工具.exe),并破解工具

目录 第一步&#xff1a;显示隐藏的文件。 第二步&#xff1a;将隐藏文件变成文件夹。 第三步&#xff1a;解密文件。 有时候出差或者有些商务场合&#xff0c;需要对一些敏感文件做一下简单的加密&#xff0c;这样在分享内容的时候&#xff0c;可以起到初步的保护作用。 当…

Windows利用easyBCD装Ubuntu双系统

一、准备材料&#xff1a; 1、easyBCD软件&#xff08;我用V2.3版本&#xff09; 2、Ubuntu系统&#xff08;我用的12.04版本ubuntu-12.04-desktop-i386.iso&#xff09; 二、配置空闲分区 1、右击“计算机”--->管理--->右击某个自己分配的分区--->选择“压缩卷”…

Deep Bidirectional Language-Knowledge Graph Pretraining论文阅读

Deep Bidirectional Language-Knowledge Graph Pretraining github代码 摘要 最近的工作表明&#xff0c;知识图(KG)可以补充文本数据&#xff0c;提供结构化的背景知识&#xff0c; 为推理提供有用的支架。然而&#xff0c;这些作品并没有经过预先的训练来学习大规模的两种…

央视推荐的护眼灯是哪款?盘点央视推荐的护眼灯排名

护眼灯是生活中最常见的照明工具&#xff0c;许多人担心品质不过关 不合格的护眼灯会造成视损害 建议在选购护眼灯时&#xff1a; 首先看清楚产品的具体标识&#xff0c;其中就包括有产品的生产厂家&#xff0c;生产地址以及他们的产品型号 看产品规格和是否获得了国家的相关…

博睿数据蝉联中国APM市场份额第一,Bonree ONE春季正式版重磅发布

日前&#xff0c;IDC发布《中国IT统一运维软件产品市场跟踪报告&#xff0c;2022H2》,2022下半年中国APM市场环比增长近10%。博睿数据以市场份额达18.28%蝉联APM应用性能监控市场份额第一。 追求卓越&#xff0c;顺势而为 博睿数据作为中国领先的一体化智能可观测平台&#xf…

今天主要谈谈关于申请美国专利的一些问题

进入2021年&#xff0c;国家更多的开始鼓励在国外开展业务的企业去布局国外专利&#xff0c;提升企业海外竞争力。无他&#xff0c;着实是我们在知识产权保护方面起步太晚&#xff0c;已经吃亏了太久&#xff0c;专利掣肘&#xff0c;技术卡脖子&#xff0c;勤勉的为别人打工。…

Domino自带的JSON校验工具

大家好&#xff0c;才是真的好。 JSON数据在Notes/Domino已经变得非常重要。从Domino 10开始&#xff0c;在LotusScript语言中就加入了对JSON数据处理功能。在管理中&#xff0c;我们知道&#xff0c;从Domino 12版本开始就支持Domino自动化配置&#xff0c;也是使用JSON数据作…

利用ESP32-C3实现一个风扇PWM控制器,可网页操作

1简介 这段代码是一个基于ESP32开发板的PWM控制器&#xff0c;可以通过网页输入控制参数并显示在屏幕上&#xff0c;通过PWM输出引脚控制风扇的转速&#xff0c;还可以测量风扇的转速并在屏幕上显示。此外&#xff0c;代码还具备显示当前时间、显示Wi-Fi连接信息等功能。 2函数…

【Git基础】常用git命令(三)

文章目录 1.版本回退1.1 没有commit的情况1.2 已经commit但没有push的情况1.3 已经push到远端仓库的情况 2. 删除文件2.1 从工作区删除文件2.2 使用git rm命令删除文件2.3 永久删除文件2.4 永久删除文件的步骤拆解 3. 查看指定文件的修改3.1 查看文件的所有commit3.2 查看所有c…

亚控组态王与EXCEL通信

先创建一个IO设备&#xff1a;DDE类型 创建一个变量&#xff1a; 创建一个窗口&#xff0c;建立一个文本显示并关联前面建立的变量 先打开一个EXCEL文件&#xff08;注意&#xff1a;WPS是不兼容的&#xff0c;必须先打开EXCEL文件&#xff0c;否则会报错&#xff09; …

云原生|kubernetes|rancher-2.6.4安装部署简明手册

前言: rancher是一个比较特殊的开源的kubernetes管理工具&#xff0c;特殊在它是一个名称为k3s的简单kubernetes集群&#xff0c;而该集群是在kubernetes集群内的。 OK&#xff0c;本文将讲述如何在centos7服务器上&#xff0c;在已有的kubernetes-1.23.15集群内&#xff0c;…

基于STM32的电阻、电容测量(NE555芯片RC振荡法)

文章目录 前言一、电路图1.电阻测量公式2.电容测量公式 二、代码实现1.外部中断代码2.定时器中断处理数据 总结 前言 做的一个关于电阻和电容的测量电路&#xff0c;都是比较通用的。经过实际测试&#xff0c;电容测量电路还是可以的&#xff0c;电阻测量电路有一个缺点就是&a…

Prometheus/Metrics监控dubbo线程池状态

网上找了些文章&#xff0c;发现挺少的&#xff0c;下面一些文章有些帮助 https://cloud.tencent.com/developer/article/1800906 https://github.com/apache/dubbo/issues/6625 其中第二篇文有写到&#xff0c;通过dubbo的spi获取DataStore&#xff0c;然后再拿到dubbo的线程…

关于jvm-sandbox-repeater dubbo回放异常的问题处理

还是引流回放的问题&#xff0c;今天测试的同学反馈说他做了流量回放&#xff0c;但是回放的好几个接口报错了&#xff0c;都是抛出来的服务器错误&#xff0c;请联系管理员&#xff0c;与预期的结果不符&#xff0c;但是实际这块的逻辑是没有改动的&#xff0c;所以也只能是du…

Ingonyama团队的ZKP加速

1. PipeMSM&#xff08;cloud-ZK&#xff09;&#xff1a;ZKPFPGA Ingonyama团队2022年发表了论文《PipeMSM: Hardware Acceleration for Multi-Scalar Multiplication》&#xff0c;尝试将ZK操作与FPGA结合&#xff0c;并为未来ZK与ASIC&#xff08;Application Specific Int…

无法解析的外部符号 __mingw_vsprintf

windows下的ffmpeg是采取mingw平台上编译&#xff0c;本人采用的是msys2&#xff0c;本人需要h264&#xff0c;于是先在msys2里面编译了x264静态库&#xff0c;注意这里是静态库&#xff0c;动态库经过了链接&#xff0c;不会出现下面的问题&#xff0c;然后在ffmpeg里面用下面…

【C++类】

目录 前言类的定义类的访问限定符及封装访问限定符封装 类的大小为什么需要内存对齐为什么成员函数不占用类的内存&#xff1f;为什么空类的大小是1个字节&#xff1f; 前言 今天是少年正式认识"对象"的第一天,虽然此"对象"非彼对象&#xff0c;但是少年也…

使用Jmeter进行http接口测试

前言&#xff1a; 本文主要针对http接口进行测试&#xff0c;使用Jmeter工具实现。 Jmter工具设计之初是用于做性能测试的&#xff0c;它在实现对各种接口的调用方面已经做的比较成熟&#xff0c;因此&#xff0c;本次直接使用Jmeter工具来完成对Http接口的测试。 一、开发接口…

经典算法之快速排序

快速排序 【思想】选择一个元素作为标准&#xff0c;分别将小于该元素的元素放入该元素左边&#xff0c;大于该元素的元素放到该元素的右边&#xff0c;接下来分别对左右两边区间进行同样操作&#xff0c;直到整个数组有序。 【例子】 上述是一个未排序的数组&#xff0c;首…

前端三个小妙招

整理下本人在工作中撸代码遇到的一些刚看时一脸懵逼&#xff0c;实则很简单就能解决的小妙招&#xff0c;希望对大家有所帮助哟~ 伪元素动态改变其样式 我们都用过伪元素&#xff0c;什么::before,::after啊这些等等&#xff0c;但是他们都不会直接在代码里html中生成标签&am…