lunes, 14 de mayo de 2012

Generación de gráficos

Para hacer más sencillo el uso del sistema decidimos incorporar una interfaz gráfica. Propusimos como mejora la integración de una pantalla con el sistema, para que fuera completamente autónomo. Sin embargo, el tiempo disponible no iba a ser suficiente para diseñar y fabricar la electrónica asociada a la pantalla, así que finalmente seguimos utilizando la pantalla del ordenador como medio de visualización. Eso sí, todos los gráficos se generan internamente en el PIC32 y al ordenador únicamente se le envían los valores de cada píxel.
El sistema gráfico trabaja a 48x48 píxeles debido a que ese es el tamaño al que capturamos las imágenes, y es una resolución suficiente para mostrar la información que queremos. Dado que el interés de la práctica  no radica en la creación de una interfaz gráfica sofisticada, hicimos la implementación de la forma más sencilla que se nos ocurrió. Partimos de nuestra imágen de 48x48 píxeles, que recordamos que se almacena con este formato en la RAM del PIC32:
 Ya que guardamos la imagen aprovechando cada bit para guardar un píxel y agrupándolos en bytes, lo más sencillo era realizar una interfaz gráfica completamente en blanco y negro, partiendo del fotograma en 48x48 que se genera tras el filtrado de mediana.
Los gráficos que se muestran por pantalla se guardan en la memoria flash del PIC como arrays con un formato similar al de la imagen de 48x48 guardando cada bit en un píxel. Estos iconos siempre tienen un tamaño horizontal múltiplo de 8 píxeles y podrán colocarse en cualquier posición vertical dentro de la imagen, y ocupando un número entero de bytes horizontales para simplificar el proceso de superposición sobre el fotograma. Esta restricción hace que incorporar un gráfico al fotograma sea tan simple como ir haciendo una operación de XOR entre un byte del fotograma y un byte del gráfico que deba caer en esa posición. Haciendo un XOR y considerando que aquellos píxeles del gráfico que lo definen valen 1 y el resto 0, tendremos que aquellas posiciones del fotograma ocupadas por el gráfico ven invertido el color de sus píxeles (recordemos que una operación de XOR con 1 invierte el bit correspondiente, y un XOR con 0 lo deja como estaba). Así, podremos mostrar la mano (o cualquier cosa que la cámara esté capturando) como fondo y superponer por encima los gráficos mientras seguimos viendo ambos elementos de la imagen simultaneamente. La siguiente foto es un simple ejemplo ilustrativo.
De esta forma conseguimos una forma muy rápida y sencilla de colocar gráficos sobre la imagen. La superposición de los gráficos se hace después de escalar el fotograma filtrado, almacenándose el fotograma completo a mostrar (gráficos incluidos) en la misma zona de memoria donde se encontraba el fotograma filtrado.
Nos hemos encargado de diseñar la mayoría de los gráficos que componen la interfaz. Algunos ejemplos son los siguientes:



El texto lo generamos con photoshop previamente en la mayoría de los casos, ya que el solo disponer de 6 posibles posiciones horizontales para colocar iconos nos limitaba a textos de máximo 6 letras, si utilizaramos una fuente y generaramos el texto dinámicamente en el PIC32. Lo que se almacenan son parches que contienen el texto a mostrar con una fuente lo más estrecha posible. Los números y algunos símbolos sí que generan utilizando una fuente de 8x8 píxeles de dominio público, que puede encontrarse aquí.






No hay comentarios:

Publicar un comentario