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:

No hay comentarios:

Publicar un comentario