2.14 descripci n de formas y contornos

46
DESCRIPCIÓN DE FORMAS Y CONTORNOS Luis Enrique Coronado Zuñiga Facultad de Ingeniería UASLP 1

Upload: cesar-vazquez

Post on 13-Nov-2015

41 views

Category:

Documents


3 download

DESCRIPTION

open cv

TRANSCRIPT

  • DESCRIPCIN DE FORMAS Y CONTORNOS

    Luis Enrique Coronado Zuiga

    Facultad de Ingeniera

    UASLP

    1

  • INTRODUCCIN

    Descripcin de una imagen: extraer propiedades o atributos de un objeto para su uso en aplicaciones.

    Los descriptores deben ser deben:

    Ser independientes del tamao, la localizacin y orientacin del objeto.

    Contener suficiente informacin de discriminacin para distinguir un objeto de otro.

    Descriptores de borde: rectas, curvas, etc.

    Descriptores de regiones: color, textura, nivel medio de intensidad etc.

    2

  • ESQUEMAS DE REPRESENTACIN

    Las tcnicas de segmentacin producen datos en bruto en forma de pixeles de contorno o de una regin.

    Normalmente se utilizan esquemas que compacten los datos en representaciones ms tiles en el clculo de descriptores.

    Esquemas de representacin comunes:

    Cdigos cadena

    Aproximaciones poligonales

    3

  • CDIGOS CADENA

    Los cdigos cadena se utilizan para representar un contorno por medio de una secesin conexa de segmentos de longitud y direccin especificadas.

    Normalmente se basa en segmentos de conectividad 4 u 8.

    La direccin de cada segmento se codifica utilizando un esquema de numeracin.

    Los cdigos cadena se crean siguiendo un contorno en una direccin (ej. en sentido de la manecillas del reloj)

    4

  • CDIGOS CADENA

    5 Conectividad 4 Conectividad 8

  • CDIGOS CADENA

    Regularmente para generar cdigos cadena se vuelve a muestrear el contorno seleccionando un espacio de cuadricula mayor.

    Se asigna un punto del contorno a cada nodo del cuadriculado.

    6

  • CDIGOS CADENA

    Se recorre el contorno, asignndole su cdigo cadena correspondiente.

    7

    Conectividad 4 Conectividad 8

  • APROXIMACIONES POLIGONALES

    El objetivo de una aproximacin poligonal es captar la esencia de la forma del contorno con un polgono del menor nmero de lados posibles.

    8

  • APROXIMACIONES POLIGONALES

    Mtodo para dividir los lados de un contorno de Douglas-Peucker (DP):

    Se encuentran los dos puntos extremos del borde y se crea una lnea que los conecta.

    Se busca el punto del contorno ms alejado de la lnea creada en el paso anterior.

    9

  • APROXIMACIONES POLIGONALES

    El punto encontrado en el paso anterior se aade a la aproximacin poligonal

    El proceso se repite hasta que la distancia ms alejada de las lneas de la aproximacin poligonal al contorno sea menor a una constante.

    10

  • CONTORNOS EN OPENCV

    OpenCV cuenta con una funcin para encontrar los contornos de una imagen.

    Sin embargo antes de utilizarla se debe conocer lo siguiente:

    Direccionamiento de memoria dinmica en OpenCV

    Secuencias en OpenCV

    11

  • DIRECCIONAMIENTO DE MEMORIA DINMICA EN OPENCV

    OpenCV utiliza la estructura CvMemStorage para almacenar memoria de objetos dinmicos.

    Para crear un nueva memoria CvMemStorage se utiliza el mtodo cvCreateMemStorage().

    CvMemStorage* cvCreateMemStorage( int block_size =

    0);

    block_size indica el tamao de los bloque de memoria.

    Si es puesto en 0, el tamao del bloque ser de 64kB.

    Para liberar la memoria de un objeto CvMemStorage, se utiliza el siguiente mtodo:

    void cvReleaseMemStorage(CvMemStorage ** storage);

    12

  • SECUENCIAS:

    Las secuencias son listas doblemente enlazadas de diferentes tipos de objetos utilizados por funciones de OpenCV.

    Algunos elementos de la estructura que representa las secuencias en OpenCV son las siguientes.

    typedef struct CvSeq {

    CvSeq* h_prev; // secuencia previa

    CvSeq* h_next; // prxima secuencia

    CvSeq* v_prev; // segunda secuencia previa

    CvSeq* v_next; // segunda secuencia prxima

    int total; // nmero de elementos en la

    secuencia

    } 13

  • ENCONTRAR CONTORNOS EN OPENCV

    Un contorno es una lista de puntos que representan una curva en una imagen.

    La funcin cvFindContours() calcula los contornos de imgenes binarias.

    Utiliza imgenes creadas por algn algoritmo de deteccin de bordes o por regiones creadas por funciones como cvThreshold() .

    El resultado es una secuencia del tipo CvSeq que contiene los contornos encontrados.

    Cada contorno encontrado es la vez una secuencia del tipo CvSeq que contiene los puntos del contorno encontrado

    14

  • ENCONTRAR CONTORNOS EN OPENCV

    cvFindContours() distingue entre dos tipos de contornos exteriores (c) y contornos interiores o huecos (h).

    15

  • ENCONTRAR CONTORNOS EN OPENCV

    int cvFindContours(

    IplImage * img, (1)

    CvMemStorage* storage, (2)

    CvSeq** firstCountour, (3)

    int headerSize, (4)

    CvContourRetrievalMode mode; (5)

    CvChainApproxMethod method; (6)

    );

    1. Imagen de entrada de 8 bits y un canal. Esta imagen tambin es usada como salida.

    2. Memoria del tipo CvMemStorage.

    16

  • ENCONTRAR CONTORNOS EN OPENCV

    3. Puntero a una secuencia CvSeq . Se puede inicializar como nula una secuencia y despus utilizarse en la funcin como en el siguiente ejemplo:

    CvSeq* firstContour = NULL;

    cvFindContours( ..., &firstContour, ... );

    4. Depende del valor del ltimo argumento method y puede tener el valor de sizeof(CvContour) o sizeof(CvChain) (solo cuando el mtodo de representacin es CV_CHAIN_CODE).

    17

  • ENCONTRAR CONTORNOS EN OPENCV

    5. Existen cuatro topologas posibles:

    CV_RETR_EXTERNAL : Recupera nicamente los contornos exteriores

    18

  • ENCONTRAR CONTORNOS EN OPENCV

    CV_RETR_LIST : Recupera todos los contornos y los pone en una lista.

    19

  • ENCONTRAR CONTORNOS EN OPENCV

    CV_RETR_CCOMP : Recupera todos los contornos y los organiza en una jerarqua de dos niveles.

    20

  • ENCONTRAR CONTORNOS EN OPENCV

    CV_RETR_TREE : Recupera todos los contornos y reconstruye la jerarqua de los contornos anidados por niveles

    21

  • ENCONTRAR CONTORNOS EN OPENCV

    6. Define el mtodo de cmo los contornos son representados.

    CV_CHAIN_CODE: los contornos se representarn en cdigo cadena.

    CV_CHAIN_APPROX_NONE: se traducen todas las partes del cdigo cadena a puntos.

    El valor de retorno de cvFindContours() es el nmero total de los contornos encontrados.

    22

  • DIBUJAR CONTORNOS

    void cvDrawContours(

    CvArr* img, //Imagen de salida

    CvSeq* contour, //Contornos

    CvScalar external_color, //Color de contornos

    CvScalar hole_color, //Color de huecos

    int max_level, //Nivel del rbol

    int thickness = 1, //Delgadez del contorno

    int line_type = 8, //Tipo de lnea

    CvPoint offset = cvPoint(0,0)

    );

    23

  • ENCONTRAR CONTORNOS EN OPENCV

    Ejemplo: Cvseq* contornos = 0;

    CvMemStorage* storage = cvCreateMemStorage(0);

    cvFindContours( imagen_gris, storage, &contornos,

    sizeof(CvContour), CV_RETR_TREE,

    CV_CHAIN_CODE, cvPoint(0,0) );

    cvDrawContours( imagen_color, contornos,

    CV_RGB(255,0,0),

    CV_RGB(0,255,0),1, 2, 2,

    cvPoint(0,0) );

    cvReleaseMemStorage( &storage );

    24

  • APROXIMACIONES POLIGONALES EN OPENCV

    CvSeq* cvApproxPoly(

    const void* src_seq, //Contorno CvSeq

    int header_size, //Tamao

    CvMemStorage* storage, // Memoria dinmica

    int method, //Mtodo de aproximacin

    double parameter1, //Precisin

    int recursive = 1

    );

    Ejemplo:

    contornos = cvApproxPoly( contornos,

    sizeof(CvContour), storage,

    CV_POLY_APPROX_DP, 3, 1 );

    25

  • DESCRIPTORES DEL CONTORNO.

    Permetro: nmero de pixeles a lo largo del contorno. La distancia entre pixeles en diagonal se suele tomar como

    2 1,4142

    Ejemplo en OpenCV:

    int p = cvContourPerimeter(contorno);

    26

  • DESCRIPTORES DEL CONTORNO: PERMETRO

    rea: nmero de pixeles dentro de un contorno. , = 1 si el pixel forma parte del objeto.

    , = 0 si el pixel forma parte del fondo.

    El rea es el nmero de pixeles para los cuales , = 1 , es decir:

    = (, )

    =1

    =1

    Ejemplo en OpenCV: int a = cvContourArea(contorno, CV_WHOLE_SEQ);

    // CV_WHOLE_SEQ indica que se toma el contorno

    de principio a fin. 27

  • DESCRIPTORES DEL CONTORNO: PERMETRO

    Obtener una regin rectangular que encierre un contorno:

    CvRect cvBoundingRect(

    CvSeq* contour, //Secuencia de contornos

    int update = 0

    );

    28

  • EJEMPLO:

    CvSeq* contornos = 0;

    CvMemStorage* storage = cvCreateMemStorage(0);

    cvFindContours( imagen_binaria, storage, &contornos,

    sizeof(CvContour), CV_RETR_TREE,

    CV_CHAIN_APPROX_NONE, cvPoint(0,0)

    );

    // Los descriptores anteriores solo funcionan con

    CV_CHAIN_APPROX_NONE

    for( CvSeq* c = contornos; c != 0; c = c->h_next )

    {

    int p = cvContourPerimeter(c);

    printf("Permetro: %i\n ", p );

    }

    cvReleaseMemStorage( &storage );

    29

  • MOMENTOS:

    Las formas de los lados de los contornos (y de las firmas) se pueden describir cuantitativamente utilizando momentos.

    Un momento es un valor escalar calculado a partir de una imagen, que no variarn aunque el objeto aparezca en distinta posicin, rotado o con distinto tamao, siempre que sea el mismo objeto.

    tiles para el reconocimiento de objetos por su forma.

    En la prctica debido al ruido, estos valores no sern exactamente iguales.

    No funcionan con objetos solapados o con varios objetos a la vez (se deben separar los objetos a reconocer). 30

  • MOMENTOS:

    Hallar el centro de masa del sistema lineal siguiente:

    31

    = =1

    =1

    =

  • MOMENTOS:

    Hallar el centro de masa de un sistema de masas puntuales.

    32

    =

    =

    =

    =

  • MOMENTOS:

    Momentos de Orden 0 (): Suma todos los pxeles cuyo valor es uno. Calcula el rea de una imagen.

    00 = = (, )

    =1

    =1

    Momento de Orden 1 ( y ): Momentos respecto al eje x (10), y respecto al eje y (01).

    10 = (, )

    =1

    =1

    01 = (, )

    =1

    =1

    33

  • MOMENTOS:

    Las coordenadas (X,Y) del centroide o centro de masa son:

    = 1000

    = 0100

    Los momentos centrales se usan para reconocer una imagen independientemente de su situacin respecto a los ejes de coordenadas.

    A partir de los momentos centrales se pueden construir un conjunto de siete momentos invariantes al cambio de escala, simetra y rotacin llamados momentos Hu.

    34

  • MOMENTOS EN OPENCV

    La funcin que utiliza OpenCV para calcular los momentos de un contorno es:

    void cvContoursMoments(

    CvSeq* contour, //contorno

    CvMoments* moments //momentos

    );

    Obtener momentos cartesianos:

    double cvGetSpatialMoment(

    CvMoments* moments, //momentos

    int x_order, //orden en x

    int y_order //orden en y

    );

    35

  • MOMENTOS EN OPENCV

    Ejemplo:

    CvMoments moments;

    for( CvSeq* c = contornos; c != 0; c = c-

    >h_next )

    {

    cvMoments(c, &moments);

    M00 = cvGetSpatialMoment(&moments,0,0);

    M10 = cvGetSpatialMoment(&moments,1,0);

    M01 = cvGetSpatialMoment(&moments,0,1);

    int x = (int)(M10/M00);

    int y = (int)(M01/M00);

    }

    36

  • EJERCICIO

    Detectar el centro de masa de al menos 2 LEDs mediante resta de imgenes y momentos.

    Tomar una imagen con los LEDs prendidos y otra con los LEDs apagados.

    Eliminar ruido, segmentar la regin creada por la resta, rellenar huecos.

    Obtener sus contornos

    Obtener el centro de masa de los LEDs

    Dibujar un crculo por cada LED. El centro de cada crculo debe ser el centro de masa de cada LED.

    37

  • MOMENTOS EN OPENCV

    Los momentos Hu son invariantes a la traslacin, rotacin y cambio de escala.

    38

  • MOMENTOS EN OPENCV

    Ejemplo obtener momentos Hu:

    CvMoments moments;

    -------------------------------

    cvMoments(c, &moments);

    CvHuMoments hu_moments;

    cvGetHuMoments(&moments, &hu_moments);

    printf(Momento Hu 1 = %f

    ",hu_moments.hu1);

    39

  • LA TRANSFORMADA DE HOUGH

    La Transformada de Hough es una tcnica usada para la deteccin de figuras o primitivas geomtricas en imgenes digitales (binaria o en escala de grises) .

    Las figuras que deseamos encontrar se describen mediante ecuaciones paramtricas.

    40

  • LA TRANSFORMADA DE HOUGH

    La imagen de entrada pude ser, por ejemplo, una imagen con bordes extrados mediante el operador de Canny.

    Espacio de parmetros: El conjunto de todas las combinaciones de los valores de parmetros de la ecuacin de la primitiva a buscar.

    El espacio de parmetros debe ser discretizado para acortar la bsqueda a un conjunto finito de parmetros.

    Entre ms parmetros consideremos, mayor ser la precisin y la operacin ser ms costosa.

    41

  • LA TRANSFORMADA DE HOUGH

    Encontrar lneas:

    La transformada de Hough encuentra puntos en la imagen que satisfagan la ecuacin de la recta en su forma polar, para distintos valores de y .

    Ecuacin polar de la recta: + =

    El espacio de parmetros se discretiza en una serie de celdas denominadas celda de acumulacin.

    42

  • LA TRANSFORMADA DE HOUGH

    Cada pixel de la imagen votar por todas las ecuaciones correspondientes a primitivas a las que permanezca dicho punto recorriendo todas las combinaciones de parmetros de el espacio de bsqueda.

    Las primitivas con un valor de votos mayor a un umbral sern reconocidas como lneas.

    43

  • LA TRANSFORMADA DE HOUGH

    Transformada de Hough para el crculo:

    Se utiliza la siguiente ecuacin paramtrica: ( )2+( )2= 2

    (a,b) es el centro del circulo, r es su radio.

    La bsqueda es tridimensional y por lo tanto ms compleja que con lneas.

    44

  • LA TRANSFORMADA DE HOUGH

    Ventajas

    Cada pxel de la imagen se procesa de modo independiente, lo que facilita su implementacin en paralelo.

    La transformada "general de Hough es til para la deteccin de formas complejas

    Es capaz de reconocer patrones ligeramente deformados, ocultos o discontinuos

    Robusta frente al ruido

    Inconvenientes

    Tiempo y memoria

    Ajustar el nivel de umbral de votos depende del problema.

    45

  • EJERCICIO

    Investigar como se realiza la transformada de Hough para encontrar lneas en OpenCV.

    Realizar un programa que obtenga las lneas de una imagen.

    Realizar un programa que obtenga las crculos de una imagen.

    46