模板匹配
模板匹配与卷积原理很像,模板再原图像上从原点开始滑动,计算模板与图像被模板覆盖的地方的差别程度,这个差别程度的计算方式再opencv里有六种,然后将每次计算的结果放入一个矩阵里,作为结果输出。假如原图形是AB大小,而模板是ab大小,则输出结果的矩阵是(A-a+1)*(B-b+1)
六种计算方式:
cv2.TM_CCOEFF:计算相关系数,计算出来的值越大,越相关
cv2.TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关
cv2.TM_CCORR:计算相关性,计算出来的值越大,越相关
cv2.TM_CCORR_NORWED:计算归一化相关性,计算出来的值越接近1,越相关
cv2.TM_SQDIFF:计算平方不同,计算出来的值越小,越相关
cv2.TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关
# 模板匹配
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('image/Lena.png')
templates = cv2.imread('image/face.png')
cv2.imshow('Lena',img)
cv2.imshow('face',templates)
w = templates.shape[1]
h = templates.shape[0]
methods = ['cv2.TM_CCOEFF','cv2.TM_CCOEFF_NORMED','cv2.TM_CCORR','cv2.TM_CCORR_NORMED','cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED']
for meth in methods:
img1 = img.copy()
# 匹配方法的真值
method = eval(meth)
print(method)
res = cv2.matchTemplate(img, templates, method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# 如果是平方差匹配TM_SQDIFF获归一化平方差匹配TM_SQDIFF_NORMED,取最小值
if method in [cv2.TM_SQDIFF,cv2.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0]+w,top_left[1]+h)
cv2.rectangle(img1,top_left, bottom_right, 255, 2)
img1 = img1[:, :, [2, 1, 0]]
plt.subplot (121),plt.imshow(res,cmap='gray')
plt.xticks([]),plt.yticks([]) #隐藏坐标轴
plt.subplot(122), plt.imshow(img1, cmap='gray')
plt.xticks([]), plt.yticks([]) # 隐藏坐标轴
plt.suptitle(meth)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
原图
人脸部分
六种计算方法
cv2.TM_CCOEFF:
cv2.TM_CCOEFF_NORMED:
cv2.TM_CCORR:
cv2.TM_CCORR_NORWED:
cv2.TM_SQDIFF:
cv2.TM_SQDIFF_NORMED:
可以看到,有归一化过程的匹配效果均较好。
多对象匹配
img_rgb = cv2.imread('image/mario.jpg')
img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY)
template = cv2.imread('image/mario_coin.jpg',0)
h,w = template.shape[:2]
res = cv2.matchTemplate(img_gray,template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
# 取匹配程度大于80%的坐标
loc = np.where(res>=threshold)
for pt in zip(*loc[::-1]):
bottom_right = (pt[0]+w,pt[1]+h)
cv2.rectangle(img_rgb,pt,bottom_right, (0,0,255),2)
cv2.imshow('img_rgb',img_rgb )
受背景颜色的影响,匹配效果并不好。(其他两种计算方式效果更不好)