You are on page 1of 20

Integracindemediosdigitales

Prcticadeejemplodeintegracindemedios: IntroduccinalempleodetcnicasdeVxC medianteOpenCV

Manuel Agust y Vicente Atienza Curso 2009/2010

Esta prctica constituye una introduccin al tema de procesado de secuencias de imgenes utilizando el API de OpenCV. En la presente prctica, se obtendr una serie de resultados, cdigo y ficheros de imgenes de resultados. Conteste en su espacio de PoliformaT a la tarea Prctica de VxC, incluyendo directamente los nombres de los que realizan la tarea y, bajo el nombre de cada actividad, el cdigo de la operacin involucrada en cada una. Utilice la orden make y el nombre del fichero que se indica como respuesta a cada actividad para generar el ZIP correspondiente.

En el Anexo I se introduce de forma breve el entorno de trabajo visual multiplataforma que est disponible en el laboratorio, pero en este boletn no se asume uno en concreto y se indica cmo compilar asumiendo que se trabaja en lnea de rdenes sobre GNU/Linux.

1. Introduccin y objetivos
La presente prctica est encaminada a ofrecer una perspectiva final de proyecto de integracin. Para ello, se va a participar en la implementacin de un prototipo de aplicacin que utiliza las imgenes como medio principal de entrada y de salida de informacin. Los objetivos de esta prctica son:

Dar a conocer al alumno, de un modo participativo, las tcnicas bsicas de procesado de imgenes en mapa de bits. Exponer un ejemplo de aplicacin donde el uso de la informacin visual es la base para construir una aplicacin multimedia interactiva. Utilizar una plataforma de experimentacin abierta y multiplataforma que permita al alumno proseguir su autoaprendizaje de forma independiente.

A partir de la exploracin de ejemplos de uso que se expone en el segundo punto, se introduce en el tercero las tcnicas de procesado de imgenes aplicables individualmente a los puntos de una imagen; este apartado concluye con un ejemplo de aplicacin que se propone como ejercicio: la determinacin de la posicin de la luz que emite un puntero lser (bajo ciertas restricciones) para realizar su seguimiento en pantalla. En el cuarto punto, se expondr y se propondr al alumno que lleve a cabo una operacin de procesado en la que hay que utilizar la informacin de los puntos vecinos para extraer los bordes contenidos en una imagen. 1.1 Acerca de OpenCV Example applications of the OpenCV library are Human-Computer Interaction (HCI); Object Identification, Segmentation and Recognition; Face Recognition; Gesture Recognition; Motion Tracking, Ego Motion, Motion Understanding; Structure From Motion (SFM); Stereo and Multi-Camera Calibration and Depth Computation; Mobile Robotics.

OpenCV es una biblioteca de cdigo abierto para tareas de visin por computador originalmente desarrollada por Intel y publicada bajo licencia BSD, que permite que sea usada libremente para propsitos comerciales y de investigacin. La biblioteca es multiplataforma, puede ser usada en Mac OS X, MS/Windows y GNU/Linux. En la web, se puede encontrar para descargar la ltima versin en el sitio web de Sourceforge [1], ejemplos y un rpido repaso en la introduction to OpenCV [9] y documentacin en el OpenCV Wiki [2] y en el libro oficial de OpenCV: Learning OpenCV: Computer Vision with the OpenCV Library [3]. Tambin se pueden encontrar fuentes de inspiracin (ejemplos y explicaciones) en documentos como el Introduction to OpenCV [9], o pginas personales como la de Blog de Damiles [10] de D. Milln y en trabajos anteriores como el de Trabajando con OpenCV [11] de A. Ivars que muestra pequeos ejemplos de OpenCV, as como de OpenAL.

Figura 1. Logotipos de OpenCV: el inicial de Intel (izquierda) y el actual del OpenCVWiki (derecha).

2. Programas de ejemplo
Se desarrollarn pequeos programas para la tarea que se aborde en cada punto, En primer lugar se proponen una serie de ejemplos para familiarizarse con las funciones y el modo de trabajo de OpenCV. La librera se puede descargar del sitio web en [1]. En este apartado el trabajo a realizar es comprobar la utilizacin de las funciones de OpenCV: cmo se estructura y compila un programa que las utiliza, cmo se llaman algunas funciones tpicas vistas en la clase de teora, qu parmetros pueden recibir y qu resultados devuelven. Es aconsejable tener la ayuda siempre es bueno que est a mano, a poder ser en local1, otras referencias tiles estn disponibles en [2], [3] y [4]. Los siguientes ejemplos los encontrar en los enlaces junto al de este boletn. Descrguelos en local para proceder a su examen. Junto a cada ejemplo se le pedir en un ejercicio que anote la descripcin de las estructuras datos utilizadas y/o de las funciones de OpenCV, gurdelas en un fichero de texto plano con el nombre de los que realizan la prctica para entregarlo al final de esta.

2.1 Un primer programa En este ejemplo se describir cmo se crea una imagen de grises y una de color, cmo se accede a los pxeles de ambas, cmo se averiguan las propiedades de una imagen (en este caso nos preocupamos slo de las que afectan a la resolucin de la misma), por ltimo cmo se muestran en pantalla y cmo se liberan los recursos al acabar.

Figura 2.- Captura de pantalla de la ejecucin del ejemplo opencv_1.c


