南海佛山網(wǎng)站建設(shè)百度廣告代理公司
import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline
模版匹配
- 模版匹配和卷積原理很像,模版在原圖像上從原點開始滑動,計算模版與(圖像被模版覆蓋的地方)的差別層度,這個差別成都的計算方法在opencv里有6種,然后將每次計算的結(jié)果放入一個矩陣?yán)?#xff0c;作為結(jié)果輸出。假如原圖案是A×B大小,而模版是a×b大小,則輸出結(jié)果的矩陣是(A-a+1)×(B-b+1)
?face.jpg
lena.jpg
#模版匹配
img = cv2.imread('lena.jpg',0)
template = cv2.imread('face.jpg',0)
h,w = template.shape[:2]
?查看相關(guān)參數(shù):
img.shape
template.shape
- TM_SQDIFF : 計算平方不同,計算出來的值越小,越相關(guān)
- TM_COORR :計算相關(guān)性,計算出來的值越大,越相關(guān)
- TM_CCOEFF : 計算相關(guān)系統(tǒng),計算出來的值越大,越相關(guān)
- TM_SQDIFF_NORMED :計算歸一化平方不同,計算出來的值越接近0,越相關(guān)
- TM_CCORR_NORMED: 計算歸一化相關(guān)性,計算出來的值越接近1,越相關(guān)
- TM_CCOEFF_NORMED : 計算歸一化相關(guān)系數(shù),計算出來的值越接近1,越相關(guān)
methods = ['cv2.TM_CCOEFF','cv2.TM_CCOEFF_NORMED','cv2.TM_CCORR','cv2.TM_CCORR_NORMED','cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED']res = cv2.matchTemplate(img,template,cv2.TM_SQDIFF)
res.shapemin_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)min_valmax_valmin_locmax_loc
?
for meth in methods:img2 = img.copy()#匹配方法的真值method = eval(meth)print (method)res = cv2.matchTemplate(img,template,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_locelse:top_left = max_locbottom_right = (top_left[0]+w,top_left[1]+h)#畫矩形cv2.rectangle(img2,top_left,bottom_right,255,2)plt.subplot(121),plt.imshow(res,cmap='gray')plt.xticks([]),plt.yticks([]) #隱藏坐標(biāo)軸plt.subplot(122),plt.imshow(img2,cmap = 'gray')plt.xticks([]),plt.yticks([])plt.suptitle(meth)plt.show()
運行出的結(jié)果
匹配多個目標(biāo)對象
?mario_coin.jpg
mario.jpg
img_rgb = cv2.imread('mario.jpg')
img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.jpg',0)
h,w = template.shape[:2]res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
#匹配成都大于%80 的坐標(biāo)
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]): #*號表示可選參數(shù)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)
cv2.waitKey(0)
運行結(jié)果: