见OpenCV tutorial_template_matching

1.基础理论

模板匹配是找到图像中与模板图像相匹配的区域。通常是矩形,有时候要匹配的对象不是矩形时,可借助掩码 mask实现。

  • template逐像素的在source image上滑动,分别计算每个位置(x,y)的匹配度R,R表示的值可通过多种基准来计算。
  • 常用基准

模板的宽高为ω\omegaω, hhh,对于 TM_SQDIFF基准,模板匹配时找最小值,对于 TM_CCORRTM_CCOEFF是找其最大值。

目前只有 TM_SQDIFFTM_CCORR_NORMED支持使用 mask掩码。

2.matchTemplate API

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace std;bool use_mask;
cv::Mat img;
cv::Mat templ;
cv::Mat mask;
cv::Mat res;const char *img_window = "Source";
const char *res_window = "Result";int match_method;
int max_trackbar = 5;void MatchingMethod(int, void *);int main(int argc, char **argv)
{if (argc < 3){cout << "Not enough parameters" << endl;cout << "Usage:\n" << argv[0] << " <image_name> <template_name> [<mask_name>]" << endl;return -1;}img = cv::imread( argv[1], cv::IMREAD_COLOR );templ = cv::imread( argv[2], cv::IMREAD_COLOR );if(argc > 3) {use_mask = true;mask = cv::imread( argv[3], cv::IMREAD_COLOR );}if(img.empty() || templ.empty() || (use_mask && mask.empty())){cout << "Can't read one of the images" << endl;return EXIT_FAILURE;}cv::namedWindow(img_window, cv::WINDOW_AUTOSIZE );cv::namedWindow(res_window, cv::WINDOW_AUTOSIZE );const char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";cv::createTrackbar( trackbar_label, img_window, &match_method, max_trackbar, MatchingMethod );MatchingMethod( 0, 0 );cv::waitKey(0);return EXIT_SUCCESS;
}
// void做形参指函数没有形参
// 暂时无法确定参数的类型时,可用 void*做形参再转为其他类型
void MatchingMethod(int, void *)
{cv::Mat img_display;img_display = img.clone();int res_width = img.cols - templ.cols + 1;int res_height = img.rows - templ.rows + 1;// 需要的话为新的数组分配数据res.create(res_height, res_width, CV_32FC1);bool method_accepts_mask = (cv::TM_SQDIFF == match_method || match_method == cv::TM_CCORR_NORMED);if(use_mask && method_accepts_mask){cv::matchTemplate(img, templ, res, match_method, mask);}else{cv::matchTemplate(img, templ, res, match_method);}// 归一化cv::normalize(res, res, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());double min_val; double max_val; cv::Point min_loc; cv::Point max_loc;cv::Point match_loc;cv::minMaxLoc(res, &min_val, &max_val, &min_loc, &max_loc, cv::Mat());if(match_method == cv::TM_SQDIFF || match_method == cv::TM_SQDIFF_NORMED){match_loc = min_loc;} else {match_loc = max_loc;}cv::rectangle(img_display, match_loc, cv::Point(match_loc.x + templ.cols, match_loc.y + templ.rows),cv::Scalar::all(0), 2, 9, 0);cv::rectangle(res, match_loc, cv::Point(match_loc.x + templ.cols, match_loc.y + templ.rows),cv::Scalar::all(0), 2, 9, 0);std::cout << "===>>> template match res size: " << res.size << std::endl;cv::imwrite("display_img.png", img_display);cv::imwrite("res_match.png", res);return;
}

输出结果:

原图宽高 WxH, 模板宽高ω\omegaω x hhh, 因为模板是在原图上逐像素计算,类似图像的空间卷积操作,则得到的结果为宽W−ω1+1\frac{W-\omega}{1}+11W−ω​+1高为H−h1+1\frac{H-h}{1}+11H−h​+1的矩阵。

