美妝網(wǎng)站開(kāi)發(fā)背景整合網(wǎng)絡(luò)營(yíng)銷外包
原理及介紹
????????模板匹配是一種常用的圖像處理技術(shù),它用于在一幅圖像中尋找與給定模板最匹配的區(qū)域(在一副大圖中搜尋查找模版圖像位置的方法)。模板匹配的基本思想是將模板圖像在目標(biāo)圖像上滑動(dòng),并計(jì)算它們的相似度,找到相似度最高的位置即為匹配位置。
OpenCV中的模板匹配
cv2.matchTemplate()
函數(shù)是OpenCV中用于模板匹配的函數(shù)。它的語(yǔ)法如下:
cv2.matchTemplate(image, template, method, result=None, mask=None)
參數(shù)說(shuō)明:
image
:目標(biāo)圖像,即待搜索的圖像。template
:模板圖像,即待匹配的圖像。method
:匹配方法,可以是以下幾種方法之一:cv2.TM_SQDIFF
:平方差匹配法。cv2.TM_SQDIFF_NORMED
:歸一化平方差匹配法。cv2.TM_CCORR
:相關(guān)匹配法。cv2.TM_CCORR_NORMED
:歸一化相關(guān)匹配法。cv2.TM_CCOEFF
:相關(guān)系數(shù)匹配法。cv2.TM_CCOEFF_NORMED
:歸一化相關(guān)系數(shù)匹配法。
result
:可選參數(shù),用于存儲(chǔ)匹配結(jié)果的數(shù)組。mask
:可選參數(shù),用于指定感興趣區(qū)域的掩碼。
算法步驟:
1.加載目標(biāo)圖像和模板圖像。
2.將模板圖像在目標(biāo)圖像上滑動(dòng),計(jì)算每個(gè)位置的相似度。
3.找到相似度最高的位置即為匹配位置。
具體實(shí)現(xiàn)方法如下(使用Python的OpenCV庫(kù)):
import cv2
import numpy as np# 加載目標(biāo)圖像和模板圖像
target_img = cv2.imread('target.jpg')
template_img = cv2.imread('template.jpg')# 獲取目標(biāo)圖像和模板圖像的寬高
target_h, target_w = target_img.shape[:2]
template_h, template_w = template_img.shape[:2]# 使用平方差匹配算法
result = cv2.matchTemplate(target_img, template_img, cv2.TM_SQDIFF)# 獲取最匹配的位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
top_left = min_loc
bottom_right = (top_left[0] + template_w, top_left[1] + template_h)# 在目標(biāo)圖像上繪制矩形框
cv2.rectangle(target_img, top_left, bottom_right, (0, 255, 0), 2)# 顯示結(jié)果圖像
cv2.imshow('Result', target_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上述代碼中,我們首先加載了目標(biāo)圖像和模板圖像,然后使用cv2.matchTemplate()
函數(shù)進(jìn)行模板匹配,得到匹配結(jié)果。最后,通過(guò)cv2.minMaxLoc()
函數(shù)找到最匹配的位置,并在目標(biāo)圖像上繪制矩形框來(lái)表示匹配位置。
需要注意的是,模板匹配算法的結(jié)果可能受到光照、尺度、旋轉(zhuǎn)等因素的影響。因此,在實(shí)際應(yīng)用中,可能需要對(duì)圖像進(jìn)行預(yù)處理或使用其他更復(fù)雜的匹配算法來(lái)提高匹配的準(zhǔn)確性。
cv2.matchTemplate()
函數(shù)會(huì)在目標(biāo)圖像中搜索與模板圖像相似的區(qū)域,并返回一個(gè)匹配結(jié)果矩陣。匹配結(jié)果矩陣的每個(gè)元素表示該位置與模板的匹配程度,值越小表示匹配程度越高。在使用
cv2.matchTemplate()
函數(shù)時(shí),需要根據(jù)具體的需求選擇合適的匹配方法。常用的是平方差匹配法和相關(guān)系數(shù)匹配法。平方差匹配法適用于目標(biāo)圖像與模板圖像具有明顯的區(qū)別,相關(guān)系數(shù)匹配法適用于目標(biāo)圖像與模板圖像具有相似的特征。在使用匹配結(jié)果進(jìn)行進(jìn)一步處理時(shí),可以通過(guò)設(shè)置匹配閾值來(lái)篩選出符合要求的匹配位置。只有匹配結(jié)果低于閾值的位置才會(huì)被認(rèn)為是匹配的位置。
需要注意的是,
cv2.matchTemplate()
函數(shù)只能進(jìn)行單對(duì)象模板匹配,如果需要進(jìn)行多對(duì)象模板匹配,可以在匹配結(jié)果中進(jìn)行進(jìn)一步處理,例如使用非極大值抑制來(lái)消除重疊的匹配結(jié)果。
使用不同的匹配方法或得到不一樣的匹配結(jié)果:
cv2.TM_CCOEFF:
cv2.TM_CCOEFF_NORMED:?
cv2.TM_CCORR:?
cv2.TM_CCORR_NORMED:?
cv2.TM_SQDIFF:?
cv2.TM_SQDIFF_NORMED:?
多對(duì)象模板匹配?
????????多對(duì)象模板匹配是在一幅圖像中尋找多個(gè)目標(biāo)對(duì)象的位置。在前面的講解中,我們?cè)趫D片中搜素梅西的臉而且梅西只在圖片中出現(xiàn)了一次,算法很好地完成了匹配。但是,假如你的目標(biāo)對(duì)象在圖像中出現(xiàn)了很多次要怎么辦呢?函數(shù)cv2.imMaxLoc() 只會(huì)給出最大值和最小值。此時(shí),我們就需要使用閾值了。在下面的例子中我們要在經(jīng)典的游戲Mario 的一張截屏圖片中找到其中的硬幣。
import cv2
import numpy as np# 加載目標(biāo)圖像和模板圖像
target_img = cv2.imread('target.jpg')
template_img = cv2.imread('template.jpg')# 獲取目標(biāo)圖像和模板圖像的寬高
target_h, target_w = target_img.shape[:2]
template_h, template_w = template_img.shape[:2]# 使用平方差匹配算法,也可以轉(zhuǎn)成灰度圖像進(jìn)行比對(duì)
result = cv2.matchTemplate(target_img, template_img, cv2.TM_SQDIFF)# 設(shè)置匹配閾值
threshold = 0.9# 找到匹配結(jié)果中超過(guò)閾值的位置
locations = np.where(result <= threshold)
locations = list(zip(*locations[::-1]))# 在目標(biāo)圖像上繪制矩形框
for loc in locations:top_left = locbottom_right = (top_left[0] + template_w, top_left[1] + template_h)cv2.rectangle(target_img, top_left, bottom_right, (0, 255, 0), 2)# 顯示結(jié)果圖像
cv2.imshow('Result', target_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上述代碼中,我們首先加載了目標(biāo)圖像和模板圖像,然后使用cv2.matchTemplate()
函數(shù)進(jìn)行模板匹配,得到匹配結(jié)果。然后,我們?cè)O(shè)置了一個(gè)匹配閾值,只有匹配結(jié)果低于該閾值的位置才會(huì)被認(rèn)為是匹配的位置。最后,我們?cè)谀繕?biāo)圖像上繪制矩形框來(lái)表示匹配位置。需要注意的是,多對(duì)象模板匹配可能存在重疊的情況,因此在實(shí)際應(yīng)用中,可能需要進(jìn)行進(jìn)一步的處理來(lái)區(qū)分不同的目標(biāo)對(duì)象。
效果如下: