domingo, septiembre 8

Raspberry Pi Webcam

He conseguido una cámara Web con micrófono Green Leaf, la cual instalare en mi RPi para poder realizar streaming.


 
Antes de iniciar deben recordar que una cosa es que funcione cualquier dispositivo conectado directamente a la RPi y otra que funcione desde el Hub USB por que recuerden que yo manejo un Hub USB (Lo pueden ver en mi entrada de componentes) para mi comodidad; en mi caso no tuve problemas con el uso de la cámara pensaba que no funcionaria pero fue todo lo contrario si funciono sin ningún problema espero que así sea con cualquier dispositivo que llegue a adquirir.

Bueno empecemos; conectamos la cámara Web al hub usb.

fswebcam

Instalaremos el fswebcam para la captura de fotogramas, también se puede trabajar por intervalos de tiempo, también cabe mencionar que se puede llamar a la aplicación desde un script bash cuando se requiera pero esto sera para otra entrada; para ello ejecutamos el siguiente comando en consola:

sudo apt-get install fswebcam

Una de las características de este fswebcam es que se puede añadir un pie de página a la captura, donde se puede especificar el texto de su elección, por ejemplo este es el comando que probé:

sudo fswebcam -r 640x480 -S 15 --flip h --jpeg 95 --shadow --title "WebOnActive" --subtitle "Prueba de Webcam Green Leaf" --info "Monitor: Active @ 1 fpm" --save home.jpg -q -l 60

Fotos capturadas con mi cámara Web



opciones:

-f : la resolución del frame ancho*altura
-s : numero de frameworks que salta para capturar una imagen estable y con buena iluminación
--flip : posición del marco en este caso horizontal (h)
--jpeg : calidad de captura jpeg
--shadow : agrega una sombra de pie de pagina con texto
--title, --subtitle, --info : diferentes formas de agregar el texto
--save : nombre con extensión donde se guardara el frame tomado.
-q : deja el proceso correr el  comando como proceso oculto
-l : toma foto instantánea cada numero de segundos especificados.

para mayor explicación consulta el manual en Raspbian: man fswebcam

motion

Ahora probaremos la aplicación motion es un sistema de vigilancia más completo y personalizable. Entre lo que puede hacer, es capaz de la detección de movimiento, grabar frames, grabar vídeo, etc.; Lo instalamos con el siguiente comando:

sudo apt-get install motion

Este incluye una interfaz de configurable, pero primero que nada si llegas a necesitar especificar algunos puertos para que motion corra bien, pueden editar los mismos en el archivo:

sudo nano /etc/motion/motion.conf

y buscaremos la sección control_port (default 8080) y stream_port (default 8081) si llegas a necesitar hacer algun cambio adelante, pero si prefieres simplemente dejalo con sus valores predeterminados.

Debo aclarar que yo tuve que hacerle una modificación por que el envío de imágenes al server no me funcionaba entonces lo que modifique fue lo siguiente:

# Restricti webcam connections to localhost only (dafault: on)
#webcam_localhost on
webcam_localhost off
# Restrict webcam connections to localhost only (default: on) #webcam_localhost on webcam_localhost off - See more at: http://www.slblabs.com/2012/09/26/rpi-webcam-stream/#sthash.VkExYDqn.dpuf


Para iniciar motion puedes correrlo así, en una terminal:

sudo motion

Y ahora puedes accesar a la interfaz de configuración  por medio de la siguiente dirección que deberías de accesar por medio de tu navegador (midori).

http://RPI-IP:webcontrol_port

donde  RPI-IP es la dirección local IP de tu RPi y el webcontrol_port es el mismo que seleccionaste en tu archivo de configuración.

Algunos de los parámetros que deberías saber son los de:

width and height : Tamaño del frame, depende de la cámara
framerate : máximo de numero de frames capturados por segundo
thereshold : numero de pixeles en la imagen esto puede cambiar el disparador del detector del motion
quality : la calidad que deseas del frame
ffmpeg_timelapse : numero de segundos entre la captura del frame con la grabación
ffmpeg_bps : constante arbitraria para la codificación del vídeo (ignorado por el lapso de tiempo)
ffmpeg_variable_bitrate : constante para la codificación del vídeo (con una tasa de bits variable es la única manera de conseguir grabaciones decentes, este ajuste se utiliza para la grabación de movimiento de vídeo y lapsos de tiempo) y claro diferentes pistas de imágenes/vídeo/lapsos donde guardar las capturas se encuentra entre las opciones que pueden ser personalizadas a tu gusto.

Otra de las características que tiene motion es que es posible ejecutar cualquier comando en particular en cualquier momento en que un evento sea iniciado y/o cuando una imagen es capturada, esto es posible con el parámetro on_event_start y on_picture_save
Y el vídeo esta disponible en el puerto configurado del (stream_port) que se modifico en el archivo anterior "en caso de haberlo hecho" e ingresas de la misma manera con el que ingresaste al webcontrol_port:

http://RPI-IP:stream_port/

Y todo lo que captura motion se encontrara en la dirección /tmp/motion/ encontraras todas las imágenes que capturo y también archivos en formato .swf donde fue que grabo.

Lo que graba lo hace en formato swf por lo tanto para reproducirlo debemos instalar el gnash

Imágenes de los resultados de trabajar con motion:







mjpeg-streamer

Ahora probare la aplicación mjpeg-streamer que no esta tan completo como lo es motion, pero es perfecto si lo que quieres es hacer vídeo streamming. Este también te da una interface web para mostrar el stream. Para este, no se encontró ningún archivo binario para la versión del procesador arm; pero lo compilo el blogger de SLB Labs en la fuente encontraras mas información.

Primero descargamos el archivo aqui. Usualmente cuando se descarga algún archivo normalmente se guarda en /home/usuario

Ahora para extraer su contenido nos dirigimos a su ubicación actual, y extraemos el archivo con el siguiente comando:

sudo tar xvzf mjpg-streamer-r63.tar.gz

Ahora para poder compilar el mjpg-streamer, necesitamos la librería de libjpeg8-dev, entonces lo instalaremos primero:

sudo apt-get install libjpeg8-dev

También tenemos que realizar realizar un enlace simbólico, que resulta importante:

sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h

Ahora estamos listos para iniciar la compilación del programa, nos ubicamos en la carpeta que se extrajo anteriormente:

$ cd mjpg-streamer-r63
$ CFLAGS+="-O2 -march=armv6 -mfpu=vfp -mfloat-abi=hard" make

Y eso seria todo... para correr el programa necesitaras ejecutar el siguiente comando:

$ export LD_LIBRARY_PATH=.
$./mjpg_streamer -i './input_uvc.so -d /dev/video0 -r 640x480 -f 15' -o './output_http.so -w ./www -p 8080'

Al momento de ejecutarlo me sale el siguiente error:

Unable to set format: Invalid argument
Init v4L2 failed !! exit fatal

Esto sucede por que nuestro RPi o en este caso mi HUB Usb soporta el USB2.0, por lo tanto el stream solo puede usarse con el modo yuv para la salida de las imágenes.

Por lo tanto el comando para ejecutar el programa donde quiera que este ubicado y con el formato de yuv, tienes primero que hacer el enlace hacia la dirección donde se encuentra el archivo descargado y modificar un poco el comando y quedaría de la siguiente manera (en mi caso):

 /home/pi/mjpg-streammer-r63/./mjpg_streamer -i './input_uvc.so -d /dev/video0 -y' -o './output_http.so -w ./www -p 8080'


Y podrás entrar a la interfaz que proporciona el MJPG-Streamer de la siguiente manera:

http://RPI-IP:8080/

donde el RPI-IP es la dirección ip que tiene asignada


NOTA: No se ve nada por que detuve el proceso antes de que mostrara algo, pero mas adelante de esta entrada notaras que si funciona.


Si lo único que deseas es ver como trabaja el streamming puedes ingresar directamente usando la pagina:

http://RPI-IP:8080/?action=stream

Y te mostrara el envío que esta realizando del streamming.



Links Relacionados
[1]. http://www.slblabs.com/2012/09/26/rpi-webcam-stream/
[2]. http://arthurhong-linux.blogspot.mx/2008/11/mjpgstreamer-or-uvcstreamer-always.html

switches: -r: frame resolution width*height -S: numbers of frame to skip for the webcam to capture a stable and well illuminated frame --flip: frame flipping, in this case horizontal --jpeg: jpeg compression quality --shadow: adds a drop shadow to the footer text --title, --subtitle, --info: different fields of the footer text --save: path and file name where to saved the frame to -q: leaves the process running in background -l: takes a snapshoot every specified number of seconds - See more at: http://www.slblabs.com/2012/09/26/rpi-webcam-stream/#sthash.JKWhP2cY.dpuf
fswebcam -r 640x480 -S 15 --flip h --jpeg 95 --shadow --title "SLB Labs" --subtitle "Home" --info "Monitor: Active @ 1 fpm" --save home.jpg -q -l 60 - See more at: http://www.slblabs.com/2012/09/26/rpi-webcam-stream/#sthash.JKWhP2cY.dpuf
fswebcam -r 640x480 -S 15 --flip h --jpeg 95 --shadow --title "SLB Labs" --subtitle "Home" --info "Monitor: Active @ 1 fpm" --save home.jpg -q -l 60 - See more at: http://www.slblabs.com/2012/09/26/rpi-webcam-stream/#sthash.JKWhP2cY.dpuf