Revista 100% Verde

Como usar una webcam standard con una Raspberry Pi

Por Soloelectronicos @soloelectronico
Una de las opciones que, a priori, puede parecernos más atractiva y tal vez útil por las posibilidades que no ofrece como cámara de seguridad, reconocimiento de imágenes, cámara trasera para vehículos , etc para nuestra Raspberry Pi es conectarle una cámara e intentar visualizar y/o capturar en el monitor la imagen captada por la misma.. Lamentablemente en el universo Linux es algo más complicado añadir drivers para todo el hw disponible , y es ahí donde por desgracia no le son ajenas las cámaras web usadas para pc pues en lugar de utilizar el módulo de la cámara nativa del Raspberry Pi que suele tener un coste ciertamente elevado es mas interesante utilizar una versátil webcam USB estándar para tomar fotos y vídeo en la Raspberry Pi.Tenga en cuenta que la calidad y capacidad de configuración del módulo de cámara nativo con interfaz CSI es muy superior a una webcam USB estándar, pero por el contrario este también tiene una gran limitación : la longitud del cable de cinta que excepto compremos que dos adaptadores de CSi a HDMI (lado cámara) , de HDM a CSI (lado Raspberry Py) y luego un largo cable hdmi solo se podría situar tan solo unos pocos centímetros respecto a la Raspberry Pi . Una vez que tengamos una cámara para operar con nuestra RasPi hemos de asegurarnos de que la misma es "soportada" por el S.O. Linux que estamos utilizando.

Como usar una webcam standard con una Raspberry Pi

Requisito previos

La consulta de la lista de compatibilidad puede ayudar pero podemos comprobarlo en desde linea de comandos para verificar si el sistema la identifica correctamente.

Antes de conectar la cámara al sistema iremos al terminal y teclearemos el comando dmesg | tail, lo que hará que se nos muestren los últimos mensajes generados por la RasPi. Ahora conectamos la cámara a la Raspberry Pi y repetimos el comando anterior ( dmesg | tail), y en este caso se nos deberán mostrar algunos mensajes que hagan referencia al nuevo hardware detectado.

Otra comprobación interesante es verificar si la cámara ha sido detectada como dispositivo Linux, para ello teclearemos ls /dev , lo que hará que aparezca , si es que el sistema la detecta , como dispositivo /dev/videoX ( normalmente /dev/video0 pero asegurese con un ls /dev)

sudo apt-get install imagemagick

De forma previa podemos instalar el software para poder visualizar de una forma cómoda los ficheros obtenidos para poder verlos desde el propio terminal dentro del entorno gráfico pues la visualización de imágenes desde el entorno gráfico se puede efectuar con solo "pinchar" en la imagen a mostrar desde el navegador gráfico de archivos para los cual podemos instalar el sw de imagen magick

Para instalar el paquete citado basta teclear:

Existen varias utilidades para capturar imágenes desde un web cam veamoslas:

sudo apt-get install fswebcam

Fswebcam

En efecto la herramienta fswebcam, que funciona bajo línea de comandos, nos permite capturar imágenes a través de la Webcam USB, para ello en primer lugar, instale el paquete: fswebcam con el comando sudo , es decir:

Ahora escriba el comando seguido de un nombre de archivo y una imagen se tomaron con la cámara web y se guardarán al nombre de archivo especificado como por ejemplo fswebcam /dev/video0 image.jpg

Este comando mostrará la siguiente información:

Como usar una webcam standard con una Raspberry Pi
[email protected]:~ $ fswebcam -d /dev/video0 pepe.jpg --- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened. No input was specified, using the first. Adjusting resolution from 384x288 to 352x288. --- Capturing frame... Captured frame in 0.00 seconds. --- Processing captured image... Writing JPEG image to 'pepe.jpg'

Como vemos la resolución por defecto es pequeña y ademas se complementa en la parte inferior con un pequeño banner que muestra la fecha y hora.

En caso de utilizar una web cam hd, para especificar la resolución podemos forzar que la imagen para sea tomada a mayor resolución , para ello se puede utilizar la bandera: 1280 x 720-r

fswebcam -r 1280x720 -d /dev/video0 pepe2.jpg

Este comando mostrará la siguiente información:

--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 1280x720 to 640x480.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'pepe2.jpg'

Puede quitar el banner inferior puede añadir el siguiente parámetro:--no-banner :

El cual muestra la siguiente información:

--- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened. No input was specified, using the first. --- Capturing frame... Corrupt JPEG data: 2 extraneous bytes before marker 0xd6 Captured frame in 0.00 seconds. --- Processing captured image... Disabling banner. Writing JPEG image to 'image3.jpg'.

Ahora con ese parámetro ya se toma la imagen a resolución completa sin banner

Script de captura

Puede escribir un script de Bash para que tome una foto con la webcam por lo que la secuencia de comandos que vamos a vera continuación guarda las imágenes en el directorio,

En primer lugar crear el subdirectorio primero en:/home/pi/webcamwebcam conmkdir webcam