1

En GNU/Linux es habitual que se encuentre en /usr/share/doc/opencv-doc/ref/opencvref_cv.htm.

El ejemplo corresponde con el fichero opencv_1.c, bralo y familiarcese con su cdigo. Su salida se puede ver en la Figura 2. En el laboratorio se compila con:
$ gcc -I/usr/include/opencv -lcxcore -lcv -lhighgui -lcvaux -lml opencv_1.c -o opencv_1

y se ejecuta con la orden


$ ./opencv_1

La ejecucin termina al pulsar cualquier tecla, observe que no basta con cerrar las ventanas de resultados. Como se habr observado, todo gira en torno a la representacin en mapa de bits de las imgenes en la estructura IplImage, que no se muestra en su totalidad:
typedef struct _IplImage { int ... int ... int ... int int ... char *imageData; int } IplImage; widthStep; /* pointer to aligned image data */ /* size of aligned image row in bytes */ width; height; /* image width in pixels */ /* image height in pixels */ depth; /* pixel depth in bits */ nChannels; /* Most of OpenCV functions support 1,2,3 or 4 channels */ nSize; /* sizeof(IplImage) */

que son inicializadas como estructuras en memoria con la funcin cvCreateImage() y que se asignan valores a los pxeles de la imagen con la funcin cvSet2D accediendo a los elementos de la imagen por su nmero de columna (x) y su nmero de fila (y). Atencin al orden en que se deben escribir las coordenadas: primero la y, luego la x. El tipo de cada componente es char (8 bits, sin signo) por lo que pueden tomar valores en el rango [0,255]. La implementacin utilizada en el ejemplo se basa en las definiciones de variables del tipo de datos IplImage y las funciones .cvCreateImage, cvNamedWindow, cvShowImage, cvSize, cvWaitKey, cvDestroyAllWindows, cvReleaseImag, cvGet2D y cvSet2D. El esquema de trabajo utilizado en el ejemplo se basa en: Declarar las variables Inicializar la imagen con imgRGB = cvCreateImage(cvSize(AMPLE, ALT),IPL_DEPTH_8U, 1); Bucle Asignar un nivel de gris a cada punto de la imagen con cvSet2D. Liberar recursos y terminar De forma anloga, es posible escribir sobre las componentes de color (por ejemplo una que tiene los tres planos RGB) de un pxel de la imagen asignndole la memoria correspondiente y asignando valores a cada componente y utilizando la misma funcin. As mismo, se pueden leer los valores de cada pxel de una imagen con la funcin cvGet2D e

interpretando el contenido de color conforme indique la propiedad de nmero de componentes de esa imagen.

Ejercicio 1. Modifique el cdigo fuente de ejemplo opencv_1.c para que se cree tambin una imagen en color (RGB) y en la que aparezca una franja blanca horizontal de 10 pxeles en el centro de la misma.

2.2 Interaccin con las ventanas En este ejemplo se exploran algunas funciones para la entrada de datos de los programas mediante las funciones de OpenCV. Este ejemplo muestra un imagen de color y la componente escogida con las teclas 'R', 'G' 'B' (para rojo, verde y azul respectivamente) como imgenes de gris. Adems, para terminar el programa se puede utilizar la tecla ESC, 'q', 'Q' para salir. El ejemplo se llama opencv_entradaDatos.c. La salida del mismo se puede ver en la Figura 3. Complelo y ejectelo de manera anloga al ejemplo anterior.

Figura 3: Captura de pantalla despus de pulsar la tecla B. El esquema de trabajo utilizado en el ejemplo se basa en: Inicializar las imgenes. Bucle Esperar un tiempo mximo una entrada de teclado: cvWaitKey() ; Procesar de acuerdo a la opcin del usuario. Mostrar la imagen procesada Liberar recursos y terminar De una forma ms visual los datos que proporciona el usuario se pueden obtener mediante el uso de una (o varias) barra de desplazamiento asociada a la imagen. El ejemplo opencv_barraDespl muestra el uso de una barra para asignar un valor a todos los puntos de la imagen. El esquema de trabajo utilizado en el ejemplo se basa en el uso de las funciones cvWaitKey, cvCreateTrackbar, cvSet, cvAddS y cvZero El esquema seguido es: Incializar: declarar la variable de tipo imagen, inicializarla y mostrar la magen Crear una barra de desplazamiento con cvCreateTrackbar() Establece el rango entre [0, valorMax], el valor actual y la funcin encargada de actualizar el proceso a cada movimiento de la barra de desplaza-iento. Establecer un manejador para las acciones de ratn: cvSetMouseCallback() Bucle Donde siempre se cambian los valores de la imagen al valor activo. Liberar recursos y terminar

Este ejemplo permite seleccionar el valor de gris de los pxeles de la imagen a partir del valor que escoge el usuario en la barra de desplazamiento.

Figura 4: Captura de pantalla de opencv_barraDesplz en el momento de escoger el valor 223. Ejercicio 2. Modifique el ejemplo opencv_barraDesplz.c para que el pxel sobre el que se hace click con el boton derecho del ratn cambie su nivel de gris al ms alto posible. Haga que este comportamiento se mantenga mientras el ratn est pulsado y se mueva sobre la imagen, hasta que se suelte.

