Opencv模板匹配学习

模板匹配:

一、单对象

模板匹配是一种用于在较大图像中搜索和查找模板图像位置的方法。为此,OpenCV带有一个函数cv.matchTemplate()。它只是将模板图像滑动到输入图像上(就像在2D卷积中一样),然后在模板图像下比较模板和输入图像的拼图。

如果输入图像的大小为(WxH),而模板图像的大小为(wxh),则输出图像的大小将为(W-w + 1,H-h + 1)。得到结果后,可以使用cv.minMaxLoc()函数查找最大/最小值在哪。将其作为矩形的左上角,并以(w,h)作为矩形的宽度和高度。该矩形是您模板的区域
如果使用cv.TM_SQDIFF作为比较方法,则最小值提供最佳匹配。
用到函数:
cv.matchTemplate(),cv.minMaxLoc()

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img = cv.imread("E:\\python opencv\\demo2\\wiki4.jpg", 0)
img2 = img.copy()
template = cv.imread("E:\\python opencv\\demo2\\wiki6.jpg", 0)
w, h = template.shape[::-1]

#六种方法比较
methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED', 'cv.TM_CCORR', 'cv.TM_CCORR_NORMED', 'cv.TM_SQDIFF', 'cv.TM_SQDIFF_NORMED']
for meth in methods:
    img = img2.copy()
    method = eval(meth)
    #应用模板匹配
    res = cv.matchTemplate(img, template, method)
    min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
    #如果方法是cv.TM_SQDIFF或cv.TM_SQDIFF_NORMED,则取最小值
    if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)
    cv.rectangle(img, top_left, bottom_right, 255, 2)
    plt.subplot(121), plt.imshow(res, cmap='gray')
    plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
    plt.subplot(122), plt.imshow(img, cmap='gray')
    plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
    plt.suptitle(meth)
    plt.show()

cv.destroyAllWindows()

Opencv模板匹配学习_第1张图片
Opencv模板匹配学习_第2张图片
Opencv模板匹配学习_第3张图片
Opencv模板匹配学习_第4张图片
Opencv模板匹配学习_第5张图片
Opencv模板匹配学习_第6张图片
第三种方法效果不太好

二、多对象

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img = cv.imread("E:\\python opencv\\demo2\\wiki7.png")
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('img', img)
template = cv.imread("E:\\python opencv\\demo2\\wiki8.png", 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('res', img)
cv.waitKey()
cv.destroyAllWindows()

Opencv模板匹配学习_第7张图片

你可能感兴趣的:(OpenCV学习之路)