模板匹配的定义:
def matchTemplate(image, templ, method, result=None, mask=None)
![](https://i-blog.csdnimg.cn/blog_migrate/067deefe78f4236082916eabb0f2137b.png)
import numpy as np from matplotlib import pyplot as plt img = cv2.imread('messi.jpg') imgcopy = img.copy() ball = cv2.imread('ball.jpg') ##imread后面的参数: #。 0 代表灰度图,>0是 img_h,img_w ,_ = img.shape ball_h ,ball_w,_ = ball.shape ##选取比较方法 method = cv2.TM_SQDIFF ##进行匹配计算 res = cv2.matchTemplate(img,ball,method)##原图的每个区域于模板的相识度的值 ## print(res) ##最值的获取,也就是最相似的地方 min_val ,max_val,min_loc,max_loc = cv2.minMaxLoc(res) print(min_loc) ##定位模板匹配的位置 top_left = min_loc bottom_right = (top_left[0]+ball_w,top_left[1]+ball_h) ##绘制矩形 cv2.rectangle(img,top_left,bottom_right,255,-1) cv2.imshow('result',np.hstack([imgcopy,img])) cv2.waitKey(0)
##第二种,自我实现。
模板匹配的核心就是在图像的像素中计算模板与图像的相识度区域
def consinsim(vect1,vect2): #余弦公式 vect1 =np.array(vect1) vect2 = np.array(vect2) result = np.dot(vect1,vect2)/(np.linalg.norm(vect1)*np.linalg.norm(vect2)) return result def cal_dist(vec1,vec2): return round(np.dot(vec1,vec2)/np.sqrt((np.dot(vec1,vec1)*np.dot(vec2,vec2))),4) img = cv2.imread('messi.jpg',0) img_ori = img.copy() ball = cv2.imread('ball.jpg',0) img_h,img_w = img.shape ball_h,ball_w = ball.shape res = {} for i in range(img_h - ball_h + 1): for j in range(img_w - ball_w+1): print(i,j) field = img[i:i+ball_h,j:j+ball_w] ##2,相似度的计算 field_vec = field.reshape(-1).astype(np.float)###特别注意一定要使用长的字符类型 ball_vec = ball.reshape(-1).astype(np.float) score = consinsim(field_vec,ball_vec) res[(j,i)] = score #3排序并获取相似度最高的区域 max_loc ,maxvalue = sorted(res.items(), key=lambda x:x[-1])[-1] bottom_right = (max_loc[0]+ball_w,max_loc[1]+ball_h) cv2.rectangle(img,max_loc,bottom_right,255,2) cv2.imshow('result',np.hstack([img_ori,img])) cv2.waitKey(0)
![](https://i-blog.csdnimg.cn/blog_migrate/50966b3c1ecc60c3d8eb8f4515b57126.png)