2.3 Primitivas de dibujo Este apartado muestra que se pueden crear contenidos visuales a partir de primitivas vectoriales que son llevadas a cabo sobre las imgenes en formato de mapa de bits dentro de OpenCV. Estas operaciones sirven desde para inicializar el contenido de la imagen, hasta para mostrar resultados al mismo (desde mostrar texto hasta remarcar una zona de la imagen). Hay que tener en cuenta que las coordenadas de dibujo tienen como origen de coordenadas (0,0) en la parte superior izquierda y toman valores crecientes en el sentido de los ejes, hasta alcanzar el mximo (ancho-1,alto-1) en la esquina inferior derecha. En la Figura 5 se puede ver, a la izquierda, el resultado de ejecutar el ejemplo opencv_graficsText.c.

Figura 5: Primitivas bsicas de dibujo.

A la derecha de la Figura 5, una versin modificada del mismo va pintando aleatoriamente diferentes primitivas con diferentes parmetros y trozos de un mapa de bits que ha cargado previamente. Esto se realiza a base a ejecutar las diferentes instrucciones sobre una misma imagen, el mismo mapa de bits (la misma imagen) se visualiza de manera peridica para que se puedan ver las acciones realizadas sobre ella. El esquema de trabajo utilizado en opencv_graficsText.c se basa en el uso de las funciones.cvLine, cvRectangle, cvCircle, cvEllipse, cvFillConvexPoly, cvPolyLine y cvPutText., siguiendo el esquema: Inicializar una imagen. Pintar sobre ella: rectngulos: cvRectangle crculos: cvCircle y cvEllipse polilneas: cvPolyLine una cruz: cvLine Mostrar la imagen y esperar una tecla Liberar recursos y terminar

Ejercicio 3. Modifique el ejemplo opencv_graficsText.c para incluya una funcin void pintaCruz(imagen, fila, col, ancho, colorRGB) que pinte con cvLine una cruz centrada en las coordenadas indicadas, as como con el ancho y color recibidos.

2.4 Cargar y guardar imgenes estticas en fichero Veamos ahora cmo manipular imgenes en mapas de bits, en los formatos conocidos por OpenCV, desde y hacia fichero utilizando las funciones CvLoad y cvSave. El esquema de trabajo del ejemplo actual (opencv_esFichero.c), mostrado en un momento de la ejecucin en Figura 6, basado en el uso de las funciones cvLoadImage, cvSaveImage, cvSplit, cvCloneImage y cvCopyImage es: Inicializar las imgenes Cargar un fichero de mapa de bits variableImagen = cvLoadImage(nombreFichero, CV_LOAD_IMAGE_UNCHANGED); Procesar la imagen En este caso a partir de la tecla escogida obtener una de las componentes de color de la imagen original. Liberar recursos y terminar Donde nombreFichero es la ruta (relativa o absoluta) del fichero a procesar, incluida la extensin de la misma. Tenga en cuenta que si el fichero no existe o no se tienen derechos de acceso, la operacin cvLoadImage devuelve NULL y no hay datos que procesar. Anlogamente a la funcin de cargar un fichero de disco, se puede guardar el contenido de una variable de tipo imagen en disco con: cvSaveImage( nombreFichero, variableImagen ); Ejercicio 4. Incorpore el cdigo necesario al ejemplo anterior para guardar la imagen generada en l y as realizar este proceso. Qu sucede si no existe la ruta indicada o si ya existe el fichero? Justifique si es posible sustituir las funciones cvLoadImage, cvSaveImage, cvCloneImage y cvCopyImage por cvLoad, cvSave, cvClone y cvCopy (respectivamente),

Figura 6: Ejemplo de captura de pantalla de la aplicacin "opencv_esFichero".

2.5 Cargar y visualizar un vdeo Este apartado se centra en la manipulacin de secuencias de imgenes en mapas de bits, en los formatos y CODEC conocidos por OpenCV, desde y hacia fichero. El fichero que se va a utilizar se llama opencv_player.c y se construye el ejecutable de manera anloga a los apartados anteriores. Por ejemplo, se pueden abrir ficheros sin comprimir en AVI o MPEG, permitiendo parar y continuar la reproduccin de la secuencia (tecla 'r') o reiniciar la misma (tecla 'i'). Cuando llega al final se para y espera ESC, pudiendo ser reiniciada. El fichero de vdeo a utilizar se recibe como primer parmetro de la lnea de rdenes. El esquema del proceso que utiliza opencv_player.c es el siguiente: El esquema de trabajo del ejemplo actual (opencv_player.c) es: Inicializar la fuente de vdeo: CvCapture, cvCreateFileCapture Bucle Cargar un cuadro de la secuencia de vdeo: cvQueryFrame Procesar la imagen: procesar( imgOrg, imgDst ) Liberar recursos y terminar. Observar que no se libera la imagen obtenida con cvQueryFrame por su naturaleza interna a OpenCV

Ejercicio 5. Modifique el ejemplo opencv_player.c, para que obtenga una versin en grises del contenido del vdeo y muestre tanto la versin en color como la de niveles de gris en pantalla. Para ello habr de utilizar uno de los modos de la funcin cvCvtColor, dependiendo del orden de los campos en la imagen: cvCvtColor( imgOrg, imgDst, CV_BGR2GRAY); cvCvtColor( imgOrg, imgDst, CV_RGB2GRAY);