(五)基于matchTemplate的图像区域匹配相关推荐

  1. 基于空间相关的图像模板匹配及MATLAB实现

    应用背景:机器的模式识别所要解决的问题,就是用机器代替人去认识图像和找出一幅图像中人们感兴趣的目标物.如何找到目标物即图像的区域呢,这里介绍在空间域使用模板在图像中寻找与模板匹配的区域. 基本原理:在 ...

  2. 图像五值化与基于三值图像的车牌识别(1)

    庆祝2011年新年 张忠义 海口愚佬会教育科技有限公司 全文下载 www.yulaohui.com/color5_2/ 摘 要:      图像五值化是通过公式Y =(R+G)/2,将RGB空间映射到 ...

  3. Text to image论文精读 NAAF:基于负感知注意力的图像-文本匹配框架 Negative-Aware Attention Framework for Image-Text Matching

    NAAF:Negative-Aware Attention Framework for Image-Text Matching是基于负感知注意力的图文匹配,其利用匹配片段的积极影响和不匹配片段的消极影 ...

  4. 利用OpenCV的函数matchTemplate()实现在图像中寻找、检索、搜索模板图像【图像模板匹配】

    利用OpenCV的函数matchTemplate()实现在图像中寻找.检索.搜索模板图像[图像模板匹配] 在博文 https://www.hhai.cc/thread-220-1-1.html 中我们 ...

  5. 【指纹识别】基于模板匹配算法指纹识别匹配门禁系统matlab源码

    一.简介 1 指纹识别的引入和原理 1.1 指纹的基本知识 指纹,由于其具有终身不变性.唯一性和方便性,已几乎成为生物特征识别的代名词.指纹是指人的手指末端正面皮肤上凸凹不平产生的纹线.纹线有规律的排 ...

  6. 基于灰度信息(块匹配)的图像拼接系统——MATLAB实现,带GUI界面!!!

    基于灰度信息的图像拼接简介 基于灰度相关的匹配是在待定点为中心的窗口内,以图像的灰度分布为匹配的内容,故称之为灰度匹配.又因为匹配是以划分的图像块为单位进行的,所以又称为块匹配(Block Match ...

  7. 计算机视觉第四次实验--基于RANSAC的图像全景拼接

    计算机视觉第四次实验–基于RANSAC的图像全景拼接 文章目录 计算机视觉第四次实验--基于RANSAC的图像全景拼接 一.明确图像拼接整体流程 二.APAP算法 三.算法流程: 四.最小割问题(最大 ...

  8. Java OpenCV-4.0.0 图像处理22 图像模板匹配

    Java OpenCV-4.0.0 图像处理22 图像模板匹配 参考链接:https://blog.csdn.net/qq_34814092/article/details/95813654 Java ...

  9. 图像的七个不变矩 可用于图像的匹配

    图像的几何不变矩 矩特征主要表征了图像区域的几何特征,又称为几何矩, 由于其具有旋转.平移.尺度等特性的不变特征,所以又称其为不变矩.在图像处理中,几何不变矩可以作为一个重要的特征来表示物体,可以据此 ...

最新文章

  1. 我的世界 java开发者_我的世界Java版开发者们畅聊水域更新
  2. python画散点图程序实例_【112】用python画散点图和直线图的小例子
  3. Android学习 —— 多种适配器方式实现ListView
  4. 64位win7使用debug的方法
  5. azure api 管理_具有Azure功能的无服务器API
  6. 在Python中执行while循环
  7. scratch教程2-程序sb,sb2,sb3转换EXE,HTML
  8. ITIL规范(持续更新)
  9. 计算机粉碎文件后电脑桌面没有画面,我电脑桌面上自己新建的一个文件夹,用完后删除不掉,用360强力粉碎也不管用,删掉一开机就出来了,求解决...
  10. 算法竞赛---day2(等差素数列)
  11. Hyper-V固定虚拟机IP
  12. Pspice仿真实验-RC滤波器电路
  13. 理解计算机(2)—什么是云主机
  14. 超全生活/娱乐UI模板素材网站整理
  15. 邦纳超声波传感器Q45ULIU64BCR
  16. 名词解释:DNS,A记录,子域名,CNAME别名,PTR,MX,TXT,SRV,TTL
  17. 项目系统设计与数据库设计(那周余嘉熊掌将得队)
  18. 考研上岸 -- 告别象牙塔
  19. 基于Spring+SpringMVC+MyBatis博客系统的开发教程(四)
  20. 驳“一切不谈考核的管理都是扯淡“

热门文章

  1. 运算优先级、类型转换
  2. 3376: [Usaco2004 Open]Cube Stacking 方块游戏(带权并查集)
  3. matlab2c使用c++实现matlab函数系列教程-rot90函数
  4. 事业单位考试高频考点一:马克思主义基本原理
  5. zynq开发系列3:GPIO连接MIO通过按键控制LED灯亮起
  6. cmd下dir后导入oracle数据库,Oracle在dos命令下导出导入
  7. C# Redis的操作
  8. Kibana6.x.x源码结构分析笔记
  9. golang 安装 guru vscode 安装失败
  10. MySQL GROUP_CONCAT长度限制引发的一场灾难