OpenCV初尝试10——模板匹配

10 模板匹配

模板匹配:就是在给定的图片中查找和模板最相似的区域,该算法输入模板和查找的图片,模板在原图像上从原点开始滑动(从左往右,从上到下),计算模板与图像被模板覆盖的地方的差别程度(这个差别程度的计算方法在OpenCV里有6种),然后将每次计算的结果放进一个矩阵里,作为结果输出。假如原图形是AB大小,而模板是ab大小,则输出结果的矩阵是(A-a+1)*(B-b+1)。

  • cv2.matchTemplate(img, template, method)
  • 参数分别为:要进行模板匹配的图像,模板和实现模板匹配的算法。
  • cv2.minMaxLoc(src, mask=None)
  • 返回4个值:最小值,最大值,最小值位置,最大值位置
参数值 对应数值 说明
cv2.TM_SQDIFF 0 以差方依据进行匹配,若完全匹配,则结果为0,即计算出来的值越小,越相关
cv2.TM_SQDIFF_NORMAL 1 标准(归一化)平方差匹配,计算出来的值越接近0,越相关
cv2.TM_CCORR 2 相关匹配,将模板图像与输入图像相乘,计算的结果越大,越相关
cv2.TM_CCORR_NORMAL 3 标准(归一化)相关匹配
cv2.TM_CCOEFF 4 相关系数匹配,将模板图像与其均值相对值和输入图像与其均值相对值进行匹配,计算的结果越接近1,越相关
cv2.TM_CCOEFF_NORMAL 5 标准(归一化)相关系数匹配

使用时,尽量使用归一化的方法。

  • 完成匹配后,使用cv.minMaxLoc()方法查到最佳匹配位置即可。

10.1 单个对象的模板匹配

import cv2
import numpy as np

if __name__ == '__main__':
    img = cv2.imread('./img.jpeg', 0)
    template = cv2.imread('./img1.jpeg', 0)
    # 获取模板的高, 宽
    h, w = template.shape[:2]

    # 模板匹配
    res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)
    # 获取位置
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    # 绘制矩形
    # 我使用的方法最小值时,为最佳匹配位置
    top_left = min_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)

    cv2.rectangle(img, top_left, bottom_right, (0, 255, 0), 2)
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

执行效果展示:
输入图片:
OpenCV初尝试10——模板匹配_第1张图片
模板:
OpenCV初尝试10——模板匹配_第2张图片

执行结果:
OpenCV初尝试10——模板匹配_第3张图片

10.2 多个对象的模板匹配

比如我们要去匹配马里奥的金币,我不高兴去找图片了,有兴趣的可以去找找做一做这个匹配。

import cv2
import numpy as np

if __name__ == '__main__':
    img = cv2.imread('./mario.jpg', 0)
    template = cv2.imread('./mario_coin.jpeg', 0)
    # 获取模板的高, 宽
    h, w = template.shape[:2]

    # 模板匹配
    res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORAML)
    # 设置一个阈值,大于该阈值的我们都将它画出来
	threshold = 0.8
	# 找到所有符合条件的位置
   	loc = np.where(res >= threshold)
   	for pt in zip(*loc[::-1]):   	
    	bottom_right = (pt[0] + w, pt[1] + h)
    	cv2.rectangle(img, pt, bottom_right, (0, 0, 255), 2)
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

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