2.6 Captura y procesado de imgenes estticas a travs de la cmara Veamos ahora cmo manipular imgenes en mapas de bits, obtenidas a travs de una cmara con OpenCV, utilizando una cmara web como ejemplo ms popular y usual de este tipo de perifricos. El fichero que se va a utilizar se llama opencv_camara.c y se construye el ejecutable de manera anloga a los apartados anteriores. El esquema del proceso del ejemplo actual (opencv_camara.c) es: Inicializar la fuente de vdeo: CvCapture, cvCreateCameraCapture. Bucle Cargar un cuadro de la secuencia de vdeo: cvQueryFrame. Quizs procesarla. Mostrar la imagen. Liberar recursos y terminar: cvReleaseCapture.

Figura 7. Ejemplo de salida del cdigo de "opencv_camara". Ejercicio 6. Incorpore el cdigo necesario al ejemplo anterior para guardar la imagen generada, el resultado de aplicar un determinado proceso a la imagen capturada, en l y as realizar este proceso.

2.7 Procesar y guardar un vdeo


En el anterior apartado se procede a partir de la carga de una imagen esttica desde fichero o de la cmara, entonces se dispone de la informacin y se puede aplicar un procesado a la imagen en cuestin. Si se trata de una secuencia de imgenes (un vdeo), el procesamiento se aplica sobre cada uno de sus cuadros de forma repetida. Para ello deber observase que en la secuencia de captura de imgenes desde la cmara o desde la lectura de un fichero, se ha de esperar a disponer de una imagen para entonces aplicar el proceso correspondiente. Este puede ser desde simplemente mostrarla hasta modificarla en funcin de lo que haya sucedido en relacin con cuadros anteriores y mostrar un resultado distinto del contenido visual de entrada. El esquema del proceso del ejemplo actual (opencv_grab.c) guarda en un AVI (con el CODEC DIVX el resultado de reproducir un fichero de vdeo que recibe como parmetro. La secuencia de llamadas de funciones de OpenCV es: Inicializar la fuente de vdeo: CvCapture, cvCreateFileCapture / cvCreateCameraCapture y el destino de vdeo CvVideoWriter, cvCreateVideoWriter. Bucle Cargar un cuadro de la secuencia de vdeo: cvQueryFrame Quizs procesarla. Mostrar la imagen: cvWriteFrame. Liberar recursos y terminar: cvReleaseVideoWriter.

Ejercicio 7. Modifique el ejemplo para que guarde como vdeo en MPEG el resultado, utilizando un nmero de cuadros por segundo de 30 y el CODEC: CV_FOURCC('P','I','M','1')

2.8 Histograma de una imagen. Un operador interesante en el caso de las imgenes es el histograma de la imagen: la funcin de distribucin de los valores de los pxeles de la imagen. En este apartado nos centramos en cmo se declaran y manipulan. El ejemplo de uso mostrarHistograma.c muestra cmo calcular (con las funciones propias de OpenCV) este y cmo aplicarlo al caso de una imagen de niveles de gris, as como a una de color en base a obtener el histograma para cada componente por separado. Un ejemplo de la salida del mismo para una misma imagen en color y en niveles de gris se puede ver en la Figura 8. El cdigo se encarga de diferenciar un caso o el otro examinando el nmero de componentes de la imagen que recibe como parmetro.

Figura 8: Ejemplo de histograma para una misma imagen, en grises a la derecha y arriba y en color a la izquierda y abajo. El ejemplo indicado tiene la estructura siguiente (mostrarHistograma.c) es: Obtener una imagen Para cada plano o componente: Inicializar la estructura de histograma correspondiente a la imagen: CvHistogram, cvCreateHist(). Calcular el histograma: cvCalcHist() Mostrar el histograma, pintando una polilnea a partir de los valores del histograma: cvQueryHistValue_1D() Liberar recursos y terminar: cvReleaseHist(). La representacin grfica muestra para cada valor entre 0 y el mximo nivel para una componente (L), en el eje horizontal, el nmero de veces que aparece en la imagen reescalada con el valor mximo en la vertical para adaptarla al tamao de la ventana donde se representa el histograma. Se puede obtener la versin en gris de una imagen en color RGB de diferentes formas, por ejemplo, si Recargamos la imagen desde fichero forzando la conversin imgGris = cvLoadImage(filename, CV_LOAD_IMAGE_GRAYSCALE); Cambiando de espacio de representacin de color cvCvtColor( imgRGB, imgGris, CV_RGB2GRAY );

Ejercicio 8. . Partiendo del ejemplo mostrarHistograma.c, modifque el programa principal para que el segundo parmetro de la lnea de rdenes identifique una conversin de espacio color a aplicar sobre la imagen original. Teniendo en cuenta que: i) Se han de contemplar las siguientes conversiones: 0 no hacer conversin, 1 RGB a Gris, 2 RGB a YCrCb, 3 RGB a HSV y 4 RGB a HLS ii) Se ha de mostrar el histograma tanto sobre la imagen de partida como de la convertida, excepto en el caso de 0.

Aunque no hay una operacin anloga para modificar un valor del histograma, se puede cambiar un valor del vector de datos con: float *f; f = cvGetHistValue_1D(hist, i); *f = cvQueryHistValue_1D(hist,i) / maxHistograma;

Actividad 0. Como resumen de este apartado, junte las respuestas de los ejercicios realizados en esta seccin y los resultados. Comprimalo en un slo fichero comprimido (en ZIP), con el nombre act0.zip. Entrguelo como respuesta a la Actividad 0. Utilice la orden $make act0.zip.

3. Procesos puntuales
Son aquellos que se pueden realizar individualmente con la informacin de cada punto de la imagen. Nos servirn para entender algunas de las estructuras de datos que hay detrs de OpenCV para representar a las imgenes.

3.1 Aadir un nuevo procesamiento puntual: negativo digital


Vamos a aadir un nuevo procesamiento puntual que realice el negativo de una imagen. Para lo cual se partir del ejemplo opencv_esFichero.c copindolo sobre un nuevo fichero de nombre negativo.c El negativo se consigue convirtiendo el valor de cada componente de color de la imagen original de acuerdo a la expresin valor_destino= L valor_original siendo L el mximo valor que puede representar un punto de una imagen en la implementacin. Actividad 1. Localice la funcin procesar y, utilizndola como base, sustituya esta por la funcin: void Op_NEGATIVO( IplImage *Fuente, IplImage *Destino) Una vez completada, construya el nuevo ejecutable y compruebe el correcto funcionamiento de la opcin negativo digital. Si funciona correctamente, el negativo del negativo deber devolver la imagen original. Responda a esta actividad generando un fichero comprimido (act1.zip), bajo el cual se incluya el cdigo fuente realizado, as como el resultado de aplicarlo a la imagen de rgb.jpg, tanto en niveles de gris, como en RGB. Utilice la orden $make act1.zip.

3.2 Generacin de imgenes binarias mediante umbralizacin


Las imgenes binarias son aqullas cuyos pxeles slo toman dos valores 0 y 1 o cualquiera otros dos se se especifiquen, por ejemplo por facilidad de visualizacin en pantalla 0 y 255, para imagenes en niveles de gris. Un procedimiento habitual en el mbito de la visin por computador para generar imgenes binarias a partir de imgenes de niveles de gris es el proceso denominado umbralizacin. Consiste en establecer un valor de gris denominado umbral. Todos los pxeles de la imagen original que superen el valor de umbral, se convierten en pxeles a 0 en la imagen binaria destino y el resto se convierten a 1 (o al contrario). Habitualmente la umbralizacin se emplea con propsitos de segmentacin de la imagen, esto es, determinar o etiquetar partes diferenciadas en la imagen de acuerdo a un criterio (por ejemplo, un mismo color). Umbralizar es el caso ms simple de segmentacin, de forma que se consiga que todos los pxeles de la imagen con un determinado valor binario (una etiqueta para saber que pertenecen a la clase objeto) correspondan a partes del objeto de inters de la escena (o varias instancias de una clase de objeto) y el resto corresponden al fondo de la imagen. Vamos a aadir un nuevo procesamiento puntual que realice la conversin de la imagen en una imagen binaria (tambin denominada blanco/negro o B/N) donde los pxeles de la imagen se han reetiquetado con dos valores para indicar cundo cumplen o no un cierto criterio. Por ejemplo puede tomar la salida mostra en la Figura 9.

Figura 9: Ejemplo de salida del programa de binarizacin por umbralizacin. Actividad 2. Partiendo del ejemplo opencv_barraDesplz.c y copindolo sobre un nuevo fichero de nombre umbraliza.c. a) Localice la funcin procesar y, en su lugar utilice la funcin void Op_UMBRALIZAR( IplImage *Fuente, IplImage *Destino) que habr de editar para que tenga el comportamiento esperado. Asegrese que la imagen fuente es una imagen de niveles de gris, antes de realizar las operaciones propias que permitan obtener la imagen binaria (B/N) que resulte de aplicar el criterio de si los pxeles de la imagen superan o no el valor:definido por la variable que guarde el valor umbral. b) Abra la imagen gafas_1.bmp. Convirtala a B/N. Observe el histograma de la imagen e intente deducir un valor de umbral adecuado para que en la imagen binaria aparezca bien definida la forma del objeto. Umbralice la imagen con diferentes valores de umbral y observe los resultados. c) Busque en la ayuda y anote la definicin de la funcin .cvThreshold y los posibles valores del quinto parmetro de esta funcin.Realice una versin de este ejemplo que permita seleccionar tanto el valor de gris para aplicar el criterio, como el valor que se asigna a los puntos que cumplen el criterio de seleccin.

d) Realice una versin de este ejemplo que permita seleccionar los pxels de nivel de gris exactamente con el valor que escoge el usuario en la barra de desplazamiento. Responda a esta actividad incluyendo el cdigo fuente realizado y adjuntando los resultados sobre la imagen gafas1.bmp con el nombre act2.zip. Utilice la orden $make act2.zip.

3.3 Obtencin de medidas en imgenes binarias


