CondorWebcam

by

=Introducción= Una de las aplicaciones en auge de los sistemas embebidos se relaciona con la capacidad de estos sistemas de capturar imágenes, ya sean estas fijas o segmentos de vídeo. Esto puede ser de especial utilidad en sistemas de seguridad autónomos, por ejemplo, o en general en cualquier aplicacion que pueda requerir una interacción precisa entre el sistema y el entorno.

Para desarrollar una aplicacion de este tipo, existen un gran numero de herramientas de software bien documentadas y de fácil acceso, que ademas son compatibles con la mayor parte del hardware disponible en el mercado (i.e. webcams). Entre estas herramientas (API's) se destacan AVFoundation para el entorno de Mac OS, DirectShow y Media Foundation en el caso de el entorno Windows, y Video for Linux 2 o V4L2 en el caso del entorno de linux. Esta ultima, por ser linux el sistema convencionalmente usado en la condorboard, sera la API que se usara para el desarrollo de la aplicacion.

Breve Introducción a Video for Linux 2 o V4L2
Video for linux 2 o V4L2 es la API (aplication programming interface) usada para realizar captura de video en entornos linux. V4L2 es el sucesor de V4L y comenzó a distribuirse con el kernel de Linux a partir de la versión 2.5.X. Actualmente, un gran numero de webcams, SoC cameras y sintonizadores de radio y TV se encuentran soportadas por esta API.

Básicamente, programar una aplicacion mediante esta API consiste en llevar a cabo los siguientes pasos:


 * Abrir el Dispositivo de Captura.


 * Ajustar los parámetros del dispositivo (Brillo, contraste, estándar de vídeo, etc.).


 * Negociar el Formato de los datos.


 * Negociar el método de entrada/salida.


 * Realizar la captura como tal.


 * Cerrar el dispositivo.

En la practica no es necesario ejecutar todos los pasos, pues, por ejemplo, los parametros del dispositivo pueden dejarse por defecto en algunos casos. Esto depende, en general, del tipo de dispositivo que se este usando. Por ejemplo, en el caso de una webcam generica, del tipo que tiene ajuste de brillo y contraste automático, el ajuste de estos parámetros puede obviarse. En el caso de una camara mas sofisticada, obviar este ajuste puede resultar en una imagen completamente negra.

=Configuración del Kernel= Antes de ejectutar (o desarrollar) aplicaciones en el espacio de usuario, es necesario instalar un controlador compatible con la camara que se este usando. En este caso, se tiene una camara USB generica compatible con el driver UVC (universal video capture). Lo que se debe hacer entonces, es habilitar el respectivo controlador en el menu de configuracion del kernel de la siguiente forma:

make ARCH=arm CC=arm-angstrom-linux-gnueabi- menuconfig
 * Se debe acceder al menu de configuracion del kernel desde el terminal despues de hacer cd hasta la carpeta con el kernel:

Device Drivers --> Multimedia Devices --> <*> Video for Linux [*] Video Capture Adapters ---> [*] Autoselect pertinent encoders/decoders and other helper chips [*] V4L USB Devices ---> <*>  USB Video Class (UVC) [*]    UVC input events device support En este ultimo paso, tambien se pueden seleccionar como modulos aquellos elementos o caracterisiticas del kernel que se seleccionan mediante "< >", en cuyo caso se selecciona de la siguiente manera "".
 * Luego, navegar hasta el menu multimedia devices y habilitar video4linux:


 * Por ultimo, se compila el kernel con la configuracion seleccionada, se crea la imagen y se copia al sistema de archivos de la condor. O en caso de que se hayan compilado las caracteristicas del kernel como modulos, se copian los modulos al sistema de archivos. Recordemos que para compilar se usa el siguiente comando:

make ARCH=arm CC=arm-angstrom-linux-gnueabi-

=Herramientas de Captura= De todas las herramientas de captura que se pueden encontrar para linux, como MPlayer, GStreamer, FFMPEG, etc. Se seleccionaron FFMPEG, por ser la mas completa, y las librerias de la API v4l2, por ser la mas directa e ilustrativa.

Mediante la API de V4L2
En esta seccion se explica, muy brevemente, el funcionamiento de un aplicativo por linea de comandos que toma un fotograma del dispositivo de captura v4l y lo almacena en formato jpeg. Este ejemplo ha sido tomado de internet, se encuentra basado en el apendice B de la especificacion del v4l2, y fue modificado por Tobias Mueller para guardar los fotogramas en formato jpeg.

Basicamente, en la especificacion v4l se tienen tres metodos para acceder a un fotograma capturado por un dispositivo: Mediante comandos de lectura/escritura, mediante apuntadores y mediante mapeo de memoria. En este caso, el dispositivo que se esta usando (webcam usb) solo es compatible con el metodo de mapeo de memoria (mmap), que consiste en apartar una porcion de la memoria fisica de la condor para que el dispositivo de captura escriba en ella los fotogramas capturados y el programa de captura pueda leerlos.

Naturalmente, el programa tiene en cuenta una serie de flags utilizados comunmente en operaciones de memoria : EAGAIN y EIO. Cuando la funcion xioctl accede al dispositivo, este puede responderle que "no hay datos disponibles, intentelo despues" (EAGAIN) o EIO, que quiere decir que el dispositivo no esta respondiendo (se puede estar bloqueando la senal o el dispositivo puede estar ocupado).

El codigo completo de este aplicativo puede encontrarse aqui con el makefile modificado para que pueda ser compilado para la condor. El programa cuenta con una ayuda que puede invocarse con el comando --help (como en la mayoria de aplicaciones por linea de comandos).

FALTA EJEMPLO!!!!!!!!!!

Mediante FFMPEG
FFPEG es una herramienta de software libre que contiene una serie de programas y librerias para el manejo de archivos multimedia. FFMPEG se distribuye bajo la licencia GPL V2+ o LGPL V2.1+ dependiendo de las caracteristicas que sean habilitadas. La razon para la eleccion de este software es, principalmente, por lo completo que es, pues no solo maneja archivos de video y dispositivos de captura, tambien es capaz de manejar dispositivos y archivos de audio, es posible hacer streming por un adaptador de red y sus librerias pueden usarse en otrs aplicaciones diferentes a las de ffpeg. Todo esto entre muchas otras capacidades diferentes.

Instalacion de FFMPEG
Normalmente, si se qisiera instalar este aplicativo en un PC, se haria mediante el comando apt-get install. El programa, con todas sus caracteristicas ocuparia unos 100MB y nos ahorraria el trabajo de configuracion. El problema es que se esta trabajando sobre una plataforma embebida y 100MB seria excesivo, sin mencionar que muchas de las caracteristicas que se compilan por defecto permanecerian inutilizadas. Lo que se hace entonces es configurar manualmente las caracteristicas que se quieren incluir en la version final de FFMPEG.

Entonces, los pasos a seguir son los siguientes:

GIT: git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
 * Descargar el codigo:

./configure --enable-cross-compile --cross-prefix=arm-angstrom-linux-gnueabi- --target-os=linux --cc=arm-angstrom-linux-gnueabi-gcc --cpu=armv5te --arch=arm --prefix=/home/juan/condor_vision/ffmpeg_build --enable-static --disable-asm --enable-armv5te --disable-stripping --disable-debug --disable-ffplay --disable-ffserver --extra-libs=-static --extra-cflags=--static --disable-ffprobe --enable-indevs --enable-gpl --disable-bsfs --disable-muxers --disable-demuxers --disable-filters --disable-encoders --disable-decoders --disable-parsers --enable-decoder=ac3 --enable-decoder=mp3 --enable-decoder=mpeg4 --enable-decoder=jpegls --enable-decoder=ayuv --enable-decoder=rawvideo --enable-decoder=ljpeg --enable-encoder=ac3 --enable-encoder=mpeg4 --enable-encoder=huffyuv --enable-encoder=jpegls --enable-encoder=rawvideo --enable-encoder=ljpeg --enable-parser=mpeg4video --enable-parser=ac3 --enable-parser=mpegaudio --enable-demuxer=ac3 --enable-demuxer=avi --enable-demuxer=mp3 --enable-demuxer=h264 --enable-muxer=mp3 --enable-muxer=mp4 --enable-muxer=avi --enable-muxer=h264 --enable-muxer=rawvideo --enable-filter=scale --enable-filter=decimate --enable-filter=fps
 * Ingresar a la carpeta ffmpeg desde el terminal.
 * Escribir (o copiar y pegar) los siguientes comandos de configuracion:

Es importante mencionar que algunos de estos comandos no se deben modificar (como --enable-cross-compile, --cpu=armv5te o --arch=arm por ejemplo), otros deben ser modificados (la ruta donde se instalara FFMPEG --prefix=/home/juan/condor_vision/ffmpeg_build pues no nos interesa que queden los binarios en la maquina en la que estamos compilando) y otros pueden ser modificados (en general depende de las caracteristicas que queramos habilitar, un buen ejemplo son los encoders, decoders, muxers y demuxers).


 * Compilar con make como de costumbre.
 * Instalar mediante make install en la carpeta definida por --prefix=/XX/XX/XX/ffmpeg_build.
 * En la carpeta ffmpeg_build vamos a encontrar cuatro carpetas: bin, include, lib y share. Para la ejecucion de ffmpeg solamente nos interesan bin y lib. Las demas carpetas contienen los headers para desarrollar aplicaciones diferentes de ffmpeg (include) y archivos de ayuda (share). Los archivos que contienen bin y lib debemos copiarlos a las carpetas con el mismo nombre en el sistema de archivos de la condor dentro de la carpeta usr, es decir, /usr/bin y /usr/lib. Una forma practica de hacer esto es mediante una ventana grafica con credenciales de superusuario, esto se hace ejecutando el siguente comando desde una ventana de terminal:

gksudo nautilus

La pantalla se pondra en negro con una ventana que nos solicita la contrasena de administrador, despues de ingresar la contrasena y enter se abrira una ventana del explorador de archivos sin ningun tipo de restriccion para la copia de archivos. Se debe tener cuidado de no alterar el sistema de archivos, pues esta ventana permite realizar cambios tanto en el sistema de archivos de la condor como en el del PC que se esta usando.


 * Una vez se han copiado los archivos al sistema de archivos de la condor, se puede ejecutar ffmpeg para realizar cualquiera de las funciones que permite.

Ejemplo de Captura
Por ejemplo, para capturar video en formato mp4:

ffmpeg -f video4linux2 -s 160x120 -r 10 -i /dev/video0 -f mp4 -timestamp now /media/sdb2/webcam3.mp4

Tenga en cuenta que la condor tiene recursos limitados y no puede capturar videos muy grandes, ni tampoco lo puede hacer muy rapido. Debe tenre paciencia porque la condor tardara en responder mientras se encuentre capturando.