Trasteando con la Raspberry Pi - PS3Eye (y otras camaras)

La Ps3Eye es una gran camara para hacer tratamiento de imagenes, tiene una buena optica, una gran sensibilidad luminosa y mucha mas velocidad que una webcam normal, hasta 125 fps a 320x240 y 60 fps a 640x480.

En raspbian '2012-07-15-wheezy-raspbian' la cámara funciona directamente ya que el modulo esta incluido, el problema es que capturando con opencv desde python, por defecto la imagen esta a 320x240 y solo con opencv no es posible cambiar el framerate ni la mayoría de los parámetros aparte del tamaño de la imagen.

Al buscar información de cómo cambiar los parámetros de la cámara encuentras principalmente información sobre un modulo modificado que permite establecer el modo por defecto de la cámara, pero es necesario compilarlo para la RPi.
Mis conocimientos de linux son limitados, pero combinando las instrucciones de varios sitios ([1],[2]) conseguí hacerlo.. pero no es rápido, ni fácil, ... ni útil. Funciona, permite cambiar los parámetros de la cámara al cargar el modulo ... pero no en tiempo de ejecución.

Realmente todo ese lio no es necesario, el módulo que viene con raspbian permite configurar el framerate y los parametros comunes (brillo, ganacia, etc) al vuelo, sin recompilar nada ni complicarse especialmente la vida, incluso se puede hacer desde python sin abandonar opencv.

Tal vez porque no soy usuario habitual de linux no se me ocurrio antes, pero la forma es ir mas allá del modulo de la camara, directamente a v4l y desde allí modificar lo que queramos.

Instalando el paquete v4l-utils se instala una aplicacion en linea de comandos llamada v4l2-ctl que permite ver y modificar una gran cantidad de parámetros de los dispositivos v4l que haya disponibles, y podemos hacer esas mismas llamadas desde el interior de python para ajustar lo que queramos.

El estado actual del driver cargado lo podemos ver con
$ v4l2-ctl --all
y para ver las propiedades modificables
$ v4l2-ctl -l

para manejar estas propiedades desde python, por ejemplo el brillo ...
>>> import os
>>> os.system("v4l2-ctl --set-ctrl brightness=30")

y para ajustar el framerate ...
>>> os.system("v4l2-ctl --set-parm=60")


El cambio se aprecia después de varios frames, ~5, pero funciona estupendamente.
He podido hacer capturas a 320x240 ajustando a 30,40,50,60,75,100 y 125 fps sin problemas, pero a 640x480 solo funciona limpiamente con 15 y 30 fsp, en 40 fps la mitad de las veces da un timeout y con 50 y 60fps no se consigue ninguna imagen, solo timeouts.
Posiblemente 640x480@60fps es pedirle mucho a la RPi, que de todas formas no podría procesar nada a esa velocidad, pero con los otros modos va de sobra.

Por cierto, si se usa más de una cámara hay que especificar a quien se aplica el cambio

>>> os.system("v4l2-ctl -d0 --set-ctrl brightness=25")    #para la camara 0
>>> os.system("v4l2-ctl -d1 --set-ctrl brightness=30")    #para la camara 1




3 comentarios:

Anónimo dijo...

Hola,

Veo que usas OpenCv e intentaré aprovechar para preguntarte algo. Estoy intentando hacer reconocimiento de personas desde el RPI. El actual problema que tengo es que no llega (ni de lejos) a 1 FPS... ¿Cómo podría mejorar esto?

Gracias,

Cristian

Santi dijo...

Hola Cristian,

Lo cierto es que no he hecho ningún tipo de procesamiento complejo de imagen con la RPI porque creo que tampoco se le puede pedir demasiado.

Para procesamiento más duro simplemente uso la RPI como enlace con el PC de sobremesa -la RPI captura y envía al PC, el PC procesa devuelve el análisis, la RPI actúa en consecuencia-

No se que tipo de algoritmo estas empelando, pero si lo tienes que hacer necesariamente en la RPI y quieres hacer tracking puede ayudar el restringir la región de interés a la región del último resultado positivo.
En general en la RPI puede ser más conveniente usar algoritmos de imagen sencillos y con errores para luego filtrar la salida en base a modelo que usar algoritmos pesados y robustos.. pero que consumen demasiado.

Espero que sirva de algo,

Santi

LuisLlamas dijo...

Vaya! Un gran descubrimiento esta página. Muy muy interesante, enhorabuena.
Parece que tenemos muchos intereses en común (de hecho parece ser que coincidimos en todos)
Si te apetece mándame un email y estamos en contacto (via twitter, o g+ por ejemplo)