opencv 模板匹配

-逐个比较像素点之间差异

import cv2
import numpy as np
img=cv2.imread('C:/Users/59925/Desktop/pytest/pics/minions-s.jpg',0)#把图片读取成灰度图
template=cv2.imread('C:/Users/59925/Desktop/pytest/pics/eye.jpg',0)#把图片读取成灰度图
method='cv2.TM_SQDIFF_NORMED'
res=cv2.matchTemplate(img,template,cv2.TM_SQDIFF_NORMED)#选择匹配方法,1代表归一化方差匹配方法。使用归一化的结果更可靠。
#res不是图像矩阵,是模板匹配后相关度矩阵,模板运动范围就是res的shape.
cv2.imshow('res',res)
cv2.waitKey(10)
cv2.destroyAllWindows()
print(img.shape,template.shape,res.shape)#(281, 200) (29, 36) (253, 165).193=281-89+1,91=200-110+1
h,w=template.shape
min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(res)
#最好的匹配效果,有可能是最大值或最小值,根据不同的模板匹配方法确定。
#这里采用归一化方差匹配方法,所以这里要获取最小值。
#根据最小值方差的min_loc,已经已经模板的shape,可以得到模板在图片中匹配的位置。

if method in ['cv2.TM_SQDIFF_NORMED','cv2.TM_SQDIFF']:
    top_left=min_loc
else:
    top_left=max_loc
bottom_right=(top_left[0]+w,top_left[1]+h)
#画出矩形
tem_img=img.copy()
rect=cv2.rectangle(tem_img,top_left,bottom_right,255,2)#因为这是灰度图,不需要制定BGR,只写255即可
cv2.imshow('rect',rect)
cv2.waitKey(10)
cv2.destroyAllWindows()


#匹配多个对象
#可应用与人脸匹配,虽然一般来说人脸匹配用机器人学习的方法来做。
#通过阈值方法实现多目标匹配
thresh=0.2#方差归一化,值越小匹配度越高。
loc=np.where(res<thresh)
#*loc分解后得到两个参数
print(w,h)
hand_img=img.copy()

for i in list(zip(*loc[::1])):#对loc倒序后解包(因为原来loc坐标为y,x),再zip
    bottom_right=(i[0]+w,i[1]+h)
    rect_m=cv2.rectangle(hand_img,i,bottom_right,0,2)
cv2.imshow('hand_img',hand_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

  

 np.where()

 多对象匹配,通过阈值实现

 

posted @ 2023-06-17 17:21  Aneverforget  阅读(39)  评论(0)    收藏  举报