-逐个比较像素点之间差异
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()
多对象匹配,通过阈值实现
标签:匹配,img,res,cv2,opencv,shape,模板 From: https://www.cnblogs.com/tanyuanqing/p/17487756.html