OpenCV 中的模板匹配是一种图像处理技术,它可以在图像中查找与给定模板最匹配的区域。在 OpenCV 中,通常会使用 cv2.matchTemplate() 函数来实现模板匹配,其中绝对值差和是一种常用的匹配方法。
使用 cv2.matchTemplate() 函数的基本语法如下:
res = cv2.matchTemplate(image, templ, method)
其中,image 是输入图像,templ 是模板图像,method 是匹配方法。
以下是两个示例说明:
示例一:使用绝对值差和进行模板匹配
要使用绝对值差和进行模板匹配,可以使用以下代码:
import cv2
import numpy as np
# 读取图像和模板
img = cv2.imread('image.jpg')
template = cv2.imread('template.jpg')
# 获取模板的宽度和高度
w, h = template.shape[:-1]
# 进行绝对值差和匹配
res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF_NORMED)
# 获取匹配结果中最小值的位置
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, 0, 255), 2)
# 显示图像
cv2.imshow('image', img)
cv2.waitKey()
cv2.destroyAllWindows()
这将读取名为 image.jpg 的图像和名为 template.jpg 的模板图像,然后使用绝对值差和进行模板匹配。最终结果将在窗口中。
示例二:使用绝对值差和进行视频中的模板匹配
要使用绝对值差和进行视频中的模板匹配,可以以下代码:
import cv2
import numpy as np
# 打开视频
cap = cv2.VideoCapture('video.mp4')
# 读取模板
template = cv2.imread('template.jpg')
# 获取模板的宽度和高度
w, h = template.shape[:-1]
# 进行绝对值差和匹配
while cap.isOpened():
ret, frame = cap.read()
if ret:
res = cv2.matchTemplate(frame, template, cv2.TM_SQDIFF_NORMED)
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(frame, top_left, bottom_right, (0, 0, 255), 2)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
这将打开名为 video.mp4 的视频文件和名为 template.jpg 的模板图像,然后使用绝对值差和进行视频中的模板匹配。最终结果将在窗口中。