Para crear una secuencia de comandos, abra su editor de la opción y escriba el siguiente código de ejemplo:

Este script tome una fotografía y usa como nombre del archivo con una marca de tiempo.

Para poder ejecutar el script webcam.sh en primer lugar nos gustaría hacer el archivo ejecutable:

Luego ejecutar con:

Al ejecutarlo dar la siguiente salida:

--- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened. No input was specified, using the first. --- Capturing frame... Corrupt JPEG data: 2 extraneous bytes before marker 0xd6 Captured frame in 0.00 seconds. --- Processing captured image... Disabling banner. Writing JPEG image to '/home/pi/webcam/2013-06-07_2338.jpg'.

Time-lapse con cron

Usted puede utilizar para tomar una fotografía en un intervalo dado, como cada minuto para capturar un time-lapse. cron , para ello primero abra la tabla cron para editar:

Esto tampoco pedirá que editor que desea utilizar, o abrirá en su editor predeterminado. Una vez que tenga el archivo abierto en un editor, agregue la línea siguiente para tomar una fotografía cada minuto (refiriéndose a la secuencia de comandos de Bash desde arriba):

Guardar y salir y usted debería ver el mensaje:

Asegúrese de que su gscript no permite guardar cada fotografía tomada con el mismo nombre de archivo. Esta acción sobrescribirá la imagen cada vez.

Uvcpature

Para poder utilizar las prestaciones de nuestra cámara web también podemos instalar los paquetes uvccapture y libv4linux-0

install uvccapture libv4l-0

Antes de hacerlo puede ser preciso (recomendable) actualizar las fuentes de instalación con: sudo apt-get update y para descargar los paquetes ejecutaremos:

sudo apt-get

Conectada la cámara y teniendo los programas adecuados ya instalados, vamos a realizar una prueba simple de que todo está funcionando correctamente. Desde el terminal tomamos una instantánea con los parámetros estándar (opción -m) :

uvccapture -m

Ahora listamos la carpeta para comprobar que se capturó el fichero snap.jpg (nombre por defecto de la captura) y luego lo visualizamos mediante el comando display snap.jpg

En caso de que el fichero capturado () salga bastante obscuro podemos ver como están los ajustes por defecto de la cámara mediante el parámetro -v , u vccapture -m -v

uvccapture -m -B50 -C10 -o"captura.jpg"

También si el brillo está muy bajo, podemos capturar una nueva imagen pero subiéndolo bastante mediante el comando ( parámetro -B) uvccapture -m -B50

Además de los parámetros comentados, el comando uvccapture nos permite otra serie de interesantes opciones, como por ejemplo podemos parametrizar una nueva captura - modificando brillo y contraste - pero guardando la misma en un fichero llamado "captura.jpg"

Por si fuera poco el comando uvccapture permite que efectuemos de forma secuencial, - y en un lapso de tiempo elegido por nosotros - la captura consecutiva de tomas desde la cámara USB. No debemos confundir esta posibilidad - aunque se le parezca - con la toma de un " stream " o flujo de vídeo continuo. Lo que obtendremos al efectuar esta captura consecutiva es imágenes cada cierto intervalo. Así que vamos a verlo con un ejemplo...

Ejecutamos el comando uvccapture con el parámetro -t , el cual hace que se capture una imágen cada cierto número de segundos (3 segundos en nuestro ejemplo), el cual, si no se especifíca algo diferente se guardará en el fichero snap.jpg.

uvccapture -m -B70 -C40 -S5 -t3 (pulsar VTRL+c para finalizar el bucle de captura)

El resultado de la captura será una toma cada 3 segundos que se guardará en el fichero por defecto (snap.jpg). La única desventaja de este método radica en que el fichero de captura se "machaca" con cada una de ellas, por lo que solo estará a nuestra disposición el último de los generados.

Para subsanar esto podemos hacer uso de una de las prestaciones del programa uvccapture que nos permite ejecutar un comando Linux inmediatamente después de efectuar una captura. ¿Y que podemos ejecutar?... pues parece claro que lo más idóneo sería algún tipo de comando o sucesión de estos que nos permita salvaguardar la última captura, de forma y manera que al realizarse la siguiente toma esta no sea "machacada" impunemente de forma muy similar a como vimos en el script anterior.

Otras herramientas útiles

Otras herramientas están disponibles que puede ser útil cuando se utiliza la cámara o una webcam:

  • SSH Utilizado para acceder remotamente el Raspberry Pi en su red local
  • SCP Sirve para copiar ficheros sobre SSH ypara obtener copias de las fotografías tomadas en la Pi en el ordenador principal
  • rsync : Uso para sincronizar la carpeta de imágenes tomadas en una carpeta entre el Pi al ordenadorrsync
  • cron Utilizar para programar tomar una fotografía en un intervalo dado, como cada minuto para capturar un time-lapsecron

Mas información en raspberrypi.org


Volver a la Portada de Logo Paperblog