sábado, 4 de junio de 2016

Template matching es una técnica utilizada para buscar áreas de una imagen que concuerden con otra imagen más pequeña (template), buscamos una región en la imagen más grande que se parezca o sea igual a la imagen más pequeña, en OpenCV esta tarea la realiza la función cv::matchTemplate() la cual se implementa con distintos métodos de comparación.

Si la imagen fuente tiene la dimensión (W, H) y la imagen template (w, h) el tamaño de la imagen resultado será: (W – w + 1, H – h + 1), esta imagen será a escala de grises, utilizamos la función cv::minMaxLoc() para obtener los valores máximos y mínimos, esta función nos devuelve también la posición de dichos valores.

Preparar el cv::Mat result para guardar el resultado de la operación.

// obtener las dimensiones para el cv::Mat resultado
int result_cols = img_src.cols - templ.cols + 1;
int result_rows = img_src.rows - templ.rows + 1;

Mat result(result_rows, result_cols, CV_32FC1);

Aplicar match template, indicamos la imagen fuente (img_src), la imagen template (templ), el cv::Mat donde se almacenará el resultado (result) y el método utilizado (match_mode).

cv::TemplateMatchModes match_mode = cv::TemplateMatchModes::TM_CCOEFF_NORMED;

// aplicar match template y normalizar el resultado.
matchTemplate(img_src, templ, result, match_mode);
normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());

Usamos minMaxLoc para determinar los valores máximos y mínimos junto con la posición de los mismos, en algunos métodos los resultados se guardan en los valores mínimos.  

// obtener max y min junto con sus ubicaciones
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());

if (match_mode == TM_SQDIFF || match_mode == TM_SQDIFF_NORMED)
    matchLoc = minLoc;
else
    matchLoc = maxLoc;

Para finalizar dibujamos un rectángulo ubicado en el área encontrada por la función minMaxLoc, el código es el siguiente:

// dibujar el rectangulo en la posicion encontrada
rectangle(img_src, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 255, 0), 2, CV_AA, 0);

// mostrar las imagenes
imshow(result_window, result);
imshow(image_window, img_src);

Ejecutando el código con las siguientes imágenes, la imagen pequeña en la parte superior izquierda es la deseamos localizar: 

match template
Resultados obtenidos por la función cv::matchTemplate() usada con el siguiente match mode TM_CCOEFF_NORMED:

opencv template matching
La función cv::minMaxLoc busca el punto de interés y su ubicación, el máximo.

Al usar el modo de comparación cv::TemplateMatchModes::TM_SQDIFF_NORMED o cv::TemplateMatchModes::TM_SQDIFF nos interesa el punto mínimo, el contrario de los demás modos.

opencv minmaxloc
Descargar el proyecto completo en GitHub: OpenCV Template Matching
Ver Categoria:

0 comentarios :

Publicar un comentario en la entrada