2012-03-14 17 views
6

Estoy intentando encontrar una imagen en otra.¿Cómo uso 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 

Cuando ejecuto esto, todo se ejecuta perfectamente, no se generan errores. Pero no estoy seguro de qué hacer aquí. El documento dice que result almacena "Un mapa de resultados de comparación". Intenté imprimirlo, pero me da ancho, alto y paso.

¿Cómo uso esta información para encontrar si una imagen está en otra/dónde se encuentra?

+1

Para que no tenga tanto problema con OpenCV, pruebe SimpleCV. Es una envoltura alrededor de los módulos OpenCV que los hace fáciles de usar: http://simplecv.org/ – Blender

Respuesta

7

MatchTemplate devuelve un mapa de similitud y no una ubicación. A continuación, puede usar este mapa para buscar una ubicación.

Si sólo está buscando un único partido que podría hacer algo como esto para conseguir una ubicación:

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

Entonces minLoc tiene la ubicación de la mejor opción y minVal describe qué tan bien se ajusta a la plantilla. Debe establecer un umbral para minVal para determinar si considera que este resultado es igual o no.

Si busca más de una coincidencia por imagen, necesita utilizar algoritmos como la supresión no máxima.

+0

Entonces, si estuviera usando un método que registra la mejor coincidencia en maxLoc, ¿miraría maxVal? – bakalolo

4

Esto podría funcionar para usted! :)

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 es una de las tantas comparaciones entre métodos. Ver: http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html para la lista completa.

No estoy seguro de si este es el mejor método, pero es rápido y funciona muy bien para mí. :)