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

Manav Narula 2023年1月30日
  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