sábado, 24 de marzo de 2012

Captura de vídeo

El vídeo analógico proveniente de la cámara es una señal analógica con una determinada temporización que nosotros no podemos controlar. Por tanto, para poder capturarla deberemos sincronizarnos adecuadamente con ella y realizar todas las tareas necesarias en tiempo real. Trabajaremos con vídeo compuesto en formato PAL.
La señal de vídeo tiene una estructura pensada para facilitar su visualización en los antiguos televisores con tubo de rayos catódicos. En el estándar PAL, cada fotograma mostrado en pantalla se divide en 625 líneas, y se envía en dos cuadros de 312,5 líneas, correspondiendo el primer cuadro a las líneas impares de la imagen y el segundo cuadro a las líneas pares. Se envían 50 cuadros por segundo, lo que corresponde a 25 fotogramas completos por segundo.


Cada línea de vídeo dura 64 microsegundos, de los cuales solo 52 se corresponden a vídeo, siendo el resto necesarios para sincronización. Un pulso de polaridad negativa respecto al nivel de tensión base de la señal indica el comienzo de cada línea, y en los 8 microsegundos siguientes se aprovecha para mandar varios ciclos de la portadora que modula las componentes de color de la señal compuesta de vídeo, para sincronizar el oscilador local del televisor. Este espacio estaba reservado para que el haz de electrones que dibujaba la imágen tuviera tiempo para desplazarse a la izquierda antes de comenzar a dibujar la siguiente línea.

Los 52us de vídeo son una señal continua cuya envolvente es la componente de luminancia, que es la que nos interesa a nosotros pues incluye la información de "blanco y negro" del vídeo. La información de color se envía modulada en una zona vacía del espectro de luminancia. La señal de luminancia adquiere niveles mayores de tensión cuanto más luminosa sea la imagen.


En la vida real, una parte de las líneas de video de la imagen no son visibles y al final de cada cuadro se incluyen una serie de pulsos de sincronismo vertical para dar tiempo a que el haz de electrones volviera a situarse en la esquina superior izquierda tras acabar de dibujar un cuadro. También hay parte de los 52us de vídeo por linea que no son visibles. Finalmente tendremos 288 líneas visibles por cuadro y unos 50,5 us visibles por línea de vídeo. En la imagen anterior se puede ver la temporización completa del video en formato NTSC, equivalente a la que utiliza PAL salvo por la diferencia en el número de líneas y la duración de cada línea. Comprobamos empíricamente que en el caso de PAL el vídeo visible comienza a partir de la línea 28, momento en que comenzamos la captura del cuadro.

Para capturar la señal aprovechamos los recursos disponibles del microcontrolador, ayudados por un circuito integrado LM1881 que extrae la información de sincronismo de la señal de vídeo y se la proporciona al PIC. Puede verse en el datasheet que se extraen los pulsos de sincronismo horizontal (al comienzo de cada línea de vídeo), las ráfagas de portadora que se mandan al principio de cada línea, la información referente a si el cuadro contiene líneas pares o impares y los pulsos de sincronismo vertical.

Conectamos las salidas de este integrado a varias entradas del PIC32 con capacidad para interrupción externa, según el siguiente esquema:


De las cuatro señales de sincronismo, utilizamos la que nos indica si el cuadro es par o impar (aparte de dar información de cuándo comienza el cuadro) y la señal que se sincroniza con las ráfagas de ciclos de portadora. También podría utilizarse de forma equivalente la señal de sincronismo horizontal si el sistema debiera lidiar con cámaras que no enviasen información de color.

Utilizamos un sistema basado en interrupciones y en el uso de los temporizadores para capturar la imagen, según el siguiente diagrama de flujo:



El PIC32 utiliza una arquitectura en la cual el tiempo que tarda en ejecutarse una instrucción no es determinista, debido a que depende de varios factores como los estados de espera que se hayan configurado para la flash y del estado de la caché de instrucciones en cada instante. Es por ello que debemos emplear un sistema basado en los periféricos del microcontrolador, y no en la cuenta de instrucciones, que es lo que suele hacerse en arquitecturas con tiempo de instrucción determinista.

Nuestra primera idea era capturar imágenes a 96x96 píxeles. Asiumiendo un tiempo de vídeo visible de 50,4us por línea, esto nos da que habría que muestrear la zona de vídeo cada 525ns. A 80MHz, esto nos da 42 ciclos de reloj entre cada interrupción para ejecutar el código que guarde el píxel capturado y de servicio a las interrupciones. Pudimos comprobar empíricamente que con este periodo de muestreo había casos en los que no daba tiempo a ejecutar todo el código y por tanto el tiempo de vídeo muestreado en la realidad era superior a 50,4us, saliéndose de la línea y muestreando erróneamente parte de la siguiente.

Ya que nuestra resolución de trabajo final iban a ser 24x24 píxeles, comprobamos si el filtro de mediana seguía trabajando bien a 48x48 píxeles, y tras comprobar que sí, decidimos muestrear finalmente la imagen a 48x48 píxeles, donde el tiempo entre muestras es suficiente, consiguiendo muestrear correctamente la línea completa de vídeo a intervalos regulares y deterministas.

No hay comentarios:

Publicar un comentario