En este apartado se implementar una funcin que permitir obtener el centro de gravedad de un objeto que aparece en una imagen binaria. Como requisitos, supondremos que la imagen contiene un nico objeto y que ste corresponde a los pxeles a negro (fondo blanco). El algoritmo que permite hallar las coordenadas (cdg_y, cdg_x) del centro de gravedad es el siguiente: suma_x = 0; suma_y = 0; n = 0; Para todo pxel f(x,y) de la imagen fuente si f(x,y) = 0 entonces suma_x suma_x + x suma_y suma_y + y nn+1 si n <> 0 entonces cdg_x = suma_x / n; cdg_y = suma_y / n; sino cdg_x = 0; cdg_y = 0; Actividad 3. Aada en el ejemplo umbraliza.c, realizado en el apartado anterior, la funcin Op_CENTRO_DE_GRAVEDAD( IplImage *Fuente, IplImage *Destino) e incorpore el cdigo necesario para que calcule el centro de gravedad de una imagen binaria y lo represente. Para sealar la posicin del centro de gravedad sobre la imagen Destino con una cruz. Para lo cual habr de reexaminar del ejemplo opencv_graficsText.c. cmo dibujar lneas y trazar dos centradas en la posicicin cdg_y, cdg_x. Localice con ayuda de este ejemplo el centro de gravedad de las gafas en las imgenes gafas_1.bmp, gafas_2.bmp, gafas_3.bmp y gafas_4.bmp. Responda a esta actividad incluyendo el cdigo fuente realizado y adjuntando el vdeo resultante con el nombre act3.zip. Utilice la orden $make act3.zip.

3.4 Ejemplo de aplicacin: ejercicio de localizacin de un puntero lser


Abra la secuencia de trabajo laser.avi y reprodzcala. En este punto se propone aplicar las tcnicas que se han puesto en prctica anteriormente para resolver un problema prctico. Se trata de localizar la posicin en la imagen del punto de luz proyectado por un puntero lser en movimiento sobre las superficies de una estancia cerrada. El problema puede resultar de inters para el desarrollo de aplicaciones de realidad virtual o aumentada, pizarras electrnicas, etc. A continuacin desarrollaremos un proceso que localice la posicin del punto lser aplicando tcnicas de umbralizacin y clculo del centro de gravedad. Como resultado, la imagen destino ser una copia de la imagen fuente sobre la que se habr marcado con una pequea cruz la posicin del centro de gravedad. Actividad 4. A partir del cdigo desarrollado previamente en el apartado Procesar

y guardar un

vdeo, cree un fichero buscarLaser.c que contenga la funcin:


void Op_BUSCAR_LASER( IplImage *Fuente, IplImage *Destino) Deber insertarse el cdigo correspondiente como cuerpo de la funcin indicada. Previamente, el programa principal puede incluir una etapa previa que se indica a continuacin. Una vez completado, este proceso podr ejecutarse y obtenerse el resultado en un fichero de vdeo (por ejmplo act4_secLaser.avi) que se recibe como segundo parmetro, as una posible llamada que ha de implementarse es: $ ./buscarLaser laser.avi act4_secLaser.avi. El primer paso consistir en determinar el valor de umbral ms adecuado para conseguir una imagen binaria en la que slo aparezca el punto lser. Determine cul de los tres canales de color ofrece una mayor diferenciacin del punto lser respecto al resto de la imagen. Para ello visualice las tres secuencias a partir de la original mediante extraccin de cada una de las tres componentes de color para determinar el canal ms significativo. Visualice el histograma del primer cuadro de la secuencia correspondiente al canal elegido y a partir de l deduzca un valor de umbral adecuado para segmentar el punto lser por umbralizacin. Umbralice esta misma secuencia con el valor seleccionado y reproduzca la secuencia binaria generada. Compruebe que la segmentacin del punto lser es correcta a lo largo de toda la secuencia binaria. Una vez determinados el canal y valor de umbral ms adecuados, complete la funcin Op_BUSCAR_LASER. Bsicamente deber completar los siguientes pasos: 1. Umbralizar la imagen fuente sobre la imagen destino. 2. Calcular el centroide de la imagen destino binaria. 3. Copiar la imagen fuente sobre la imagen destino. 4. Sealar la posicin del centroide con una cruz sobre la imagen destino. Responda a esta actividad incluyendo el cdigo realizado y adjuntando el vdeo resultante con el nombre act4.zip. Utilice la orden $make act4.zip.

4. Procesos de vecindad
En este ltimo apartado se propone la implementacin de un procedimiento de deteccin (realce) de bordes mediante un filtro Sobel. Los filtros son procesos de vecindad: para decidir el valor de un determinado pxel, se considera no slo el valor que tena originalmente ese pxel, sino tambin el valor de sus pxeles vecinos. El filtro Sobel considera, en principio, una vecindad de 3x3 pxeles. Como ayuda a su implementacin, partiremos del estudio del cdigo de opencv_convol.c la funcin donde existe una funcin: void Op_FILTRO3X3( IplImage *Fuente, IplImage *Destino) que implementa un filtro genrico, cuya mscara se define mediante la matriz float m[3][3]= {...}; Los filtros se pueden emplear para realizar efectos en las imgenes, pero en este caso los utilizamos para obtener informacin del contenido de la imagen, en particular los bordes: la deteccin de bordes o transiciones entre zonas de un mismo color en la imagen para posteriormente aislar lo que est dentro de ellos (los posibles objetos de inters en la escena) del fondo (la parte de la misma que no tiene objetos de inters).

