OpenCV模板匹配matchTemplate的实现


Posted in Python onOctober 18, 2019

作用有局限性,必须在指定的环境下,才能匹配成功,是受到很多因素的影响,所以有一定的适应性

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

模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域[/code]

OpenCV模板匹配matchTemplate的实现

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

代码实现:

import cv2 as cv
import numpy as np

def template_demo():
  tpl = cv.imread("./temp.png")
  target = cv.imread("./1.png")
  cv.imshow("template image",tpl)
  cv.imshow("target image",target)
  methods = [cv.TM_SQDIFF_NORMED,cv.TM_CCORR_NORMED,cv.TM_CCOEFF_NORMED]#各种匹配算法
  th,tw = tpl.shape[:2]
#获取模板图像的高宽
  for md in methods:
    result = cv.matchTemplate(target,tpl,md)
    # result是我们各种算法下匹配后的图像
    # cv.imshow("%s"%md,result)
    #获取的是每种公式中计算出来的值,每个像素点都对应一个值
    min_val,max_val,min_loc,max_loc = cv.minMaxLoc(result)
    if md == cv.TM_SQDIFF_NORMED:
      tl = min_loc  #tl是左上角点
    else:
      tl = max_loc
    br = (tl[0]+tw,tl[1]+th)  #右下点
    cv.rectangle(target,tl,br,(0,0,255),2)
#画矩形
    cv.imshow("match-%s"%md,target)


src = cv.imread("./1.png") #读取图片
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)  #创建GUI窗口,形式为自适应
cv.imshow("input image",src)  #通过名字将图像和窗口联系
template_demo()
cv.waitKey(0)  #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
cv.destroyAllWindows() #销毁所有窗口

补充:

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

OpenCV模板匹配matchTemplate的实现

①TM_SQDIFF是平方差匹配;TM_SQDIFF_NORMED是标准平方差匹配。利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大。

②TM_CCORR是相关性匹配;TM_CCORR_NORMED是标准相关性匹配。采用模板和图像间的乘法操作,数越大表示匹配程度较高, 0表示最坏的匹配效果。

③TM_CCOEFF是相关性系数匹配;TM_CCOEFF_NORMED是标准相关性系数匹配。将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列)。

总结:随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价)。

相关性是越接近1越大越好

平方差是越小越好
所以TM_SQDIFF在使用时和其他的是有所区别的

2.result = cv.matchTemplate(target,tpl,md)

opencv的目标匹配函数为matchTemplate,函数原型为:matchTemplate(image, templ, method[, result[, mask]]) -> result
image参数表示待搜索源图像,必须是8位整数或32位浮点。
templ参数表示模板图像,必须不大于源图像并具有相同的数据类型。
method参数表示计算匹配程度的方法。
result参数表示匹配结果图像,必须是单通道32位浮点。如果image的尺寸为W x H,templ的尺寸为w x h,则result的尺寸为(W-w+1)x(H-h+1)。

其中result是模板图像去匹配的区域位置图像[/code]

OpenCV模板匹配matchTemplate的实现

OpenCV模板匹配matchTemplate的实现

OpenCV模板匹配matchTemplate的实现

3.min_val,max_val,min_loc,max_loc = cv.minMaxLoc(result)

opencv的函数minMaxLoc:在给定的矩阵中寻找最大和最小值,并给出它们的位置。 该功能不适用于多通道阵列。 如果您需要在所有通道中查找最小或最大元素,要先将阵列重新解释为单通道。
函数minMaxLoc原型为:minMaxLoc(src[, mask]) -> minVal, maxVal, minLoc, maxLoc
src参数表示输入单通道图像。
mask参数表示用于选择子数组的可选掩码。
minVal参数表示返回的最小值,如果不需要,则使用NULL。
maxVal参数表示返回的最大值,如果不需要,则使用NULL。
minLoc参数表示返回的最小位置的指针(在2D情况下); 如果不需要,则使用NULL。
maxLoc参数表示返回的最大位置的指针(在2D情况下); 如果不需要,则使用NULL。

结合每种匹配算法,我们看看获取的数值

result = cv.matchTemplate(target,tpl,md)
    #获取的是每种公式中计算出来的值,每个像素点都对应一个值
    min_val,max_val,min_loc,max_loc = cv.minMaxLoc(result)
    print("--------------%s--------------"%md)
    print("min_val",min_val)
    print("max_val",max_val)
    print("min_loc",min_loc)
    print("max_loc",max_loc)
    print("--------------%s--------------" % md)
--------------1--------------#TM_SQDIFF_NORMED标准平方差匹配
min_val 0.0
#标准差是越小为0代表匹配上了
max_val 0.22279763221740723
min_loc (108, 248)
max_loc (3, 480)
--------------1--------------
--------------3--------------
#TM_CCORR_NORMED标准相关性匹配
min_val 0.9228140115737915
max_val 1.0
#相关性是越接近1代表匹配上了
min_loc (9, 378)
max_loc (108, 248)
--------------3--------------
--------------5--------------
#TM_CCOEFF_NORMED标准相关性系数匹配
min_val -0.10706906020641327
max_val 1.0
#相关性越接近1越好
min_loc (186, 248)
max_loc (108, 248)
--------------5--------------

查看min_loc和max_loc关系

cv.line(target,min_loc,max_loc,(0,255,255),2)

OpenCV模板匹配matchTemplate的实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python修改Excel数据的实例代码
Nov 01 Python
python操作gmail实例
Jan 14 Python
python处理csv数据的方法
Mar 11 Python
Python的Django框架中模板碎片缓存简介
Jul 24 Python
Python中Django 后台自定义表单控件
Mar 28 Python
python爬虫爬取某站上海租房图片
Feb 04 Python
利用python打开摄像头及颜色检测方法
Aug 03 Python
使用python进行拆分大文件的方法
Dec 10 Python
对python多线程SSH登录并发脚本详解
Feb 14 Python
详解Python的三种可变参数
May 08 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 26 Python
python处理excel绘制雷达图
Oct 18 #Python
使用Python进行中文繁简转换的实现代码
Oct 18 #Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 #Python
python使用matplotlib绘制雷达图
Oct 18 #Python
Python 日志logging模块用法简单示例
Oct 18 #Python
python调用matplotlib模块绘制柱状图
Oct 18 #Python
Python Django模板之模板过滤器与自定义模板过滤器示例
Oct 18 #Python
You might like
php file_exists 检查文件或目录是否存在的函数
2010/05/10 PHP
PHP使用PDO连接ACCESS数据库
2015/03/05 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
prototype 1.5 & scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
2012/10/11 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
动态获取复选框checkbox选中个数的jquery代码
2013/06/25 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
angular6开发steps步骤条组件
2019/07/04 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
JavaScript计算正方形面积
2019/11/26 Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
2020/04/27 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
K-means聚类算法介绍与利用python实现的代码示例
2017/11/13 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
高中学生干部学习的自我评价
2014/02/21 职场文书
大学三年计划书范文
2014/04/30 职场文书
售后服务承诺书模板
2014/05/21 职场文书
建筑工程质量通病防治方案
2014/06/08 职场文书
国庆节慰问信
2015/02/15 职场文书
python数字图像处理:图像的绘制
2022/06/28 Python