2012-03-14 89 views
6

我試圖在另一個圖像中找到圖像。如何使用OpenCV MatchTemplate?

im = cv.LoadImage('1.png', cv.CV_LOAD_IMAGE_UNCHANGED) 
    tmp = cv.LoadImage('e1.png', cv.CV_LOAD_IMAGE_UNCHANGED) 
    w,h = cv.GetSize(im) 
    W,H = cv.GetSize(tmp) 
    width = w-W+1 
    height = h-H+1 
    result = cv.CreateImage((width, height), 32, 1) 
    cv.MatchTemplate(im, tmp, result, cv.CV_TM_SQDIFF) 
    print result 

當我運行它,一切都執行得很好,沒有任何錯誤拋出。但我不確定要從這裏做什麼。該文件說result存儲「比較結果的地圖」。我試過打印它,但它給了我寬度,高度和一步。

如何使用此信息來查找一張圖片是否位於另一張圖片/它所在的位置?

+1

所以你不要與OpenCV一樣掙扎,試試SimpleCV。它是OpenCV模塊的一個包裝,使它們易於使用:http://simplecv.org/ – Blender 2012-03-14 20:21:53

回答

7

MatchTemplate返回相似度圖而不是位置。 然後,您可以使用此地圖查找位置。

如果你只是在尋找一個匹配,你可以做這樣的事情來獲得一個位置:

minVal,maxVal,minLoc,maxLoc = cv.MinMaxLoc(result) 

然後minLoc最匹配的位置和minVal描述了模板如何適合。您需要提供minVal的閾值,以確定您是否認爲該結果匹配。

如果您正在尋找每個圖像的多個匹配項,您需要使用非最大抑制等算法。

+0

因此,如果我使用的是記錄maxLoc中最佳匹配的方法,我會查看maxVal? – bakalolo 2016-04-22 23:42:04

4

這可能適合你! :)

def FindSubImage(im1, im2): 
    needle = cv2.imread(im1) 
    haystack = cv2.imread(im2) 

    result = cv2.matchTemplate(needle,haystack,cv2.TM_CCOEFF_NORMED) 
    y,x = np.unravel_index(result.argmax(), result.shape) 
    return x,y 

CCOEFF_NORMED只是許多比較方法之一。 查看:http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html 查看完整列表。

不知道這是否是最好的方法,但速度很快,對我來說工作得很好! :)

相關問題