Pablo Barrera

31 January, 2005

Golpeado por C++ y rebotado a C#

Filed under: Uncategorized — Pablo @ 22:16

Hace ya más o menos un año que estoy liado con un programa en C++ para el seguimiento de objetos con varias cámaras, cuestión de la que ya he hablado. Hace tiempo que no cuento nada sobre él, sobre todo porque he estado bastante ocupado haciendo que funcionara. Más de una vez me he preguntado porqué elegí usar C++ en vez de algo más
razonable, como C#. Razonable pensando en todos los problemas que siempre encuentro al usar C++:

  • Los punteros son muy útiles para manejar memoria cruda. El resto del tiempo son un dolor de impresión. Las referencias son mucho más fáciles de tratar.
  • El manejo de memoria con delete explícitos es como para liberar recursos en un momento dado. Con recolectores de basura es más difícil determinar cuando se borra un objeto. Aún así es un precio pequeño a pagar por tener las ventajas de un recolector de basura. Los delete se olvidan, a veces no sabes dónde hacerlos, los objetos se quedan o se borran antes de lo necesario. Segundo dolor de cabeza.
  • En general cuando un objeto se usa en dos sitios a la vez es difícil de saber cuándo hay que borrarlo. Estos problemas se pueden solucionar recubriendo los objetos con unos punteros inteligentes y unos contadores de referencia. Es bastante transparente, pero no deja de ser una solución artística.
  • La velocidad de C++ es alta. Muy alta. Eso sí, si eres capaz de compilarlo con -O3, claro. Una parte importante de los bugs (o por lo menos de los míos) aparecen mucho más claros con -O3. Para seguir usando el programa tiene a usar -O0, haciendo que las ventajas de velocidad ya no sean tan evidentes.
  • C++ es un buen lenguaje, pero no tiene las cosillas molonas de las nuevas generaciones de lenguajes. Por ejemplo la identificación de tipos en C++ solo aparece según el compilador usado. Esto hace que no sea utilizable si quieres tener la posibilidad de portar el código o por lo menos de usarlo en otras máquinas con compiladores diferentes.

Al final, tras dos días de depuración intensa, implementar punteros inteligentes e identificación de tipos el programa empezó a funcionar correctamente. La velocidad del resultado es buena, pero no consigo usar la optimización. Hay todavía unos cuantos bugs dispuestos a morderme detrás de la esquina. Esto me hace plantearme como de bueno sería este programa en C# y Mono. Con esta opción tendríamos desde el principio el recolector de basura y la identificación de tipos. Pero ¿sería suficientemete rápido?

Este pregunta no tiene una respuesta tan inmediata. Mucho se ha escrito acerca de la eficiencia de C# y Mono pero lo mejor es hacer una prueba para el entorno en que te mueves. En mi caso porté una un filtro de color a C# usando código unsafe y algún punterillo que otro. Para imágenes de 320×240 obtuve los siguientes resultados:

Comments

21 January, 2005

Localización tridimensional usando un filtro de partículas

Filed under: Uncategorized — Pablo @ 11:08

Durante las últimas semanas he estado terminando el programa de localización tridimensional de un objeto de color usando dos cámaras. La idea es la siguiente: queremos obtener las posición tridimensional de un objeto en movimiento, descrito por su color, visto desde dos o más cámaras.

El funcionamiento del sistema es bastante sencillo. Mantener una representación completa del espacio, en términos, por ejemplo de probabilidad de la existencia de una objeto, es muy costoso computacionalmente. Existen técnicas para reducir este coste computacional realizando un muestreo inteligente de esta función de probabilidad, por ejemplo las técnicas de MonteCarlo. En particular nosotros empleamos un filtro de partículas para mantener una representación de la densidad de probabilidad de la existencia de un objeto en el espacio. En él las partículas pueden verse como posibles realizaciones del objeto en el espacio, es decir, podemos interpretar las partículas como puntos en el espacio tridimensional real.

Para contrastar estas hipótesis con la realidad tomada desde las cámaras proyectamos dichos puntos sobre los planos de imagen. Comprobando el color de los puntos proyectados y el de sus vecinos podemos realimentar la cercanía de la partícula con el objeto real.

En la siguiente imagen podemos ver el sistema en funcionamiento, convergiendo hasta la posición real del objeto (la pelota rosa).

Trabajo, trabajo, trabajo

Filed under: Uncategorized — Pablo @ 11:01

Hace ya bastante tiempo que no escribo en la bitácora. La verdad es que estado bastante liado en la universidad y no he tenido tiempo ni para esto. Ayer el pico fuerte pasó el pico más fuerte. Teníamos que terminar un artículo para una conferencia sobre reconocimiento de patrones y visión computacional, la PRCV2005.

El deadline para presentar el artículo era ayer, día 20 de enero. Ahora sé porqué se llama así, tras dieciséis horas de sprint en las que por poco palmo. Hubiera sido más tiempo pero los servicios de seguridad de mi universidad me desalojaron a la una de la mañana puesto que un becario no puede estar tanto tiempo aquí por motivos de seguridad. Sigo ascendiendo meteóricamente puestos en la lista de delincuentes peligrosos‘. Entre esto y que no me abren las puertas cuando llego me traen por la calle de la amargura.

Ahora solo queda terminar el resto del trabajo: otro artículo para una conferencia ingeniería del software libre, un estudio sobre comunidades de software libre para el proyecto Morfeo y terminar la corrección de un libro con Teo. Cuando termine todo esto seré un hombre libre. ¿O no?

Powered by WordPress