El ejemplo opencv_convol.c muestra cmo se aplica una mo filtro y la funcin, op_Filtro3x3, tiene la estructura siguiente: Obtener una imagen de partida de niveles de gris: cvCreateImage() y cvCvtColor(). Inicializar el filtro, tanto la estructura, como asignar la mscara : cvCreateMat() y cvSetData(). Aplicar el filtro obtenido: cvFilter2Dt(). Liberar recursos cvReleaseMat(). Para realizar otras operaciones no es suficiente con aplicar el filtro, en ocasiones hay que tener en cuenta posibles desbordamientos a realizar las operaciones, o normalizaciones de los valores resultantes, por lo que es posible que, en determinados filtros sea necesario ajustar tambin un factor de normalizacin (o divisor). En otros casos, es necesario combinar el resultado de ms de un paso de convolucin (con sus correspondientes filtros). El ejemplo opencv_sobel.c se obtiene una deteccin de bordes exhaustiva, como resultado de la funcin void Op_SOBEL( IplImage *Fuente, IplImage *Destino) que combina la deteccin de bordes verticales con los horizontales. siguiendo la estructura siguiente de la funcin op_Sobel: Asegurarse que la la imagen de partida es de niveles de gris. Inicializar variables auxiliares: cvCreateImage(). Obtener la derivada en X: cvSobel(). Obtener la derivada en Y: cvSobel(). Combiar los resultados parciales: cvConvertScaleAbs(). Liberar recursos auxiliares cvReleaseImage(). Actividad 5. A partir de ests ideas sobre el empleo de mscaras o filtros, realice: a) Sobre el ejemplo opencv_convol.c Cree tres versiones de esta operacin void Op_detecPuntos( IplImage *Fuente, IplImage *Destino) void Op_detecLinHor( IplImage *Fuente, IplImage *Destino) void Op_detecLinVer( IplImage *Fuente, IplImage *Destino) tal que se pueda observar el resultado de aplicar filtros diferentes sobre la misma imagen original que se le pase como parmetro en la lnea de rdenes. Modifique, en cada versin, los valores de los elementos de la matriz m para implementar los filtros estudiados de deteccin de puntos, de lneas horizontales y de lneas verticales, respectivamente. b) Realice un detector de esquinas a partir de combinar la informacin obtenida con el detector de lneas horizontales y el de verticales. A partir del cdigo de opencv_sobel.c que implementa la funcin void Op_SOBEL( IplImage *Fuente, IplImage *Destino) c) Modifique la misma para que se visualice el efecto de cada mscara (bordes verticales y horizontales visualizados) por separado y la composicin de bordes que se obtienen al aplicar las dos mscaras o filtros estudiados en clase de teora y acumular correctamente los resultados parciales. Utilice el resultado devuelto por la funcin para ver un nuevo cuarto resultado que sea el AND lgico de la imagen de bordes final con la secuencia de imgenes RGB que se pueda obtener del fichero que se especifique como parmetro o de una cmara en su defecto. d) Incluya un control que permita variar, en tiempo de ejecucin, el ltimo parmetro de la funcin cvSobel, justificando los valores mnimo y mximo escogidos.

Responda a esta actividad creando un fichero comprimido (act5..zip) que contenga: el cdigo fuente realizado y las imgenes de los resultados parciales (deteccin de puntos act5p.jpg, de lneas horizontales act5lh.jpg, de lneas verticales act5lv.jpg, bordes verticales como act5v.jpg y los horizontales como act5h.jpg) y los nuevos resultados de deteccin esquinas (act5e.jpg ) y el final act5.jpg, la combinacin de Sobel y la imagen original. Utilice la orden $make act5.zip.

5. Conclusin
En esta prctica, el alumno habr utilizado las imgenes, ya disponibles en fichero, para realizar procesos sencillos utilizando la librera OpenCV en, al menos, uno de los dos sistemas operativos disponibles en el laboratorio. Se han realizado una serie de actividades para evaluar la capacidad de aplicar los resultados parciales que se han ido mostrando y se ha trabajado en la obtencin de resultados en fichero que demuestren lo realizado en las mismas. Tambin habr experimentado con las operaciones que permiten adquirir informacin visual de una cmara con la que tomar escenas del mundo real para utilizarlas de partida en la realizacin de una aplicacin multimedia. As mismo se habrn realizado operaciones donde la decisin u operacin es funcin de los valores de los puntos vecinos a uno dado y que hay que ponderar en la medida que la accin lo requiera mediante la definicin de un filtro.

6.Bibliografa y enlaces
[1] Open Computer Vision Library <http://sourceforge.net/projects/opencvlibrary/>. [2] OpenCVWiki <http://opencv.w.illowgarage.com/wiki/Welcome>. [3] Gary Bradski y Adrian Kaehler, Learning OpenCV: Computer Vision with the OpenCV, O'Reilly Press, Octubre 2008. [4] OpenCV 1.0 API <http://www.cs.indiana.edu/cgi-pub/oleykin/website/OpenCVHelp/>. [5] Computational Perception <http://www.hci.iastate.edu/575x/doku.php?id=>. [6] R. C. Gonzalez y R. C. Woods, Digital Image Processing, Addison-Wesley, 1993. [7] A. de la Escalera, Visin por computador. Fundamentos y mtodos, Prentice Hall, 2001. [8] Annotated Computer Vision Bibliography, <http://iris.usc.edu/Vision-Notes/bibliography/contents.html>. [9] Vadim Pisarevsky, Introduction to OpenCV, Intel Corporation, Software and Solutions Group. [10] D. Milln, Blog de Damiles <http://blog.damiles.com/?cat=12> sobre OpenCV, entre otras cosas. [11] A. Ivars, Trabajando con OpenCV, trabajo de la asignatura IMD, curso 2k8/2k9 <http://websisop.disca.upv.es/~imd/2k8-2k9/Treballs/Treballs/trabajandoConOpenCV>.

