Opencv 使用绝对值差和进行模式匹配

  • Post category:Python

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 的模板图像,然后使用绝对值差和进行视频中的模板匹配。最终结果将在窗口中。