簡介
模板匹配:模板匹配和卷積原理很像,模板在原圖像上從原點開始滑動,計算模板與當前圖形被模板覆蓋的地方的差別程度,然後將每次計算的結果放入一個矩陣,作爲結果輸出。假如原圖形是A*B大小,而模板是a*b大小,則輸出結果的矩陣是(A-a+1)*(B-b+1)
計算模板和圖像差別程度的六種方法
1.TM_SQDIFF:計算平方不同,計算出來的值越小,越相關
2.TM_CCORR:計算相關性,計算出來的值越大,越相關
3. TM_CCOEFF:計算相關係數,計算出來的值越大,越相關
4.TM_SQDIFF_NORMED:計算歸一化平方不同,計算出來的值越接近0,越相關
5.TM_CCORR_NORMED:計算歸一化相關性,計算出來的值越接近1,越相關
6.TM_CCOEFF_NORMED:計算歸一化相關係數,計算出來的值越接近1,越相關
OpenCV函數模型
cv.matchTemplate(image,template,method)
參數解釋
image | 用於搜索的輸入圖像 |
template | 用於匹配的模板 |
method |
用於比較的方法,可選以下六種 TM_SQDIFF:計算平方不同,計算出來的值越小,越相關 TM_CCORR:計算相關性,計算出來的值越大,越相關 TM_CCOEFF:計算相關係數,計算出來的值越大,越相關 TM_SQDIFF_NORMED:計算歸一化平方不同,計算出來的值越接近0,越相關 TM_CCORR_NORMED:計算歸一化相關性,計算出來的值越接近1,越相關 TM_CCOEFF_NORMED:計算歸一化相關係數,計算出來的值越接近1,越相關 |
返回值
返回值爲一個二維數組,是原圖像各區域與模板的匹配值
經常配套使用的函數
獲取最佳匹配區域的位置
cv.minMaxLoc(res)
返回cv.matchTemplate函數返回值中的最大值,最小值,最大值對應區域左上角座標,最小值對應區域左上角座標
注:res爲cv.matchTemplate函數的返回值
將最佳匹配區域用矩形圈出
cv.rectangle(img2, top_left, bottom_right, 255, 2)
關於該函數的具體信息可參考python-OpenCV之輪廓的查找,繪製,特徵,近似,外接矩形中關於外接矩形的內容。
代碼示例
import cv2 as cv
img = cv.imread('lena.jpg', 0)
template = cv.imread('lenaface.jpg', 0)
h, w = template.shape[:2]
methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED', 'cv.TM_CCORR', 'cv.TM_CCORR_NORMED', 'cv.TM_SQDIFF',
'cv.TM_SQDIFF_NORMED']
for meth in methods:
img2 = img.copy()
# 匹配方法在methods數組中的的序號
method = eval(meth)
res = cv.matchTemplate(img, template, method)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
# 如果是平方差匹配TM_SQDIFF或歸一化平方差匹配TM_SQDIFF_NORMED,取最小值
if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
# 畫矩形
cv.rectangle(img2, top_left, bottom_right, 255, 2)
# 顯示出來
cv.imshow(meth + str('_rec'), img2)
cv.waitKey()
cv.destroyAllWindows()
模板匹配的直接結果(res)與添加矩形後的效果(img2)