lunes, 7 de diciembre de 2009

Empezando a construir ...

Como primer hito en el camino hacia el fin de este proyecto, la idea fue la construcción de un interfaz de usuario simple, para la reproducción de un video. Esto es, una ventana básica, con un filepicker, para seleccionar un archivo de video local a reproducir, un area de reproducción, y un botón para iniciar la reproducción.

Aquí entra en juego la librería para la generación de la GUI, y la librería para el manejo de archivos de video, y el handicap de fusionar ambas para llegar a un fin común.

En primer lugar, se barajo la opción de usar un GUI Builder adaptado a WxWidgets, es decir, una aplicación que te permita diseñar la GUI en modo visual y genere el código automaticamente.

Estuve trabajando con una aplicación opensource llamada wxFormBuilder, intentando generar una GUI básica para la visualización de videos.

http://wxformbuilder.org/

Después de cacharrear, y analizar el código generado, y comprobar las pocas opciones que te brindaba, decidí programar a mano el interfaz. Para ello seguí algunos manuales y tutoriales para conseguir unos conceptos básicos del funcionamiento de la librería.
Además del manual oficial, recomiendo los tutoriales ofrecidos en la wiki oficial de WxWidgets:

http://wiki.wxwidgets.org/Guides_%26_Tutorials

Despúes de algunos días se consiguió programar un interfaz básico para mostrar un video, controlando los eventos de los botones, etc ...

Aparecieron problemas con los literales usados en la programación del interfaz, relacionados con el tratamiento Unicode de los mismos (debido a que al recompilar las librerias, se eligioó esta opción)

Siguiente paso: conseguir que las estructuras de datos manejadas por OpenCV, se adapten a las funcionalidades del GUI, para conseguir mostrar un video real en el interfaz creado.

Primeros pasos con OpenCV

Después de documentarme sobre conceptos básicos sobre estructuras de datos y uso de los diferentes módulos de OpenCV, me dispongo ha compilar, debuguear y generar un ejecutable de programas simples, para comprobar el funcionamiento de la librería.

Básicamente la utilización principal que se le va a dar a la librería es la apertura de un archivo de video, y la obtención de cada frame en una matriz de datos, para después aplicar los algoritmos de seguimiento de objetos que vayamos estudiando.

Algunos conceptos básicos, aunque ya algo desfasados, los podemos encontrar en la siguiente URL:

http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/index.html

Para conseguir ejecutar y debugear código de la librería bajo MSVC++ es necesario setear varias variables del IDE, como directorios de inclusión, opciones de linker, tanto en modo release como debug ...

Podemos encontrar una idea generar en este link:
http://zarzamora.com.mx/archivo-historico/316

El principal escollo que encontré, después de los típicos problemas surgidos en un principio, fue al intentar utilizar el debugger del IDE sobre código de la librería. Después de setear los directorios de inclusión (opencv/include), añadir al path el bin del opencv, añadir al vinculador los directorios de librerías generados , y las librerías estaticas , se obtenían errores al hacer debugings.
Una de las cosas a tener en cuenta es asegurarse de setear la opción de generar información de debug, para que se genere el fichero .pdb, en el que se basa el MVC++ para cargar los símbolos de debugeo.

Otro problema con el que me enfrente, consistió en que no se cargaban los símbolos necesarios para conseguir que la herramienta de depuración se detuviera en los puntos de ruptura especificados. Tras varios días de investigación, las soluciones encontradas para evitar estos errores, partieron de una configuración diferente de la herramienta de debug, obligando a la herramienta a generar una BBDD local para usar en el modo debug.

Una vez en modo debug, es posible analizar los símbolos que han sido cargados en el apartado Módulos de la ventana debug.

Integrando MSVC++ con OpenCV 1.2

En primer lugar descargamos el paquete de la librería, para Windows desde la página oficial del proyecto en sourceforge:

http://sourceforge.net/projects/opencvlibrary/


Como enlaces de referencia oficiales, existen una wiki y una comunidad en yahoo enfocados a el uso de esta librería:

http://opencv.willowgarage.com/wiki/


http://tech.groups.yahoo.com/group/OpenCV/

Despúes de instalar el paquete, adaptamos las librerías para nuestro IDE. Con la herramienta cmake generamos las bibliotecas necesarias para visual estudio, tanto para debug como para release. Con la herramienta generamos las soluciones para el msvs y después, utilizando visual studio genero las bibliotecas correspondientes (en este caso en opencv/binarios), siguiendo el fichero INSTALL de la instalación de opencv1.2.

Integrando MSVC++ con WxWidgets 2.8.10

Después de entrar en contacto con Visual Studio, a través de varios manuales, y tomar de nuevo contacto con el lenguaje C++ que ya tenía algo olvidado, me encontré con algunos problemas de funcionamiento de este IDE bajo Windows Vista.
Después de investigar, pude solucionarlos instalando algún parche. Los problemas tenían su origen en las politicas de permisos que maneja el Vista.

A continuación me dispuse a instalar las librerías de WxWidgets, para programar bajo Visual Studio.

Las librerías se pueden obtener de manera gratuita en su página oficial, donde podemos observar capturas de interfaces de diversas aplicaciones codificadas con esta librería.
http://www.wxwidgets.org/
La comunidad aporta un foro muy interesante para compartir información
http://wxforum.shadonet.com/index.php

El proceso para instalar las librerías en consonancia con nuestro IDE consiste en, una vez instaladas, recompilarlas para generar unas bibliotecas con las caracteristicas elegidas en función la uso que le vamos a dar en nuestro proyecto.

En mi caso la opción elegida fue bibliotecas tanto para modo release y debug, con caracteres Unicode. Se puede seguir el proceso en el siguiente enlace, omitiendo la parte de las cabeceras precompiladas.

http://geeks.ms/blogs/rfog/archive/2007/01/06/wxwidgets-con-visual-studio-2005.aspx

domingo, 6 de diciembre de 2009

Elección, instalación, configuración y familiarización con librerias para manejo de videos


Debido a que el transfondo de este proyecto se basa en manejar videos y aplicar diversas operaciones y algoritmos sobre éstos, es claro que una de las decisiones más importantes parten de la correcta elección de una librería para manejar los videos. Las opciones consideradas han sido las siguientes:


- OpenCV



OpenCV (Open source Computer Vision library) es una librería abierta desarrollado por Intel. Esta librería proporciona un alto nivel funciones para el procesado de imágenes. Estas librerías permiten a los programadores para crear aplicaciones poderosas en el dominio de la visión digital. OpenCV ofrece muchos tipos de datos de alto-nivel como juegos, árboles, gráficos, matrices, etc. OpenCV es opensource para poder funcionar en muchas plataformas.

- Microsoft DirectShow (DirectX)




DirectX proporciona una plataforma estándar de desarrollo permitiendo a los programadores del software tener acceso a características específicas del hardware sin tener que escribir código de bajo nivel.


- FFmpeg



es una colección de software libre que puede grabar, convertir y hace streaming de audio y vídeo. Incluye libavcodec, una librería de códecs. FFmpeg está desarrollado en Linux, pero puede ser compilado en la mayoría de los sistemas operativos, incluyendo Windows.


- Varios paquetes comerciales

Matrox Imaging Library (MIL) , Khoros, Exbern, Aphelion, HIPS.


La elección final fue OpenCV .La librería proporciona un marco de trabajo de alto nivel para el desarrollo de aplicaciones de visión por computador en tiempo real: estructuras de datos, procesamiento y análisis de imágenes, etc. Este marco facilita bastante la implementación de distintas técnicas de visión por computador, aislando al desarrollador de las peculiaridades de los distintos sistemas de visión.

Ofrece bibliotecas de tipos de datos estáticos y dinámicos (matrices, grafos, árboles, etc.), herramientas con la posibilidad de trabajar con la mayoría de las capturadoras/cámaras del mercado, entornos de desarrollo fáciles e intuitivos y todo ello, corriendo en dos de los sistemas operativos más utilizados del mundo Microsoft® Windows y Linux.


Elección, instalación, configuración y familiarización con librerias para creacción de GUI's a utilizar

Una vez elegido el Visual Studio como IDE para el desarrollo del PFC, lo más lógico sería utilizar sus capacidades para la creacción de GUIs, a partir de las MFC incluidas en esta herramienta. El problema que esto nos limitaría en cuanto a portabilidad, por tanto, se han buscado varias alternativas que se muestran a continuación:

● QT (Trolltech):



Qt es una biblioteca multiplataforma para desarrollar interfaces gráficas de usuario. Fue creada por la compañía noruega Trolltech. Qt es utilizada en KDE, un entorno de escritorio para sistemas como GNU/Linux o FreeBSD, entre otros.

● WxWidgets:



Las wxWidgets son unas bibliotecas multiplataforma y libres, para el desarrollo de interfaces gráficas programadas en lenguaje C++.

Las wxWidgets proporcionan una interfaz gráfica basada en las bibliotecas ya existentes en el sistema (nativas), con lo que se integran de forma óptima y resultan muy portables entre distintos sistemas operativos. Están disponibles para Windows, MacOS, GTK+, Motif, OpenVMS y OS/2.

La elección final fue WxWidgets.

La principal diferencia de las dos opciones presentadas frente a .NET, es que son realmente multiplataforma, por lo tanto, las aplicaciones creadas con ellas, pueden ejecutarse en Windows, Mac o Linux mediante una recompilación.

La primera de las opciones (QT), tiene la desventaja de que, además de ser de pago (aunque tiene una versión opensource), el C++ que utiliza (al igual que .NET), no es C++ puro, necesita de un metacompilador que nos genere las clases.

En el caso de wxWidgets, ésta si es opensource y con ella se han realizado una gran cantidad de proyectos importantes, como por ejemplo el IDE Code::Blocks, que he comentado anteriormente, y otros como el reproductor multimedia VLC.

martes, 3 de noviembre de 2009

Elección, instalación, configuración y familiarización con IDE a utilizar

El lenguaje de programación en el que se va a desarrollar el proyecto es el C++. Lo ideal sería que el código resultante fuera portable, para poder compilarlo bajo cualquier sistema operativo. Antes de decantarme por un IDE en concreto para desarrollar código, he optado por investigar las posibilidades que existían, probarlas, y elegir la que mas se adapte a mis necesidades, teniendo en cuenta que voy a trabajar bajo plataforma Windows Vista (en SSOO operativo que venía por defecto en el portátil adquirido para el desarrollo del PFC). Las opciones que he considerado son las siguientes:


- Dev C++



- Code::Blocks



- Eclipse (+ CDT)



- Visual C++



Todas las opciones fueron instaladas y testadas. Las tres primeras tienen la ventaja de ser open-source y gratuitas, pero al final me decanté con el IDE de Microsoft, ya que no es comparable en cuanto a potencia y debuger.

La única pega es encontrar una librería para generar GUI's multiplataforma, que sea potente y gratuita, y sea compatble con ese GUI.


lunes, 2 de noviembre de 2009

Introducción

Este blog nace con la idea de convertirse en una forma de seguimiento de los pasos que se van tomando para la resolución del proyecto fin de carrera "Seguimiento de objetos en vídeos digitales".

La intención es facilitar el a mis tutores Pablo García y Andrés Caro, el conocimiento del estado actual en el desarrollo, los problemas que van surgiendo y la posibilidad de aconsejar o dar ideas sobre las posibles ramificaciones y decisiones que se vayan dando.

Después de aproximadamente 2 meses trabajando en ello con dedicación única, crearé una serie de entradas en el blog, para resumir las etapas que han ido apareciendo. La intención de aqui en adelante es una actualización frecuente para conseguir un mejor seguimiento.

Espero que nos resulte de utilidad.