2012-03-14 16 views
6

Próbuję znaleźć obraz w innym.Jak korzystać z 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 

Po uruchomieniu tego, wszystko jest w porządku, nie są zgłaszane żadne błędy. Ale nie jestem pewien, co robić od tego miejsca. Dokument mówi, że result przechowuje "mapę wyników porównania". Próbowałem go wydrukować, ale daje mi szerokość, wysokość i krok.

Jak korzystać z tych informacji, aby dowiedzieć się, czy jeden obraz znajduje się w innym miejscu lub gdzie się znajduje?

+1

Tak więc nie walczcie z OpenCV tak bardzo, spróbuj SimpleCV. Jest to otok wokół modułów OpenCV, który sprawia, że ​​są łatwe w użyciu: http://simplecv.org/ – Blender

Odpowiedz

7

MatchTemplate zwraca mapę podobieństwa, a nie lokalizację. Możesz następnie użyć tej mapy, aby znaleźć lokalizację.

Jeśli szukasz tylko jednym meczu można zrobić coś takiego, aby uzyskać lokalizację:

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

Następnie minLoc ma lokalizację najlepszego dopasowania i minVal opisuje, jak dobrze pasuje do szablonu. Musisz określić próg dla minVal, aby określić, czy uważasz ten wynik za zgodny, czy nie.

Jeśli szukasz więcej niż jednego dopasowania na obraz, musisz użyć algorytmów takich jak nie-maksymalne tłumienie.

+0

Więc jeśli używałem metody, która rejestruje najlepszy mecz w maxLoc, to patrzyłbym na maxVal? – bakalolo

4

To może działać dla Ciebie! :)

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 to tylko jeden z wielu metoeds porównania. Zobacz: http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html , aby uzyskać pełną listę.

Nie jestem pewien, czy to najlepsza metoda, ale jest szybka i działa dobrze dla mnie! :)