首页 > 编程语言 >opencv-python 模板匹配

opencv-python 模板匹配

时间:2023-08-01 22:36:31浏览次数:38  
标签:loc plt 匹配 img python cv2 opencv 模板

模板匹配:在给定的图像中查找和模板最相似的区域。模板匹配类似于卷积,模板在原图上从左上角原点(0,0)开始滑动,计算模板与滑动窗口的差别程度,计算方法有6种,每次计算的结果放在一个矩阵中,最后输出差别程度的矩阵。原始图像为A*B,模板大小是a*b的话,输出的矩阵大小为:(A-a+1)*(B-b+1)。

1 模板匹配

opencv中的模板匹配函数是:matchTemplate(img,template,method) 

模板匹配计算方法(最好用归一化的参数):
TM_SQDIFF 计算平方不同,计算出的值越小,越相关
TM_CCORR 计算相关性,计算出来的值越大,越相关
TM_CCOEFF 计算相关系数,计算出来的值越大,越相关
TM_SQDIFF_NORMED 计算归一化平方不同,计算出来的值越接近0,越相关
TM_CCORR_NORMED 计算归一化相关性,计算出来的值越接近1,越相关
TM_CCOEFF_NORMED 计算归一化相关系数,计算出来的值越接近1,越相关

图像和对应的匹配图像如下:

  

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline    

img = cv2.imread('./cat.jpg')
template = cv2.imread('./cat_face.jpg')
h,w = template.shape[:2]

res = cv2.matchTemplate(img,template,cv2.TM_CCORR_NORMED)  #模板匹配
print(res)
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)  #获取匹配结果的最值和对应位置,方便计算后续矩形所需的坐标点
print(max_val,max_loc)

cv2.rectangle(img,max_loc,(max_loc[0]+w,max_loc[1]+h),color=[0,0,255])  #用矩形把匹配的结果显示出来

cv2.imshow('img',img)

img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.subplot(121),plt.imshow(res,cmap='gray')
plt.subplot(122),plt.imshow(img2)
plt.show()
cv2.waitKey(0) 
cv2.destroyAllWindows()

把六种模板匹配计算方法都试一下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline    

img = cv2.imread('./cat.jpg')
template = cv2.imread('./cat_face.jpg')   #匹配的模板图片
h,w = template.shape[:2]  #获取模板的高宽

#定义模板匹配方法列表
methods = ['cv2.TM_SQDIFF','cv2.TM_CCORR','cv2.TM_CCOEFF','cv2.TM_SQDIFF_NORMED','cv2.TM_CCORR_NORMED','cv2.TM_CCOEFF_NORMED']

for meth in methods:        #循环显示匹配的结果,把所有匹配方法都用plt显示出来
    img_copy = img.copy()    #把原始图片拷贝一下,保证后续的匹配方法不被影响
    method = eval(meth)     #取匹配方法的真值
    
    res = cv2.matchTemplate(img_copy,template,method)   #模板匹配
    min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)  #获取匹配结果的最值和对应位置
    
    if method in [cv2.TM_SQDIFF,cv2.TM_SQDIFF_NORMED]:  #如果是这两种匹配方法,计算出的值越小,越相关,其余的匹配方法相反
        start_point = min_loc
        end_point = (min_loc[0]+w,min_loc[1]+h)
    else:
        start_point = max_loc
        end_point = (max_loc[0]+w,max_loc[1]+h)
        
    cv2.rectangle(img_copy,start_point,end_point,color=[0,0,255])  #用矩形把匹配的结果显示出来
    
    img2 = cv2.cvtColor(img_copy, cv2.COLOR_BGR2RGB)  #用plt显示图片的时候要把通道转换成RGB格式
    plt.subplot(121),plt.imshow(res,cmap='gray')   #显示匹配结果的灰度图
    plt.subplot(122),plt.imshow(img2)
    plt.suptitle(meth)   #显示匹配方法标题
    plt.show()

    

2 匹配多个对象

首先介绍一下np.where函数

np.where 函数是三元表达式 x if condition else y 的向量化版本,它有两种用法:

1.np.where(condition,x,y) 当where内有三个参数时,第一个参数表示条件,当条件成立时where方法返回x,当条件不成立时where返回y

2.np.where(condition) 当where内只有一个参数时,那个参数表示条件,当条件成立时,where返回的是每个符合condition条件元素的坐标,返回的是以元组的形式

 图像和对应的匹配图像如下:

  

import cv2
import numpy as np   #匹配多个对象
import matplotlib.pyplot as plt
%matplotlib inline    

img = cv2.imread('./mario.jpg')
template = cv2.imread('./mario_coin.jpg')   #匹配的模板图片
h,w = template.shape[:2]  #获取模板的高宽

res = cv2.matchTemplate(img,template,cv2.TM_CCORR_NORMED)
#print(res)

threshold = 0.8  #设定阈值

loc = np.where(res >= threshold)   #返回res中值大于0.8的y轴,x轴的索引(分开的)
#print(loc)

