圖片旋轉、圖片鏡像相關教學:
(純新手教學)計算機視覺(opencv)實戰十三——圖片旋轉、圖片鏡像 的幾種常用方法-CSDN博客https://blog.csdn.net/2302_78022640/article/details/151356600?spm=1011.2415.3001.5331
模板與多個對象匹配
在計算機視覺中,模板匹配(Template Matching)是一種常見的圖像處理方法,能夠在大圖像中尋找與小模板相似的區域。很多時候,模板在目標圖像中可能不止出現一次,并且還可能存在旋轉的情況。因此,模板與多個對象的匹配技術就顯得非常重要。
下面的代碼演示了如何使用 OpenCV 進行模板匹配,并支持在目標圖像中同時查找多個方向的模板對象。
?核心函數:cv2.matchTemplate
OpenCV 提供了 cv2.matchTemplate
函數來實現模板匹配。
cv2.matchTemplate(image, templ, method, result=None, mask=None)
參數說明:
-
image:待搜索的圖像(通常比模板大)。
-
templ:模板圖像,需要在大圖中被搜索的目標。
-
method:匹配方法,用來衡量相似度。
-
result:存放匹配結果的矩陣,一般不用手動傳入,函數會自動生成。
-
mask:掩膜,可選參數,某些方法不支持。
常見匹配方法
模板匹配的效果依賴于所選擇的計算方式。OpenCV 提供了六種主要方法:
-
TM_SQDIFF(平方差匹配法)
-
使用平方差衡量誤差。
-
匹配越好,結果值越小。
-
-
TM_CCORR(相關匹配法)
-
采用乘法運算,計算圖像與模板的相關性。
-
數值越大表示匹配程度越高。
-
-
TM_CCOEFF(相關系數匹配法)
-
通過相關系數計算相似度,排除了亮度影響。
-
數值越大說明匹配效果越好。
-
-
TM_SQDIFF_NORMED(歸一化平方差匹配法)
-
與 TM_SQDIFF 類似,但結果被歸一化。
-
匹配越好,值越小。
-
-
TM_CCORR_NORMED(歸一化相關匹配法)
-
在 TM_CCORR 的基礎上進行歸一化,結果范圍更穩定。
-
數值越大,匹配越好。
-
-
TM_CCOEFF_NORMED(歸一化相關系數匹配法)
-
在 TM_CCOEFF 的基礎上進行歸一化,最常用的一種方法。
-
結果范圍通常在 -1 到 1 之間,越接近 1 匹配越好。
-
圖片準備:
arrow.jpg
arrows.jpg
運行結果圖:
代碼解析
import cv2
import numpy as npimg_rgb = cv2.imread('arrows.jpg')
cv2.imshow('img_gray', img_rgb)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)template1=cv2.imread('./arrow.jpg', flags=0)
# 旋轉 90 度,k=-1 表示順時針旋轉 90 度
template2 = np.rot90(template1, k=-1)
# 旋轉 90 度,k=1 表示逆時針旋轉 90 度
template3 = np.rot90(template1, k=1)
template4 = np.rot90(template1, k=2)
cv2.imshow('template1', template1)
cv2.imshow('template2', template2)
cv2.imshow('template3', template3)
cv2.imshow('template4', template4)
cv2.waitKey(0)templates=[template1,template2,template3,template4]for template in templates:h, w = template.shape[:2]# 使用模板匹配方法 cv2.matchTemplate 進行模板匹配res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)threshold = 0.9 # 設定匹配閾值# 獲取匹配結果中所有符合閾值的點的坐標loc = np.where(res >= threshold) # 符合條件的行,符合條件的列# print(loc)# 遍歷所有匹配點for pt in zip(*loc[::-1]):# 在原圖上繪制匹配區域的矩形框cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), color=(0, 0, 255), thickness=1)cv2.imshow('result', img_rgb)
cv2.waitKey(0)
核心步驟講解
-
讀取圖像并灰度化
-
使用
cv2.imread
讀取原始圖像arrows.jpg
,并轉換為灰度圖。 -
灰度圖可以減少計算量,同時保留了模板匹配所需的主要信息。
-
-
加載模板并進行旋轉
-
模板
arrow.jpg
作為基本形狀。 -
使用
np.rot90
對模板進行旋轉,生成 4 個方向的模板(0°、90°、180°、270°)。 -
這樣就能應對目標圖像中箭頭方向不一致的情況。
-
-
模板匹配
-
cv2.matchTemplate
用于計算模板與目標圖像各個位置的匹配程度。 -
選擇
cv2.TM_CCOEFF_NORMED
方法,該方法會輸出歸一化相關系數,值越接近 1 表示越相似。
-
-
匹配閾值設定
-
設置
threshold = 0.9
,即相似度大于等于 0.9 的區域才認為是有效匹配。 -
閾值過低可能引入誤檢,過高可能漏檢。
-
-
定位與繪制
-
np.where(res >= threshold)
找到所有符合條件的點。 -
使用
cv2.rectangle
在原圖img_rgb
上繪制矩形框,標記出匹配區域。
-
-
結果展示
-
使用
cv2.imshow
顯示最終帶有標記的圖像。
-
應用場景
-
目標檢測
在工廠生產線上檢測零件是否存在、方向是否正確。 -
游戲自動化
在屏幕截圖中查找某個按鈕或圖標的位置,實現自動點擊。 -
文檔處理
在掃描件中查找特定的標志或符號。 -
視頻監控
在實時視頻中檢測特定物體的出現與方向。
方法優缺點
-
優點
-
實現簡單,代碼量少。
-
適合已知模板的精確匹配任務。
-
可以通過旋轉模板來解決方向差異。
-
-
缺點
-
對尺度變化不敏感(如果模板大小與目標圖像中對象大小不同,效果不好)。
-
對光照、噪聲等變化敏感。
-
計算效率在大規模匹配時較低。
-
總結
通過這段代碼,可以看到如何使用 OpenCV 的模板匹配方法,結合旋轉操作,在圖像中查找多個方向的相同目標對象。該方法在簡單場景下效果顯著,尤其適合對象外形固定、尺寸不變的任務。