OpenCV学习(二十三) :模板匹配:matchTemplate()

1、概述

模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题。
它是图像处理中最基本、最常用的匹配方法。
模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。
模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域
参考:
模板匹配
OpenCV模板匹配函数:matchTemplate()介绍

2、minMaxLoc()函数

寻找矩阵(一维数组当作向量,用Mat定义) 中最小值和最大值的位置。

void cv::minMaxLoc(
InputArray  src,                // 输入单通道阵列
double *    minVal,             // 指向返回的最小值的指针;如果不需要,则使用NULL。
double *    maxVal = 0,            // 指向返回的最大值的指针;如果不需要,则使用NULL。
Point *     minLoc = 0,            // 指向返回的最小位置的指针(二维情况下);如果不需要,则使用NULL。
Point *     maxLoc = 0,            // 指向返回的最大位置的指针(二维情况下);如果不需要,则使用NULL。
InputArray  mask = noArray()   // 用于选择子数组的可选掩码。
)

3、matchTemplate()函数

工作原理:在待检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。

matchTemplate(
InputArray image,       // 待搜索源图像,必须是8位整数或32位浮点
InputArray  templ,      // 模板图像,必须不大于源图像并具有相同的数据类型。
OutputArray result,     // 表示匹配结果图像,必须是单通道32位浮点。如果image的尺寸为W x H,templ的尺寸为w x h,则result的尺寸为(W-w+1)x(H-h+1)
int method,             // 表示计算匹配程度的方法
InputArray  mask = noArray()   //搜索模板的掩码。它必须具有与templ相同的数据类型和大小。它不是默认设置的。
)

1.几种常见的模板匹配算法:

1. cv::TM_SQDIFF平方差匹配法
计算模板与目标图像的方差,由于是像素值差值的平方的和,所以值越小匹配程度越高;

2. cv::TM_SQDIFF_NORMED归一化平方差匹配法
范化的cv::TM_SQDIFF,取值为0-1之间,完美匹配返回值为0;

3. cv::TM_CCORR相关匹配法
使用dot product计算匹配度(不清楚怎么计算dot product,没看过代码),越高匹配度就好;

4. cv::TM_CCORR_NORMED归一化相关匹配法
范化的cv::TM_CCORR,0-1之间,我用的这个;

5. cv::TM_CCOEFF系数匹配法
采用模板与目标图像像素与各自图像的平均值计算dot product,正值越大匹配度越高,负值越大图像的区别越大,但如果图像没有明显的特征(即图像中的像素值与平均值接近)则返回值越接近0;

6. cv::TM_CCOEFF_NORMED化相关系数匹配法
范化的cv::TM_CCOEFF,-1 ~ 1之间。

从上面的几个方法中,6比较符合目前需求:没有明显的特征,但2幅图像还是非常接近的,so,改为方法cv::TM_CCOEFF_NORMED。

总结:
1)前面方法(1)(2)为越小的值表示越匹配;方法(3)(4)(5)(6)值越大越匹配。
2)如果输入图像和模板图像都是彩色图像,则三个通道分别计算上述相似度,然后求平均值。
3)函数通过在输入图像image中滑动(从左到右,从上到下),寻找各个位置的区块(搜索窗口)与模板图像templ的相似度,并将结果保存在结果图像result中。该图像中的每一个点的亮度表示该处的输入图像与模板图像的匹配程度,然后可以通过某方法(一般使用函数minMaxLoc)定位result中的最大值或者最小值得到最佳匹配点,最后根据匹配点和模板图像的矩形框标出匹配区域
4)随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价)。

4、示例:6种模板匹配方法展示

1)载入一幅输入图像和一幅模板图像块 (template)
2)通过使用函数 matchTemplate 实现之前所述的6种匹配方法的任一个. 用户可以通过滑动条选取任何一种方法.
3)归一化匹配后的输出结果
4)定位最匹配的区域
5)用矩形标注最匹配的区域

