cv2.TM_CCOEFF_NORMED ——化相关系数匹配法(最好匹配1)
本文举例两种方式:
1.opencv方法:通过opencv的matchTemplate()方法进行模板匹配,并通过cv2.rectangle()方法画出来:
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)
Original: https://blog.csdn.net/wcc8848/article/details/123061076
Author: wcc8848
Title: opencv模板匹配
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/704328/
转载文章受原作者版权保护。转载请注明原作者出处!