7. Anexo I. El entorno de desarrollo Code::Blocks


Code::Blocks <http://www.codeblocks,org> Code::Blocks is a full-featured IDE (Integrated Development Environment) aiming to make the individual developer (and the development team) work in a nice programming environment offering everything he/they would ever need from a program of that kind. Its pluggable architecture allows you, the developer, to add any kind of functionality to the core program, through the use of plugins... En el Wiki de OpenCV (<http://opencv.willowgarage.com/wiki/CodeBlocks>) se puede ver un resumen similar para trabajar con Code:.Blocks en MS/Windows, se observar que es anlogo a cmo crear un proyecto en este entorno de desarrollo en la plataforma GNU/Linux del laboratorio que se muestra a continuacin. Se puede empezar creando un proyecto desde cero con la opcin de men File | New | Project, con lo que aparece la caja de dilogo New from template, donde se habr de escoger el tipo de proyecto (console application) y aceptar con el botn Go. A partir de aqu el asistente nos guiar por las opciones de cada uno, en nuestro caso escogeremos lenguaje de programacin, directorio donde se ubicarn los ficheros, configuraciones para las versiones de desarrollo y de entrega, como se muestra en la siguiente secuencia de imgenes.

Una vez abierto, el entorno ofrecer una apariencia similar a la mostrada en la Figura 10.que muestra un momento de la etapa de depuracin de uno de los ejemplos de la prctica.

panel de edicin

panel de proyecto

panel de salida
Figura 10: Captura de pantalla de Code::Blocks durante la depuracin del primer ejemplo de la prctica. Siempre se puede encontrar esta informacin para actualizarla en la seccin de Management (el panel de proyecto) dentro de la pestaa Projects, el rea de trabajo (Workspace) del proyecto en que estamos interesados y al pulsar con el botn secundario en el nombre del proyecto. Es interesante establecer algunas opciones ms como que se genere informacin para poder depurar el proyecto, para ello hay que activar la opcin correspondiente en el men contextual del proyecto: apartado Build Options... Para poder utilizar las libreras de OpenCV se habr de indicar en el men contextual del proyecto: en su apartado Properties... > Libraries hay que escoger Known libraries opencv y utilizando el botn <, que est en el centro de las cajas de texto, aparecer en Libraries used in project. Estas etapas se muestran en las cuatro siguientes imgenes.

7.1 Organizacin en paneles Como se mostraba en la Figura 10 el entorno se divide en tres paneles: Management, edicin y Logs & others. Que se describen a continuacin. El panel de proyecto (Management) permite seleccionar tres vistas diferentes del proyecto: 1. Projects Permite acceder a los archivos que componen el proyecto. 2. Resources Permite modificar los recursos de la aplicacin (mens, iconos, cuadros de dilogo, etc.) 3. Symbols. Muestra la jerarqua de clases, as como los mtodos y atributos asociados a cada una. En el panel de edicin se realiza la edicin del cdigo fuente, los ficheros de cabeceras y de los recursos del proyecto. En el panel de salida se obtienen los informes generados por el proceso de compilacin y depuracin y los resultados de las bsquedas realizadas. 7.2 El Men de compilacin (Build) y depuracin (Debug) Las opciones ms interesantes para el desarrollo de esta prctica se encuentran centradas en las opciones de men Build y Debug, estas se muestras desplegadas para familizarizarse con los atajos de teclado (Figura 11) y con los iconos de las respectivas barras de herramientas (Figura 12). De ellas

destacamos unas pocas en cada grupo

Figura 11: Opciones de men desplegadas para compilacin (izquierda) y depuracin (derecha).

Figura 12: Barras de herramientas de compilacin (izquierda) y depuracin (derecha).

En el men de compilacin: Build. Es la opcin que se seleccionar para volver a crear el nuevo programa ejecutable cada vez que se realice un cambio en alguno de los archivos del proyecto. Recompila slo los archivos que han sido modificados desde la ltima construccin del ejecutable. Rebuild. Recompila el proyecto completo. Select target > Set Active Configuration. Permite seleccionar la configuracin activa: depuracin (Debug) o distribucin (Release). Para que pueda depurarse el programa es preciso haber seleccionado la configuracin Debug. En el men de depuracin: Start . Ejecuta el programa en modo de depuracin. Continue. Ejecuta de forma ininterrumpida. Step into. Ejecuta paso a paso. Si se trata de una llamada a funcin, el proceso paso a paso contina dentro de la funcin llamada. Step out. Ejecuta el resto del cdigo perteneciente a la funcin actual, hasta el retorno al punto del programa en que fue llamada. Run to cursor. Ejecuta hasta la posicin del cursor en el archivo actualmente en edicin.

You might also like