matchTemplate 是 OpenCV 中用于模板匹配的函数。它通过滑动模板图像在输入图像上进行比较,计算每个位置的匹配程度,并返回一个结果矩阵。理解这个结果矩阵以及如何找到最佳匹配位置是使用 matchTemplate 的关键。
matchTemplate 函数的基本用法result = cv2.matchTemplate(image, template, method)
image: 输入图像,通常是较大的图像。template: 模板图像,通常是要在输入图像中查找的小图像。method: 匹配方法,常用的有 cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED, cv2.TM_CCORR, cv2.TM_CCORR_NORMED, cv2.TM_CCOEFF, cv2.TM_CCOEFF_NORMED。resultmatchTemplate 返回一个结果矩阵(result),其大小是 (W - w + 1) x (H - h + 1),其中 W 和 H 是输入图像的宽度和高度,w 和 h 是模板图像的宽度和高度。
cv2.TM_SQDIFF 和 cv2.TM_SQDIFF_NORMED 方法,结果矩阵中的最小值表示最佳匹配位置。cv2.TM_CCORR, cv2.TM_CCORR_NORMED, cv2.TM_CCOEFF, 和 cv2.TM_CCOEFF_NORMED 方法,结果矩阵中的最大值表示最佳匹配位置。可以使用 cv2.minMaxLoc 函数来找到结果矩阵中的最小值和最大值的位置。
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
min_val 和 max_val 分别是结果矩阵中的最小值和最大值。min_loc 和 max_loc 分别是最小值和最大值的位置(即最佳匹配位置的左上角坐标)。cv2.TM_SQDIFF 或 cv2.TM_SQDIFF_NORMED,最佳匹配位置是 min_loc。cv2.TM_CCORR, cv2.TM_CCORR_NORMED, cv2.TM_CCOEFF, 或 cv2.TM_CCOEFF_NORMED,最佳匹配位置是 max_loc。import cv2
import numpy as np
# 读取输入图像和模板图像
image = cv2.imread('input_image.jpg', 0)
template = cv2.imread('template_image.jpg', 0)
# 获取模板图像的尺寸
w, h = template.shape[::-1]
# 使用 matchTemplate 进行模板匹配
result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
# 找到最佳匹配位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
# 最佳匹配位置是 max_loc
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
# 在输入图像上绘制矩形框
cv2.rectangle(image, top_left, bottom_right, 255, 2)
# 显示结果
cv2.imshow('Matched Result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
matchTemplate 返回的结果矩阵表示每个位置的匹配程度。cv2.minMaxLoc 可以找到最佳匹配位置。通过理解这些概念,你可以在图像中找到模板的最佳匹配位置,并在图像上标注出来。