# loc = np.argwhere(res >= threshold)   #用argwhere可以直接获取坐标[y,x],但是坐标类型是list
# print(loc)
# for left_top in loc:
#     left_top = tuple(left_top[::-1])  #把坐标list转换位元组
#     bottom_right = (left_top[0]+w,left_top[1]+h)
#     cv2.rectangle(img,left_top,bottom_right,[0,0,255],1)


for ptr in zip(*loc[::-1]):   # *表示可选参数  因为loc是先y坐标再x坐标,所以用loc[::-1]翻转一下,然后再用zip函数拼接一下
    end_point = (ptr[0]+w,ptr[1]+h)
    cv2.rectangle(img,ptr,end_point,[0,0,255],1)

cv2.imshow('img',img)
cv2.waitKey(0) 
cv2.destroyAllWindows() 

 匹配结果如下:

 

标签:loc,plt,匹配,img,python,cv2,opencv,模板
From: https://www.cnblogs.com/libai123456/p/17599291.html

相关文章

  • opencv-python 图像直方图
    统计学中,直方图是一种对数据分布情况的图形表示,并且将统计数据组织到一系列定义好bin当中(bin是从数据中计算出的特征统计量,可以看作“直条”或“组距”)。图像直方图是用来表示数字图像中亮度分布的直方图,统计的是图像中每个像素亮度值的个数。横坐标表示图像中各个像素点的灰度级......
  • python - 文件
    #str=r'''#《春晓》这首小诗,初读似觉平淡无奇,反复读之,便觉诗中别有天地。它的艺术魅力不在于华丽的辞藻,不在于奇绝的艺术手法,而在于它的韵味。整首诗的风格就像行云流水一样平易自然,然而悠远深厚,独臻妙境。千百年来,人们传诵它,探讨它,仿佛在这短短的四行诗里,蕴涵着开掘不完的艺......
  • Cmd:创建Python虚拟环境
    安装virtualenv安装虚拟环境pipinstallvirtualenv或pipinstallvirtualenv-ihttp://pypi.douban.com/simple/--trusted-hostpypi.douban.com创建虚拟环境目录virtualenvtestcdtest进入Scripts工作目录cdScripts激活当前虚拟环境activate.bat安装vi......
  • 【Azure 环境】ARM部署模板大于4MB的解决方案及Linked Template遇见存储账号防火墙无
    问题一:在ADFPipeline部署ARMTemplate报错“Deploymentfailed--therequestcontentsizeexceedsthemaximumsizeof4MB”【解答】4MB是一个固定限制,不可以修改其大小。 如果Template文件太大,需要把拆分成多个后,通过LinkedTemplate的方式部署。 在部署的时候,ARM通过main......
  • Python爬虫入门
    前言网页构成首先介绍一个网页的基本构成:HTML负责网页的结构,CSS负责样式的美化,Javascript负责交互逻辑。HTMLCSSJavascript点击F12打开开发者工具(部分电脑可能为Fn+F12),使用元素选择工具,再将鼠标指针移动到任意网页元素,单击该元素则该元素对应的网页源代码会被选中。......
  • Python基础day56 Django视图层相关
    视图层三板斧问题在视图函数中写函数跟普通函数不太一样,Django中使用的是局部的request所有的视图函数不能够没有返回值,并且返回值还必须是HttpResponse对象#错误代码Theviewapp01.views.indexdidn'treturnanHttpResponseobject.ItreturnedNoneinstead.其实我......
  • 【Azure 环境】ARM部署模板大于4MB的解决方案及Linked Template遇见存储账号防火墙无
    问题一:在ADFPipeline部署ARMTemplate报错“Deploymentfailed--therequestcontentsizeexceedsthemaximumsizeof4MB”【解答】4MB是一个固定限制,不可以修改其大小。 如果Template文件太大,需要把拆分成多个后,通过LinkedTemplate的方式部署。 在部署的时候,ARM通......
  • python采集爬虫数据,API接口调用获取淘宝天猫,拼多多,1688等平台商品详情
    Python技术爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者);它是一种按照一定的规则,自动地抓取网络信息的程序或者脚本。如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,他们沿着蜘蛛网抓取自己想要的......
  • 什么是gil锁、python的垃圾回收机制是什么样的?解释为什么计算密集型用多进程,io密集型
    目录1什么是gil锁-全局解释器锁:gil锁的作用是什么?为什么要有gil锁?2python的垃圾回收机制是什么样的?-引用计数-标记清除-分代回收3解释为什么计算密集型用多进程,io密集型用多线程计算密集型任务:I/O密集型任务:总结:1什么是gil锁-全局解释器锁:它的本质就是一个大的互斥锁,它......
  • Python实现批量将ppt转换为pdf
    这是一个Python脚本,能够批量地将微软Powerpoint文件(.ppt或者.pptx)转换为pdf格式。使用说明1、将这个脚本跟PPT文件放置在同一个文件夹下。2、运行这个脚本。全部代码1234567891011121314151617181920212223import comtypes.clientimport osdef init_powerpoint():powerpoint =......