OpenCV-入门笔记:模板匹配(cv2.matchTemplate() )

1. 定义:

模板就是一副已知的小图像,而模板匹配就是在一副大图像中搜寻目标,已知该图中有要找的目标,且该目标同模板有相同的尺寸、方向和图像元素,通过一定的算法可以在图中找到目标
OpenCV-入门笔记:模板匹配(cv2.matchTemplate() )_第1张图片

2. 模板匹配方法:

  • cv2.TM_CCOEFF (系数匹配法)
  • cv2.TM_CCOEFF_NORMED(相关系数匹配法)
  • cv2.TM_CCORR (相关匹配法)
  • cv2.TM_CCORR_NORMED (归一化相关匹配法)
  • cv2.TM_SQDIFF (平方差匹配法)
  • cv2.TM_SQDIFF_NORMED (归一化平方差匹配法)

3. 代码:

		- 针对模板只出现一次(eg:梅西的脸)
		-  可以用cv2.minMaxLoc()函数
import numpy as np
import cv2 as cv
img = cv.imread("messi5.jpg")
img_gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
template = cv.imread("messi_face.jpg",0)

w,h = template.shape[::-1]
res = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
top_left = max_loc 
 # (如果模板方法是平方差或者归一化平方差,要用min_loc)
bottom_right = (top_left[0] + w,top_left[1] + h)
cv.rectangle(img,top_left,bottom_right,255,2)


cv.imshow("image",img)
cv.imshow("template",template)
cv.waitKey(0)
cv.destroyAllWindows()

OpenCV-入门笔记:模板匹配(cv2.matchTemplate() )_第2张图片

	- 针对模板重复出现(eg:超级玛丽 -金币)
	-  需要定义 threshold
img = cv.imread("messi5.jpg")
img_gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
template = cv.imread("messi_face.jpg",0)

w,h = template.shape[::-1]
res = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED)

threshold = 0.8
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):
     cv.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)

cv.imshow("image",img)
cv.imshow("template",template)
cv.waitKey(0)
cv.destroyAllWindows()

OpenCV-入门笔记:模板匹配(cv2.matchTemplate() )_第3张图片

# 第二种方法的方框要粗一点,因为我们定义的threshold为0.8,(只针对代码中cv.TM_CCOEFF_NORMED匹配方法)
loc检测出有9个点,相当于画了三次框,所以要粗一点
(我自己理解的,欢迎兄弟姐妹帮我矫正啊~谢谢~)

真的建议大家跟着官方文档学习~

你可能感兴趣的:(opencv,cv,python)