在 Python 中使用 OpenCV 进行模板匹配

Manav Narula 2024年2月15日
  1. 使用 matchTemplate() 函数在 Python 中使用 OpenCV 执行模板匹配
  2. 结论
在 Python 中使用 OpenCV 进行模板匹配

Python 中的 opencv 库实现了许多技术和算法。我们可以使用这个库执行各种计算机视觉和 AI 任务。

这个库的一个这样的特性是模板匹配。

让我们详细讨论这种技术。模板匹配是指检查图像的一小部分是否是另一个图像的一部分。

这小部分(也称为模板)在图像上水平和垂直移动,以找到模板最可能的位置。使用 opencv 进行模板匹配具有许多实际应用,尤其是对象检测。

本教程将演示如何在 Python 中使用 opencv 执行模板匹配。

使用 matchTemplate() 函数在 Python 中使用 OpenCV 执行模板匹配

matchTemplate() 函数可用于查找给定模板在图像中的位置。我们可以将两个图像都传递给这个函数,它会在两个方向上滑动模板以找到最佳匹配位置。

计算每个位置的像素密度,密度最高的(亮像素)是最可能匹配的。matchTemplate() 使用多种方法,并使用 method 参数指定。

总共有六个:TM_CCOEFFTM_CCOEFF_NORMEDTM_CCORRTM_CCORR_NORMEDTM_SQDIFFTM_SQDIFF_NORMED

请注意,TM_CCORR 由于其结果不准确,因此不被认为是一个好的选择。要记住的另一件事是,对于 TM_SQDIFFTM_SQDIFF_NORMED 方法,我们选择最小值。

这将通过下面的示例变得清楚。

现在我们已经详细讨论了这个函数,让我们观察一个工作示例。模板和全图如下所示,后面是代码和结果。

图片:

处理图像

模板:

处理模板

import cv2

i = cv2.imread("deftstack.png")
img = cv2.cvtColor(i, cv2.COLOR_BGR2GRAY)
temp = cv2.imread("temp.png", 0)
width, height = temp.shape[::-1]

result = cv2.matchTemplate(img, temp, cv2.TM_CCOEFF)
val_min, val_max, min_loc, max_loc = cv2.minMaxLoc(result)
t_left = max_loc
b_right = (t_left[0] + width, t_left[1] + height)

cv2.rectangle(i, t_left, b_right, 255, 2)
cv2.imshow("Output", i)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

在 Python TM_CCOEFF 中使用 opencv 进行模板匹配

现在让我们详细讨论代码。我们首先阅读所需的图像。

我们使用 cvtColor() 函数将此图像转换为灰度,以将图像转换为所需的颜色空间。黑白图像可提供最佳效果。

我们将模板和图像与 TM_CCOEFF 方法一起传递给 matchTemplate() 函数。

这将返回一个 numpy 数组。我们需要这个数组中的一组值来找到坐标。

minMaxLoc() 函数查找数组的最小值和最大值及其索引。我们使用最大值的位置来计算最佳匹配坐标。

我们使用 rectangle() 函数在匹配的部分上绘制一个矩形。然后图像与结果一起显示。

waitKey()destroyAllWindows() 函数防止输出窗口自动关闭并等待一些用户输入。

正如所讨论的,我们可以类似地在 matchTemplate() 函数中使用其他讨论的方法。唯一的区别与 TM_SQDIFFTM_SQDIFF_NORMED 方法相关。

我们可以通过对我们的代码稍作调整来使用它们。请参阅以下示例。

import cv2

i = cv2.imread("deftstack.png")
img = cv2.cvtColor(i, cv2.COLOR_BGR2GRAY)
temp = cv2.imread("temp.png", 0)
width, height = temp.shape[::-1]

result = cv2.matchTemplate(img, temp, cv2.TM_SQDIFF)
val_min, val_max, min_loc, max_loc = cv2.minMaxLoc(result)
t_left = min_loc
b_right = (t_left[0] + width, t_left[1] + height)

cv2.rectangle(i, t_left, b_right, 255, 2)
cv2.imshow("Output", i)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

在 python TM_SQDIFF 中使用 opencv 进行模板匹配

上面的例子表明我们使用最小值索引来计算模板坐标。其余代码保持不变。

结论

本教程演示了在 Python 中使用 opencv 的模板匹配技术。我们讨论了模板匹配的基础知识和实现该技术的 opencv 库中的函数。

我们还讨论了与该函数相关的几种方法。我们看到了一个使用这个函数和其他几个函数的该技术的实际工作例子。

通过强调每一行的目的进行了详细讨论。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn