jueves, 27 de febrero de 2014

Semana 6

Para esta entrega, los avances en la tesis en cuanto a redacción fueron:
  • Inicio de la sección "Solución propuesta"; creación de esqueleto y llenado de lo posible a momento.
  • Finalización de la sección "Introducción" (retrasada)
  • Finalización de las secciones "Literatura existente" y "Trabajos similares" (retrasados)
  • Ajustes varios al documento
En cuanto al proyecto en sí, el avance corresponde al inicio del desarrollo de la pequeña librería de realidad aumentada mediante visión computacional que se usará.

Más específicamente el avance es la calibración de la cámara para encontrar la "pose" o por así decirlo orientación de algún plano (en este caso una tabla de ajedrez) en un ambiente 3D, a partir de una imagen.
Esto lo hice mediante OpenCV y python.

Para calibrar la cámara son necesarias imágenes de muestra. En un caso práctico de realidad aumentada estas se pueden ir tomando a como se utiliza la aplicación, pero por simplicidad por ahora utilizo imágenes de los samples de openCV. El objetivo es obtener las esquinas, refinarlas y guardarlas en una lista para usarlas en la calibración de la cámara.

Posteriormente, se obtiene una matriz con la cámara calibrada, y junto a la original se pueden usar para deshacer la distorsión en imágenes y obtener líneas rectas en las esquinas.

He aquí una comparación entre una imagen normal distorsionada, y una eliminando distorsión utilizando la nueva matriz con la cámara calibrada.


Imagen original

Imagen con distorsión removida, las líneas son más refinadas


Nota: Dependiendo de la calidad de la cámara, este paso puede ser innecesario (si la calidad es alta la distorsión será prácticamente nula y es posible utilizar la matriz actual de la cámara).

El siguiente paso es, para cada imagen posterior de la cámara calibrada, encontrar la pose de algún objeto 2D dentro de un ambiente 3D. Para esto primero localizamos los puntos 2D utilizando alguna función para obtener características de lo que deseamos proyectar (en este caso obtenemos las esquinas).

En un caso inicial se busca obtener los ejes proyectados como ejemplo. Proyectando los puntos de las esquinas, después podemos dibujar líneas entre los nuevos puntos 2D proyectados para obtener lo siguiente:



Ahora tenemos una idea de la orientación del objeto (tabla de ajedrez) en cuanto a la cámara. Con ello podemos dibujar y rotar sobre la posición algún objeto 3D. 

Buscando opciones encontré que existe un plugin (no exactamente una librería, sino un pequeño ejemplo) útil para dibujar archivos .obj (Meshes 3D) en una ventana mediante pygame, además de permitir dibujar figuras simples como: cubos, esferas, triángulos, etc.

He aquí el ejemplo corriendo:


Cargando un modelo diferente:



Con lo anterior, la idea se convierte en colocar como fondo el feed de la cámara (o en este caso las imágenes de prueba) y mover el objeto 3D a la posición deseada dentro de la imagen (en coordenadas x, y) y rotarlo con los datos obtenidos previamente.

En la siguiente semana mi objetivo será ese, escondiendo los comandos de visión computacional complejos detrás de clases para lograr hacerlo en la menor cantidad de líneas posible.

El código se puede localizar en github, como siempre:
Referencias usadas:

viernes, 14 de febrero de 2014

Semana 4: Búsqueda y clasificación de trabajos relacionados