#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;#define WINDOW_NAME1 "【原始图片】"        //为窗口标题定义的宏
#define WINDOW_NAME2 "【匹配窗口】"        //为窗口标题定义的宏Mat g_srcImage; Mat g_templateImage; Mat g_resultImage;
int g_nMatchMethod;
int g_nMaxTrackbarNum = 5;int main()
{printf("\n\n\t请调整滑动条观察图像效果\n\n");printf(  "\n\t滑动条对应的方法数值说明: \n\n""\t\t方法【0】- 平方差匹配法(SQDIFF)\n""\t\t方法【1】- 归一化平方差匹配法(SQDIFF NORMED)\n""\t\t方法【2】- 相关匹配法(TM CCORR)\n""\t\t方法【3】- 归一化相关匹配法(TM CCORR NORMED)\n""\t\t方法【4】- 相关系数匹配法(TM COEFF)\n""\t\t方法【5】- 归一化相关系数匹配法(TM COEFF NORMED)\n" );// 1、载入原图像和模板块g_srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/aa.jpg", 1 );g_templateImage = imread( "F:/C++/2. OPENCV 3.1.0/TEST/bb.jpg", 1 );// 2、创建窗口namedWindow( WINDOW_NAME1, WINDOW_AUTOSIZE );namedWindow( WINDOW_NAME2, WINDOW_AUTOSIZE );// 3、创建滑动条并进行一次初始化createTrackbar( "方法", WINDOW_NAME1, &g_nMatchMethod, g_nMaxTrackbarNum, on_Matching );on_Matching( 0, 0 );waitKey(0);return 0;
}
void on_Matching( int, void* )
{// 1、给局部变量初始化Mat srcImage;g_srcImage.copyTo( srcImage );// 2、初始化用于结果输出的矩阵int resultImage_cols =  g_srcImage.cols - g_templateImage.cols + 1;int resultImage_rows = g_srcImage.rows - g_templateImage.rows + 1;g_resultImage.create( resultImage_cols, resultImage_rows, CV_32FC1 );// 3、进行匹配和标准化matchTemplate( g_srcImage, g_templateImage, g_resultImage, g_nMatchMethod );normalize( g_resultImage, g_resultImage, 0, 1, NORM_MINMAX, -1, Mat() );// 4、通过函数 minMaxLoc 定位最匹配的位置double minValue; double maxValue; Point minLocation; Point maxLocation;Point matchLocation;minMaxLoc( g_resultImage, &minValue, &maxValue, &minLocation, &maxLocation, Mat() );// 5、对于方法 SQDIFF 和 SQDIFF_NORMED, 即方法1 2越小的数值有着更高的匹配结果. (最黑的位置代表最高的匹配)// 方法 3 4 5 6 而其余的方法, 数值越大匹配效果越好(最白的位置代表最高的匹配)if( g_nMatchMethod  == TM_SQDIFF || g_nMatchMethod == TM_SQDIFF_NORMED ){ matchLocation = minLocation; }else{ matchLocation = maxLocation; }// 6、绘制出矩形,并显示最终结果rectangle( srcImage, matchLocation, Point( matchLocation.x + g_templateImage.cols , matchLocation.y + g_templateImage.rows ), Scalar(0,255,255), 2, 8, 0 );rectangle( g_resultImage, matchLocation, Point( matchLocation.x + g_templateImage.cols , matchLocation.y + g_templateImage.rows ), Scalar(0,255,255), 2, 8, 0 );imshow( WINDOW_NAME1, srcImage );imshow( WINDOW_NAME2, g_resultImage );
}

结果:
1)TM_SQDIFF 平方差匹配法

2)TM_SQDIFF_NORMED 归一化平方差匹配法

3)TM_CCORR 相关匹配法

4)TM_CCORR_NORMED 归一化相关匹配法

5)TM_CCOEFF 系数匹配法匹配法

6)TM_CCOEFF_NORMED 化相关系数匹配法

