Python-OpenCV之模板匹配

簡介

模板匹配:模板匹配和卷積原理很像,模板在原圖像上從原點開始滑動,計算模板與當前圖形被模板覆蓋的地方的差別程度,然後將每次計算的結果放入一個矩陣,作爲結果輸出。假如原圖形是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)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章