Para esta semana, me dedique a buscar trabajos relacionados a mi tema de tesis. Por ahora, la idea es implementar un videojuego utilizando realidad aumentada, por lo cual las búsquedas que utilicé para encontrar los documentos fueron algo como: "augmented reality game", "augmented reality interface", "augmented reality videogame" y sus equivalentes en español.
Los documentos que escogí fueron:
  • Broll, W., J. Ohlenburg, I. Lindt, I. Herbst y A.-K. Braun, ((Meeting Technology Challenges of Pervasive Augmented Reality Games)), en Proceedings of 5th CM SIGCOMM Workshop on Network and System Support for Games, NetGames ’06, ACM, New York, NY, USA, 2006, URL http://doi.acm.org/10.1145/1230040.1230097.
  • Geiger, C., J. Stoecklein, F. Klompmaker y R. Fritze, ((Development of an Augmented Reality Game by Extendinga 3D Authoring System)), en Proceedings of he International Conference onAdvances in Computer Entertainment Technology, ACE ’07, ACM, New York, NY, USA, p ́gs. 230–231, 2007, URL http://doi.acm.org/10.1145/1255047.1255099.
  • Gerhard Reitmayr, D. S., Location based Applications for Mobile Augmented Reality, Vienna University of Technology, 2003.
  • Huynh, D.-N. T., K. Raveendran, Y. Xu, K. Spreen y B. MacIntyre, ((Art of Defense: A Collaborative Handheld Augmented Reality Board Game)), en Proceedings of the 2009 ACM SIGGRAPH Symposium on Video Games, Sandbox ’09, ACM, New York, NY, USA, p ́gs. 135–142, 2009, URL http://doi.acm.org/10.1145/1581073.1581095.20
  • Tan, C. T. y D. Soh, ((AUGMENTED REALITY GAMES: A REVIEW)), , octubre 2010.
  • Wagner, D. y D. Schmalstieg, ((Design Aspects of Handheld Augmented Reality Games)), Pervasive Gaming Applications, Diciembre 2007.
  • Weidong Huang, M. A. L., Leila Alem, Human Factors in Augmented Reality Systems, Springer, marzo 2011.
  • WEILGUNY, M., Design Aspects in Augmented Reality Games, Vienna University of Technology, junio 2006.
  • Wetzel, R., R. McCall, A.-K. Braun y W. Broll, ((Guidelines for Designing Augmented Reality Games)), en Proceedings of the 2008 Conference on Future Play: Research, Play, Share, Future Play ’08, ACM, New York, NY, USA, p ́gs. 173–180, 2008, URL http://doi.acm.org/10.1145/1496984.1497013.
  • Rohs, M., ((Marker-Based Embodied Interaction for Handheld Augmented Reality Games)), Journal of Virtual Reality and Broadcasting, 2007.

En cuanto a avances en el repositorio, esta semana no agregué nada en absoluto, ya que me dedique a buscar librerías que pudieran ser útiles para la implementación de realidad aumentada en Android. Buscando eso encontré DroidAr, que tiene diferentes módulos para agregar interacción con el GPS, la cámara y detección de marcadores entre otros.

A continuación algunas capturas de los demos corriendo en una tablet Samsung Galaxy Tab.




jueves, 6 de febrero de 2014

Tesis: Semana 3

Para esta semana dedique el progreso en el código a trabajar un poco con geolocalización. Aún concentrado en entornos de PC, investigué un poco acerca de las opciones existentes para poder obtener información de la localización, sin éxito alguno ya que la mayoría de opciones eran de paga, además de que no contaban con una precisión adecuada.

Para compensar esto, realicé una pequeña conexión entre una simple aplicación de android y un programa en un servidor local para poder utilizar una tablet (o cualquier dispositivo Android con GPS y conexión a Internet local) y de ella extraer las coordenadas de latitud y longitud actuales.

Ya obtenidas se hace un POST HTTP a un script de python que en un futuro hara un uso de ellos (la idea es usarlos en conjunto con la información de los sensores para manipular alguna cámara en un entorno 3D utilizando THREE.js). 

Por ahora el script imprime el "Zen de Python" al hacer import this solo para comprobar que el request se hace exitosamente y la información regresa a la aplicación de Android.

A continuación una captura realizada desde la tablet:


Como mencioné, se imprime el Zen de python para validar que se hizo un request y se regreso con el contenido, además de al final donde se imprimen las coordenadas de latitud y longitud que se usarán después.

Como siempre el código se puede encontrar en el repositorio: