导读

模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。绘制矩形是用来将模版图像的匹配结果展示出来的方法。

模板匹配实现简单(2~3行代码),计算效率高,不需要执行阈值化、边缘检测等操作来生成二值化图像。但是:如果输入图像中存在变化的因素,包括旋转、缩放、视角变化等,模板匹配很容易就会失效。除非:旋转、缩放、视角变化恒定的情况下,模板匹配也可以完美发挥作用

如果你的输入图像中包含这些类型的变化因素,那么你不应使用模板匹配,而应该使用专用的对象检测器,包括:HOG + 线性 SVM,Faster R-CNN,SSD,YOLO 等。

你可能需要的文章:

  • 关于:Python基础,爬虫,常见异常和面试【篇】(专题汇总)

正文

OpenCV 为我们提供了函数: cv2.matchTemplate() 用于实现模板匹配,并使用 cv2.minMaxLoc() 计算匹配结果,最后通过 cv2.rectangle() 绘制矩形展示匹配结果。

一、方法介绍

1. cv2.matchTemplate()

1.1 作用

模板匹配是在一幅图像中寻找一个特定目标的方法,这种方法的原理非常简单:依次遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标。

1.2 使用方法

res = cv2.matchTemplate(image, templ, method, result=None, mask=None)
  • image:输入一个待匹配的图像,支持8U或者32F;
  • templ:输入一个模板图像,需与image相同类型;
  • method:要使用的数据匹配算法。
  • result:输出保存结果的矩阵,32F类型;

1.3 匹配算法

OpenCV提供了6种模板匹配算法。

method 名称 含义
TM_SQDIFF 平方差匹配

计算模板与目标图像的方差,由于是像素值差值的平方的和,所以值越小匹配程度越高。

TM_CCORR  相关匹配 该方法采用乘法操作;数值越大表名匹配程度越好。
TM_CCOEFF  相关系数匹配 计算相关系数,1表示完美匹配;-1表示最差匹配。
TM_SQDIFF_NORMED  归一化平方差匹配 计算归一化平方差,计算出来的值越接近0,越相关。
TM_CCORR_NORMED  归一化相关匹配 计算归一化相关性,计算出来的值越接近1,越相关。
TM_CCOEFF_NORMED  归一化相关系数匹配 计算归一化相关系数,计算出来的值越接近1,越相关。

下面是匹配算法的公式,额,别问我这些公式什么意思,我也不懂,官网上扒下来的,看看就好。

2. cv2.minMaxLoc()

2.1 作用

根据 cv2.matchTemplate() 的匹配结果,返回图形坐标结果。

2.2 使用方法

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(ret) 
  • ret:是 cv2.matchTemplate() 返回的矩阵;
  • min_val:最小值;
  • max_val:最大值;
  • min_loc:最小值对应的图像中的位置;
  • max_loc:最大值对应的图像中的位置;

3. cv2.rectangle()

3.1 作用

绘制矩形:在图片 img 上画长方形,坐标原点是图片左上角,向右为x轴正方向,向下为y轴正方向。

3.2 使用方法

cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift )
  • img:底图;
  • pt1:矩形的左上角坐标;
  • pt2:矩形的右下角坐标;
  • color:线条的颜色,BGR;
  • thickness:线的粗细,数值越大线越粗;

二、实战操作

1. 图片准备

        待匹配图片 image(博客首页的图),模板图片 templ 如下:

2. 代码展示

# _*_coding:utf-8_*_
# 作者:Java Punk
# 时间:2022-10-09 14:49:45
# 功能:方法学习:cv2.matchTemplate(), cv2.minMaxLoc(), cv2.rectangle()import cv2 as cv2
import numpy as np
from matplotlib import pyplot as plt# 单个模板匹配
def one_match(image, templ):# 1.读取图片img = cv2.imread(image)template = cv2.imread(templ)h, w = template.shape[:2]# 2.匹配模板res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)# 3.计算矩形左边top_left = max_locbottom_right = (top_left[0] + w, top_left[1] + h)# 4.画矩形cv2.rectangle(img, top_left, bottom_right, (255, 0, 0), 5)# 5.展示结果cv2.imshow('img_rgb', img)cv2.waitKey(0)passif __name__ == '__main__':print("———————————————————— start ————————————————————\n")# 图片路径自己设置,下面是我本地的路径,记得替换!!!one_match('../img/test/guimie_01.jpg', '../img/test/guimie_02.jpg')print("———————————————————— end ————————————————————\n")

3. 结果展示

完美匹配到了,下面的蓝色方框可不是我画的,是程序画的哈。