OpenCV学习(二十三) :模板匹配:matchTemplate(),minMaxLoc()相关推荐

  1. OpenCV 学习笔记(模板匹配)

    OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够 ...

  2. 【opencv学习】【模板匹配】

    今天学习模板匹配 模板图片 目标图像 import cv2 import matplotlib.pyplot as plt# 模板匹配的原理: # 一个模板图像在目标图像上机芯从左到右从上到下进行滑动 ...

  3. 【opencv学习笔记】028之模板匹配——matchTemplate函数详解

    目录 一.前言 二.模板匹配 1.模板匹配是个啥 2.常用匹配算法 1.平方差匹配-CV_TM_SQDIFF 2.标准平方差匹配-CV_TM_SQDIFF_NORMED 3.相关匹配-CV_TM_CC ...

  4. OpenCV与图像处理学习十六——模板匹配

    OpenCV与图像处理学习十六--模板匹配 一.模板匹配介绍 二.代码应用 一.模板匹配介绍 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定目标的图像位于图像的什么地方,进而对图像进行定位. ...

  5. OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()

    OpenCV学习(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客: 反向投影backproject的直观理解 opencv 反向投影 颜色直方 ...

  6. OpenCV之特征点模板匹配

    OpenCV之特征点模板匹配 版权声明:博文为博主原创文章,转载请注明出处 :https://blog.csdn.net/ganbelieve/article/details/89959505 介绍一 ...

  7. python opencv模板匹配多目标_基于opencv的多目标模板匹配

    利用opencv进行多目标模板匹配,只要是利用其matchTemplate函数,但在多目标(这里是讨论目标图片中不同大小模板的匹配),以下贴出代码和图片,供大家参考: #include #includ ...

  8. OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()

    OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客: Harris角点检测原理详解 Harri ...

  9. OpenCV基于形状的模板匹配

    OpenCV基于形状的模板匹配 引言 基于形状的匹配算法 具体代码 KcgMatch.h KcgMatch.cpp main.cpp 匹配的结果 引言 在OpenCV中有个用于模板匹配的基本函数mat ...

最新文章

  1. ClickHouse 详细集群部署方案
  2. 了解你所不知道的SMON功能(五):Recover Dead transaction
  3. 达尔文进化奖_使用Kydavra GeneticAlgorithmSelector将达尔文进化应用于特征选择
  4. Javascript取select的选中值和文本
  5. nginx的脚本引擎(一)
  6. php发卡平台源码免费,php源码 免费开源的云尚发卡V1.5.7 个人发卡平台源码 免费源码分享...
  7. [渝粤教育] 天水师范学院 离散数学 参考 资料
  8. Catia二次开发:数组,局部变量等,msgbox,背景颜色,enable属性,图片模块,vb的common dialog控件,键盘鼠标事件,text操作
  9. bin to npy
  10. 光纤交换机与普通交换机的区别
  11. 2021年最佳Selenium替代品
  12. 一文学会会计记账-会计科目、借贷关系和会计分录的小白理解
  13. 单条件求和和多条件求和以及条件求平均
  14. 制作系统光盘Server 2003 总结
  15. STM32单片机新建工程
  16. HyperAI超神经已加入群聊,思否 AIGC Hackathon 扩列
  17. 达梦数据库和mysql索引引擎_达梦数据库如何建索引和使用
  18. c++中bitset的用法总结
  19. (数据库存储应用)S2数据库和表的基本操作
  20. android 启动画面广告,Android 应用启动欢迎界面广告的实现实例

热门文章

  1. STM32控制HC-05蓝牙模块进行通信
  2. ChatGPT会对未来5年的NLP算法从业者带来怎样的冲击?
  3. 说说如何在项目中引入 jBPM4 工作流框架以及遇到的坑儿
  4. 阿尔法编程python答案第四章_智慧职教Python编程基础答案第四章单元测试答案
  5. 类 ApplicationInfo详解
  6. HTML5开发系列(4) 之 样式表的三种类型
  7. Composite 聚合——Elasticsearch 聚合后分页新实现
  8. brew install mysql
  9. MySql的flush用法
  10. SIFT经典论文翻译版