# 使用模板匹配查找图像
# 1、准备待匹配的图像和模板：首先准备一张待匹配的图像，以及一个要查找的目标模板图像。确保模板图像大小与待匹配图像中目标的预期大小相匹配。
# 2、选择合适的匹配方法：根据需求选择合适的匹配方法，常见的包括平方差匹配法、相关性匹配法和归一化互相关匹配法。
# 3、对待匹配图像和模板进行预处理（可选）：根据需要，可以对待匹配图像和模板进行预处理，例如将彩色图像转换为灰度图像，对图像进行平滑、直方图均衡化等。
# 4、在待匹配图像中执行模板匹配：使用选择的匹配方法，在待匹配图像中执行模板匹配操作。这需要将模板按照不同的位置在待匹配图像上滑动，并计算匹配度。
# 5、设置阈值和确定匹配位置：根据匹配度的结果，确定一个合适的阈值来判断匹配是否达到预期。如果匹配度超过阈值，可以认为找到了目标模板的位置。
# 6、可选：多目标匹配或后处理（可选）：如果需要在图像中多次匹配同一模板，可以重复步骤4和5。此外，还可以进行后处理操作，如非极大值抑制，去除重复匹配等。
# 7、可视化结果：最后，根据匹配结果，可以在待匹配图像上标注或绘制出目标模板的位置，以便观察和分析匹配效果。

import cv2

image = cv2.imread('image.png')
template = cv2.imread('template.jpg')
cv2.imshow('image', image)
cv2.imshow('template', template)

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray_template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)

method = cv2.TM_SQDIFF_NORMED

result = cv2.matchTemplate(gray_image, gray_template, method)

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

threshold = 0.1
if min_val < threshold:
    top_left = min_loc
    h, w = gray_template.shape
    bottom_right = (top_left[0] + w, top_left[1] + h)
    cv2.rectangle(image, top_left, bottom_right, (0, 255, 0), 2)

cv2.imshow('Matched Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
