8 de Junio, 2004

La webcam de homeworld y convert

sin procesar
procesada
Es fácil adivinar cual está procesada

Cuando publiqué CamRPC incluí en el paquete un webcam.sh que recogía una imagen del dispositivo de captura (webcam, capturadora de televisión o lo que sea) y, empleando uno de los clientes XML-RPC, enviaba la imagen al servidor.

En realidad mi webcam.sh hace más cosas. Por necesidad.

Una vez que se recoge la imagen depositada temporalmente en disco, le aplico una serie de procesos hasta que obtenemos lo que finalmente se sube al servidor y podemos ver en la homeworld cam. Para ello empleo convert, de la suite ImageMagick.

En este caso el programa para capturar no se llama desde el script sino que se ejecuta en paralelo. Se genera una imagen nueva cada 3 segundos, pero el script espera menos tiempo para dar sensación de continuidad en caso de que haya problemas de sincronización.

Las llamadas que hago a convert son las siguientes:

convert -gamma 1.8 -contrast -normalize -quality 100\
 -resize 320x260 $HOME/tmp/snapshot.jpg $WORK.jpeg

convert -font helvetica \
        -fill "#000000" \
        -draw "text 6,16 '$SITE'" \
        -draw "text 181,16 '$DATE'" \
        -draw "text 6,251 '$TITLE'" \
        -fill "#c0c0c0" \
        -draw "text 5,15 '$SITE'" \
        -draw "text 180,15 '$DATE'" \
        -draw "text 5,250 '$TITLE'" \
        -quality 60 \
        $WORK.jpeg image_webcam.jpg

El programa que empleo para la captura de los cuadros de la webcam deja la imagen en formato JPEG en $HOME/tmp/snapshot.jpg.

Entonces realizamos 2 pasadas:

  1. Subimos el gamma de la imagen en un 80% (creo :D) porque mi webcam Labtec es muy sensible a la luz (al exceso y a la falta de ella :(), ajustamos el contraste y normalizamos los colores de la imagen. También cambiamos el tamaño a 320x260 (es un poco más porque conserva el aspecto), para que no se envíen imágenes demasiado grandes. Finalmente notar que la calidad es 100% para que no se pierda nada en este paso y guardamos el resultado en $WORK.jpeg ($WORK puede ser $$_webcam como propongo en la versión de CamRPC).
  2. Añadimos con una fuente sin serifa (bonito palabro) el $SITE de la webcam (URL de blackshell), el $TITLE (un texto descriptivo) y $DATE (que es la fecha generada en cada iteración). El texto se escribe 2 veces con una variación de 2 pixeles para generar una sombra negra al texto gris y aumentar así la legibilidad del texto con casi cualquier fondo. Además, ahora sí, bajamos la calidad de la imagen a un razonable 60%, que nos dará un buen nivel de compresión dejando una imagen de tamaño adecuado para enviar al servidor.

El resultado es razonable con distintos niveles de luz, tanto natural como artificial (mis tubos de neón son menos brillantes que la claridad que entra por la ventana). Supongo, porque no lo he probado, que el software de la cámara (solo para Windows) hará algo similar, porque la captura tal cual es de poca calidad.

Si a alguien se le ocurre como mejorar el resultado con convert, que me lo haga saber :D.

Anotación por Juan J. Martínez.

Hay 2 comentarios

Gravatar

Jeje, que currado lo tienes. No había visto nunca un sistema de webcam basado en xml-rpc. Aprovechando las tecnologías ;)

por ToReK, en 2004-06-09 18:20:26

Gravatar

Si fuera "profesional" usaría SOAP :P
O mejor aun... usaría Java... o no .NET ese que dicen que si no estás en esa tecnología en un año no podrás trabajar (eso ya me lo decían hace un año :D).

por Juanjo, en 2004-06-10 13:08:38

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.