OpenCV笔记:模板匹配 cv2.matchTemplate()、cv2.minMaxLoc() 与 绘制矩形 cv2.rectangle() 方法介绍相关推荐

  1. Opencv(C++)笔记--模板匹配cv::matchTemplate()和最值计算cv::minMaxLoc()

    目录 1--模板匹配 1-1--OpenCV API 1-2--六种匹配方法 1-3--代码实例 2--最值计算 2-1--OpenCV API 1--模板匹配 使用模板图像与原图像进行匹配,Open ...

  2. opencv java match_OpenCV模板匹配函数matchTemplate详解

    参考文档:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/histograms/template_matchin ...

  3. 基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate()

    基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate() 文章目录 基于VS与OpenCV的模板匹配学习(4):手写OpenCV matchTemplate() 前 ...

  4. OpenCV—python 模板匹配与图像特征匹配

    文章目录 一.理论介绍与算法 二.算法代码 单目标匹配 多目标匹配 三 多尺度模板匹配 一.理论介绍与算法 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个 ...

  5. OpenCV:模板匹配

    小程序「跳一跳」的自动化. 主要涉及到了OpenCV的模板匹配和边缘检测技术,以及Android开发调试工具ADB. 如果放在一起说,感觉内容有些多. 所以,分三期来讲,也能多了解一些东西. 首先介绍 ...

  6. OPENCV多种模板匹配使用对比

    前文简单提到模板匹配中的一种:NCC多角度模板匹配,博主结合实际的检测项目(已落地)发现其准确率和稳定性有待提升,特别是一些复杂背景的图形,又或是模板选取不当都会造成不理想的效果:同时也借鉴过基于梯度 ...

  7. 基于opencv的模板匹配详解

    1.什么是模板匹配 在OpenCV教程中这样解释模板匹配: 模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术.这里说的模板是我们已知的小图像,模板匹配就是在一副大图像中搜寻目标. ...

  8. Opencv java模板匹配-角点检测(11)

    函数 在opencv中有模板匹配的方法, Imgproc.matchTemplate(src, template, result, Imgproc.TM_CCOEFF); 这个方法输入的参数分别是: ...

  9. 【OpenCV3】模板匹配——cv::matchTemplate()详解

    模板匹配通常被用于目标检测.相似度分析中,opencv2和opencv3中提供了一个专门用于模板匹配的函数--cv::matchTemplate(),下面就对该函数进行详细的介绍. 先从一个实际的例子 ...

最新文章

  1. 2019 牛客多校第一场 F Random Point in Triangle
  2. Dancing_Links总结 【by AbandonZHANG】
  3. /var/log目录中Linux日志文件的功能详解
  4. HTTP家族详细讲解
  5. linux网络总线的作用,I2C总线是什么?基于I2C总线的Linux系统有哪些优点?
  6. CodeForces - 274B Zero Tree
  7. 精英二代手柄测试软件,XBOX精英二代手柄评测视频:世界上最先进的手柄
  8. 基于三维WebGL技术的公安三维项目
  9. cox回归模型python实现_cox回归模型python实现_生存分析Cox回归模型(比例风险模型)的spss操作实例...
  10. 虚幻4引擎开发的手游_2019虚幻4手游大作排行-虚幻引擎开发的手机游戏
  11. UNCODE 与 ANSI 编码互相转换
  12. 编译原理:FIRST集与FOLLOW集
  13. KUCAS清关文件申请形式 TER与TIR认证介绍
  14. 网络舆情总结汇报报告如何撰写的方法技巧
  15. ZOJ 4062 Plants vs. Zombies 2018 ICPC 青岛站 E Plants vs. Zombies
  16. 8086寄存器学习笔记-SS 寄存器和 SP 寄存器
  17. HTML五子棋游戏论文,五子棋毕业论文-HTML开发五子棋的原型设计.doc
  18. 蓝桥杯-阶乘运算和高精度加法(Java)
  19. 如何按照某几列值或文件名、Sheet名汇总多个excel文件多个表(多个工作薄,多个Sheet)的和、平均值、排名等等
  20. 宠物类微信公众号图文排版有哪些技巧?

热门文章

  1. word2013表格文字上下居中
  2. Latex 表格文字居中(垂直和水平居中)
  3. PTS,SLM,Filter三种降低PAPR方法的matlab仿真
  4. Linux系统yum源的三种配置方法
  5. 今日头条 爬虫 java_爬虫实例:今日头条爬虫
  6. 在 Mac 上将 PDF 转换为 Word 的 5 种简单方法
  7. android手动触发ke,手机重启问题快速分析定位指南
  8. js 中文加密解密
  9. java如何通过client客戶端http实现get/ post请求传递json参数到restful 服务接口
  10. 如何通俗地理解协方差和相关系数?