1. 程式人生 > 其它 >Python - opencv (四) - 模板匹配

Python - opencv (四) - 模板匹配

模板匹配實現的思想也是很簡單很暴力的,就是拿著模板圖片在原圖中從左上至右下依次滑動,直到遇到某個區域的相似度低於我們設定的閾值,那麼我們就認為該區域與模板匹配了,也就是我們找到了姚明的位置,並把它標記出來。

opencv中提出6種模板匹配公式:

示例:

原影象:

匹配模板:

程式碼:

 1 import cv2
 2 import matplotlib.pyplot as plt
 3 
 4 methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR', 'cv2.TM_CCORR_NORMED
', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED'] 5 6 7 if __name__ == '__main__': 8 img = cv2.imread('../pics/5.jpg') 9 template = cv2.imread('../pics/5-part.jpg') 10 (w,h) = (template.shape[1], template.shape[0]) 11 count = 1 12 13 for meths in methods: 14 img2 = img.copy()
15 method = eval(meths) 16 print(meths) 17 res = cv2.matchTemplate(img, template, method) 18 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) 19 20 if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]: 21 top_left = min_loc 22 else: 23
top_left = max_loc 24 bottom_right = (top_left[0] + w, top_left[1] + h) 25 26 cv2.rectangle(img2, top_left, bottom_right, 255, 2) 27 28 plt.subplot(6,2,count), plt.imshow(res, cmap='gray') 29 plt.xticks([]), plt.yticks([]) # hide coordinate 30 plt.subplot(6,2,count+1), plt.imshow(img2, cmap='gray') 31 plt.xticks([]), plt.yticks([]) 32 count += 2 33 34 plt.show()

效果:

(從上到下依次為:'cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR', 'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED')

可以看到效果基本可以找到,但當模板的尺寸發生變形時,cv的模板匹配就很難找到了。