Una cámara en la Raspberry Pi

Ha pasado bastante tiempo desde la última entrada en esta bitácora y mucho más desde que empecé a hablar de mis pinitos con la Raspberry Pi (Raspberry Pi: ¿qué temperatura hace en mi casa? pero eso no quiere decir que haya abandonado el aparatito, que me proporciona mis buenos ratos (y también mosqueos, con las cosas que no se consiguen, o no funcionan como uno espera).

Después de aquel experimento donde accedíamos remotamente a algunos sensores e información de lo que sucedía en casa, pensé en avanzar por dos vías: buscar algún bot que fuera más sencillo de programar (phenny me gustó pero parece que su desarrollo se ha parado; lo de sencillo de programar va en gustos y formas para cada uno, claro). También pensé añadir una cámara al sistema de ‘vigilancia’ casera, y esto me ha consumido bastante tiempo.

La referencia para comprar una cámara que funcione con nuestra Raspberry es RPi USB Webcams. Entre los modelos que vi allí (y estaban disponibles en una tienda cercana) elegí la Logitech C270. En aquel momento entendí que funcionaba bien directamente conectada al puerto USB, cosa que resultó no ser correcta (ahora dice que necesita un hub USB alimentado que es lo que solucionó mis problemas después de muchas pruebas).

En el intermedio, compré (de segunda mano, en una tienda de esas de videojuegos que venden complementos para consolas) una cámara para Playstation PS4 (creo). Había leído por ahí que era menos exigente con los requisitos energéticos y que tal vez podría funcionar (y eran 5 euros de coste, qué caray).

Las cámaras:

Probando otra cámara (PS3)

A photo posted by Fernando Tricas García (@ftricas) on

Es cierto que la cámara de la Playstation funcionaba mejor que la otra sin alimentación externa, pero la Raspberry seguía colgándose aleatoriamente (no hay que olvidar que en el otro puerto USB había conectado un dispositivo WiFi, que utilizo para conectarme al cacharrito para poder gestionarlo cuando estoy en casa; y que la conecta a internet de manera casi permanente).

La calidad de imagen es algo peor que la de la de Logitech y tiene dos posiciones (un zoom) que se gestiona manualmente (así que no está accesible para un programa que utilice la cámara). La he conservado como cámara secundaria.

Así que después de un montón de días probando a ratos perdidos y con algo de frustración, fui a la tiena a por un hub USB alimentado (tenía uno que me regalaron pero no estaba en muy buenas condiciones). El elegido fue uno de Trust (el EasyConnect 7 Port USB2 Powered Hub).

Como decía la canción…

A photo posted by Fernando Tricas García (@ftricas) on

Mientras tanto, claro, iba probando las diferentes alternativas para manejar la cámara. Vale la pena recordar que salió la cámara oficial del proyecto Raspberry que se supone que nos evitaría los problemas de alimentación pero que no llegué a considerar seriamente: me parecía algo cara (una vez que ya había comprado una, claro) y además utiliza el sistema de conexión con un bus que parece poco práctico (sobre todo si luego queremos usarla para otras cosas).

Seguramente funciona bien, es integrable en proyectos más ambiciosos. Se puede ver información en Raspberry Pi Camera Module.

Para gestionar la cámara hay bastantes programas y ejemplos por ahí:

Y alguno más que seguramente estoy olvidando.

También descubrí OpenCV que permite, entre otras cosas, manejar cámaras desde un programa (en particular se puede hacer en Python): más de una cámara, si tiene parámetros configurables se pueden gestionar desde el propio programa (luminosidad, zoom, contraste, …).

Podemos ver un programita de ejemplo en: cam.py. El programa graba la imagen que toma en un fichero cuyo nombre se le puede pasar en la propia llamada. Si no se pone nombre, elige uno predefinido.

Por si vale la pena, comentamos algunas líneas del código.

el nombre del fichero se define en:


imgFile = '/tmp/imagen.png'

El nombre siempre es el mismo. Podríamos utilizar algo como:


imgFile = time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime())+'.png'

Para poder conservar las diferentes imágenes que se vayan tomando (cuidado con llenar el espacio de almacenamiento).

Luego hay código para leer el nombre de la línea de instrucciones (si se suministra), aunque no es nada robusto (no se hace niguna validación), para después parsar a inicializar la cámara:


cam=cv2.VideoCapture(0)

La captura de la imagen se hace en una función:


def get_image():
retval, im = cam.read()
return im

Nuevamente es poco robusto, no se comprueba el código de error que puede devolver la función read y simplemente devuelve la imagen capturada (que podría no existir porque algo hubiera fallado).

Esta función se utiliza en:


img=get_image()

Y, finalmente,


cv2.imwrite(imgFile, img)

escribe la imagen en el fichero que hemos definido arriba.

Creo que esta entrada ya es un poco larga. Otro día seguiremos con el bot.

6 pensamientos en “Una cámara en la Raspberry Pi

  1. Pingback: Enviar una imagen por correo en Python | Mbpfernand0's Blog

  2. Pingback: A camera for my Raspberry Pi | Making Fernand0

  3. Pingback: Sending an image by mail in Python | Making Fernand0

  4. Pingback: Segundo bot: avanzamos | Mbpfernand0's Blog

  5. Pingback: Una cámara móvil | Mbpfernand0's Blog

  6. Pingback: Detección de paso con el sensor de distancia | Mbpfernand0's Blog

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s