Isidoro-TFM-Rovio02
thumb|right|200px|Rovio, la cámara web móvil.
El trabajo que aquí se va a presentar trata sobre la aplicación del robot ROVIO de la empresa Wowwee Technologies a tareas de vigilancia. Para ello se utilizará la biblioteca de visión artificial OpenCV, que será la encargada de procesar la información proviniente de la cámara wifi de ROVIO en un ordenador portátil. Como sistema operativo de base para el desarrollo de esta aplicación se utilizará GNU/Linux, en concreto la distribución Ubuntu. La aplicación será desarrollada enteramente en lenguaje C.
Contents
Introducción
Pendiente de redacción...
OpenCV
Si se desea profundizar en OpenCV hay varias fuentes de donde obtener información. Una de ellas es el libro Learning OpenCV: Computer Vision with the OpenCV Library escrito por Gary Bradski y Adrian Kaehler y publicado por la editorial O'Really. En la página web de OpenCV, WillowGarage, también existe abundante información para quienes no dispongan del libro en cuestión. Y en la Red hay numerosa información relacionada con el uso de la biblioteca, que si bien puede estar más o menos desperdigada, también supone una buena fuente de consulta. Por último, los ejemplos que se incluyen en la biblioteca también son una fuente de informacación utilísima. En el desarrollo de este trabajo se han utilizado todas estas fuentes en mayor o menor medida.
Instalación de la biblioteca
Para realizar la instalación de cualquier aplicación o biblioteca en GNU/Linux lo más cómodo suele ser utilizar los paquetes correspondientes. Los usuarios de Ubuntu pueden usar Synaptic (Sistema/Administración/Gestor de paquetes Synaptic) que es la interfaz gráfica por defecto en estos momentos para gestionar los paquetes, aunque también se puede instalar desde la línea de comandos de un terminal:
<geshi lang=Bash lines=0>~$ sudo aptitude install libcv4 libhighgui4 libcvaux4 libcv-dev libhighgui-dev libcvaux-dev opencv-doc</geshi>
Los tres primeros paquetes corresponden a la biblioteca propiamente dicha, por tanto son imprescindibles. Los tres siguientes con el sufijo -dev son los ficheros de desarrollo que también los necesitaremos si queremos desarrollar aplicaciones con esta biblioteca. El último paquete contiene programas de ejemplo y documentación sobre OpenCV y aunque no es imprescidible para trabajar, sí que es recomendable como fuente de consulta. Si se quiere contar con la última versión de las bibliotecas se puede realizar una instalación manual de las mismas a partir de sus fuentes siguiendo el proceso descrito para tal fin en WillowGarage.
Operaciones básicas
Una vez que tenemos preparado el sistema con todo el software necesario, es el momento de la primera toma de contacto con OpenCV. Este apartado no pretende ser un tutorial completo y exahustivo sobre cada una de las funciones que posee OpenCV si no más bien un sendero abierto que conduce directamente hacia el objetivo principal de este trabajo. Y lo mejor es comenzar poco a poco de manera que nuestra primera incursión sea lo menos traumática posible. Por tanto, los primeros programas que vamos a desarrollar consistirán en una serie de operaciones básicas que conviene aprender bien al principio pues serán imprescidibles para el desarrollo de la aplicación.
Las primeras operaciones que se realizarán serán mostrar una imagen y un vídeo que están guardados en el disco duro e interceptar el flujo de vídeo de una cámara para mostrarlo en pantalla.
Mostrar una imagen en pantalla
El código que se muestra a continuación nos muestra en pantalla la imagen que reciba como argumento en la línea de comandos.
<geshi lang=C lines=0>#include "highgui.h"
int main(int argc, char* argv[]) {
IplImage *img = cvLoadImage(argv[1]);
cvNamedWindow("imagen", CV_WINDOW_AUTOSIZE); // Crea la ventana donde mostrar la imagen cvShowImage("imagen", img); // Muestra la imagen en la ventana.
cvWaitKey(0); // Espera que se pulse una tecla.
cvReleaseImage( &img ); // Retira la imagen de la ventana. cvDestroyWindow("imagen"); // Libera la memoria.
return 0; }</geshi>
Si guardamos este código con el nombre ejemplo_01.c y lo compilamos con g++ de la forma:
<geshi lang=Bash lines=0>~$ g++ -o ejemplo_01 ejemplo_01.c -Wall -I /usr/include/opencv -L /usr/lib -lm -lhighgui</geshi>
deberíamos poder obtener un fichero que ejecutaríamos mediante la orden
<geshi lang=Bash lines=0>~$./ejemplo_01 mi-imagen.xxx</geshi>
siendo mi-imagen.xxx el nombre del fichero con la imagen que queremos mostrar. OpenCV soporta formatos de imagen del tipo JPEG, BMP, PNG, PGM y TIFF entre otros. Si todo ha ido bien, se debería ver la ventana creada con la imagen en su interior. Si pulsamos una tecla, la ventana se cierra y finaliza el programa.
El código del ejemplo está bien comentado y apenas necesita explicación. Cada vez que se necesite mostrar una imagen en pantalla con OpenCV, el procedimiento será siempre el mismo, tal y como se ve en el ejemplo:
- Se creará una variable de tipo IplImage que guardará la imagen en forma de matriz de puntos y se indicará a la biblioteca que la cargue en memoria mediante la orden cvLoadImage.
- Se creará la ventana donde se va a visualizar la imagen. Esto siempre es necesario, siempre hará falta un soporte sobre el que colocar las imágenes. En todo lenguaje de programación que incluya interfaces gráficas es necesario un contenedor donde se ponen o colocan los demás componentes de la interfaz y OpenCV no es una excepción.
- Se pedirá a la librería que muestre la imagen dentro de la ventana correspondiente mediante la orden cvShowImage.
Una vez que ya no se necesite la imagen, será necesario liberar el espacio de memoria que ocupó la imagen para evitar saturarla. Esta operación se realiza mediante las órdenes cvReleaseImage que elimina la imagen de la ventana que la soporta y cvDestroyWindow que elimina de la memoria del equipo la ventana que contenía a la imagen mostrada.
En el ejemplo anterior se podría comprobar que se ha dado el nombre/ruta de una imagen como argumento en la línea de comandos antes de cargar la imagen para no producir un error en tiempo de ejecución. También se podría comprobar que la operación de carga de la imagen ha tenido éxito ---o no--- mediante la adición de código extra, pero se ha preferido evitar esto para mantener el ejemplo lo más simple y claro posible para su mejor entendimiento.
Abrir un archivo de vídeo
El siguiente ejemplo que se mostrará tratará de abrir un archivo de vídeo almacenado en el disco duro del ordenador para que pueda ser visualizado en pantalla.
<geshi lang=C lines=0>#include "highgui.h"
int main(int argc, char* argv[]) { cvNamedWindow("ventana_video", CV_WINDOW_AUTOSIZE); CvCapture* flujo_video = cvCreateFileCapture(argv[1]); IplImage *fotograma;
while(1){ fotograma = cvQueryFrame(flujo_video); if (!fotograma) break; cvShowImage("ventana_video", fotograma);
cvWaitKey(0); }
cvReleaseCapture( &flujo_video ); cvReleaseImage( &fotograma ); cvDestroyWindow("ventana_video");
return 0; }</geshi>
Seguimiento de colores
Pendiente de redacción
Anexos
Anexo A: Configuración de ROVIO
Pendiente de redacción
Anexo B: Comandos de control de ROVIO(?)
Pendiente de redacción
Anexo C: Hardware de ROVIO(?)
Pendiente de redacción