3.3 Buscando un objeto en una imagen

Bueno, ya vamos avanzando en otros sistemas de búsqueda, ahora vamos a buscar un objeto conocido (imagen) dentro de una imagen.

En realidad los objetos no son iguales nunca al 100 % tenemos que hacer comparativas, buscando cuanto se parece un objeto patrón.

 

Para ello existe una función que nos permite justamente esto.

Aquí tenemos  la función matchTemplate

 

C++: void matchTemplate(InputArray image, InputArray templ, OutputArray result, int method)
Parameters:
  • image – Image where the search is running. It must be 8-bit or 32-bit floating-point.
  • templ – Searched template. It must be not greater than the source image and have the same data type.
  • result – Map of comparison results. It must be single-channel 32-bit floating-point. If image is W \times H and templ is w \times h , then result is (W-w+1) \times (H-h+1) .
  • method – Parameter specifying the comparison method (see below).

Para identificar la imagen patrón lo que hacemos es lo siguiente

../../../../../_images/Template_Matching_Template_Theory_Sliding.jpg

Dentro de la imagen principal, se superpone la imagen a buscar y según el tipo de búsqueda se hace un tipo de operación u otro.

  1. method=CV_TM_SQDIFF

    R(x,y)= \sum _{x',y'} (T(x',y')-I(x+x',y+y'))^2

  2. method=CV_TM_SQDIFF_NORMED

    R(x,y)= \frac{\sum_{x',y'} (T(x',y')-I(x+x',y+y'))^2}{\sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}}

  3. method=CV_TM_CCORR

    R(x,y)= \sum _{x',y'} (T(x',y') \cdot I(x+x',y+y'))

  4. method=CV_TM_CCORR_NORMED

    R(x,y)= \frac{\sum_{x',y'} (T(x',y') \cdot I(x+x',y+y'))}{\sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}}

  5. method=CV_TM_CCOEFF

    R(x,y)= \sum _{x',y'} (T'(x',y') \cdot I(x+x',y+y'))

    where

    \begin{array}{l} T'(x',y')=T(x',y') - 1/(w \cdot h) \cdot \sum _{x'',y''} T(x'',y'') \\ I'(x+x',y+y')=I(x+x',y+y') - 1/(w \cdot h) \cdot \sum _{x'',y''} I(x+x'',y+y'') \end{array}

  6. method=CV_TM_CCOEFF_NORMED

    R(x,y)= \frac{ \sum_{x',y'} (T'(x',y') \cdot I'(x+x',y+y')) }{ \sqrt{\sum_{x',y'}T'(x',y')^2 \cdot \sum_{x',y'} I'(x+x',y+y')^2} }

     

Lo que nos da un resultado de una imagen que tiene máximos y mínimos  con la parte localizada más brillante (blanco)

 

../../../../../_images/Template_Matching_Template_Theory_Result.jpg

Y ahora lo que usamos es la función que nos localiza los máximos y los mínimos.

C++: void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray())

Que en realidad le pasamos los parámetros que buscamos y nos dice los puntos donde están los máximos y los mínimos.

 

veamos el programa.

http://cursos.dlabs.co/Modulo3/03_MatchTemplate/