Esta primavera estuve poniendo la webcam a los canarios mientras criaban, fue divertido seguir durante un par de meses el crecimiento de los polluelos. En aquella ocasión hice uso de Spcatools un servidor de videostreaming para Linux.

Ahora, por motivos bien diferentes he vuelto a conectar la cámara. Otro objetivo, otro software.
En esta ocasión estoy usando Motion, software para Linux especialmente diseñado para detectar movimientos a través de la webcam y ejecutar eventos.

Viendo la secuencia de capturas que hice hace unos dias es facil comprobar que «motion» pretendía detectar en casa. Nota: Los fotogramas están tomados en el patio de casa, al pie del limonero. Pero el «problema» está ya solucionado

Motion funciona como la mayoría de los servidores de webcam: se lanza el programa, este detecta la webcam y vuelca las imágenes a través de un puerto indicado en el archivo de configuración para que estas sean accesibles a traves de la web.
La particularidad de Motion es que compara al vuelo las imágenes captadas en busca de cambios entre fotogramas consecutivos. Si la diferencia de pixels modificados entre dos fotogramas es superior al «threshold» (umbral) establecido en el archivo de configuración se disparan los eventos programados.

Normalmente estos eventos suelen consistir en sencillos scripts que ejecutan tareas, del tipo: «Guardar imagen como xxxx.jpg en la carpeta yyy«, «Subir imagen al servidor ftp», etc… esto solo está sujeto a la imaginación del usuario, las posibilidades son muy extensas: apaga el ordenador si alguien se acerca.
Además, entre otras posibilidades, Motion viene preparado para capturar imágenes de camaras web ajenas, accesibles por internet, de tal manera que podamos «vigilar» lo que muestran otras webcams y programar el ordenador para que actue en consecuencia.

Instalación

Descarga he instala la última versión de Motion:
motion-3.2.8.tar.gz

Si preferis no tener que compilar he preparado un RPM (sin soporte para BD) que podeis descargar desde:
http://google.trebol-a.com

Crea una carpeta de trabajo y copia el archivo de configuración de Motion a ella. El archivo de configuración a copiar es «motion.conf» y lo tendras en /etc/motion/ ó /usr/local/share/doc/motion-3.2.8/examples/

Configuración y arranque de Motion

Motion no tiene interfaz gráfica de control ó configuración, todas las opciones están incluidas en el archivo de configuración y desde consola solo debeis lanzar el programa indicando la ruta al archivo motion.conf y el modo «daemon».motion -c /ruta/del/archivo/motion.conf -n
Una vez lanzado el programa es posible modificar parámetros Motion en tiempo de ejecución accediendo al panel desde nuestro localhost:8801 (o el puerto que hayais indicado), y cambiando desde los valores de nuestro motion.conf. Dispone tambien de lal opción de «Write«: escribir los cambios realizados en el archivo de configuración.

La imagen azul y negra muestra el movimiento detectado al pasar la mano por delante de la webam.
Si bien el archivo de configuración motion.conf es bastante auto-explicativo, os comento algunos de los parámetros que debeis personalizar así como con los que jugar con la configuración hasta lograr la idonea: que dispare los eventos solo en la situación deseada.

setup_mode off
Al activar setup_mode las imágenes muestran los pixel modificados entre fotogramas y que han provocado el «disparo de eventos».
Lo normal es que este valor esté desactivado (off) pero puede ser util encenderlo al principio para «afinar» la sensibilidad de la cámara al detectar movimientos.

videodevice /dev/video0
La dirección que define el dispositivo de webcam. A no ser que lo tengais personalizado ó tengais varias webcams, el valor por defecto es /dev/video0

width 320
height 240

El tamaño de la imagen de captura de la webcam tanto para mostrar via web como para guardar en disco. Este valor estará limitado por vuestra webcam.

framerate 2
minimum_frame_time 0

Al detectar movimiento Motion capturará «framerate» fotogramas y dejará pasar «minimum_frame_time» segundos antes de volver a disparar.
Valores de «framerate» muy altos provocan más consumo de memoria y CPU, y lógicamente están limitados por la webcam y su configuración. En mi caso, mi logitech Quickcam apenas dá 10-11 fps.

auto_brightness off
Se supone que con este modo se regula el brillo de la cámara de forma automática. En mi caso al activarlo provoca una continua subida-bajada del brillo de la imagen bastante molesto.
No funciona del todo bien.

threshold 1500
Número de pixels que han de cambiar para considerar que ha habido movimiento. Este valor dependerá de la escena que esteis capturando. Para el video que podeis ver arriba, el valor de threshold era de 150. De este modo, Motion comenzaba la captura apenas asomaban el hocico por el fondo del agujero.
Evidentemente, valores muy bajos darán «falsas detecciones» en situacion de mucho viento, pequeños objetos en movimiento (hojas, una rama balanceandose…) y cambios bruscos de iluminación, etc….

lightswitch 0
Los falsos positivos por cambios bruscos en la iluminación de la escena pueden ser controlados por este parametro. 0 (cerro) lo desactiva, 100 lo hace muy poco sensible a cambios de luz.
Depende de la situación y la escena el que este parámetro sea util. Un valor muy alto, puede provocar que Motion no reaccione al entrar en escena alguien con una camisa blanca, por ejem.

minimum_motion_frames 1
¿cuantos fotogramas deben de cambiar para que se dispare el evento?
Si lo quereis capturar es un objeto rápido poned un valor bajo, si es un objeto lento ó viene «de frente a cámara» ponedlo alto (10)

pre_capture 3
Motion guarda los fotogramas anteriores al fotograma de trabajo, de tal manera que al detectar movimiento estos puedan ser incluidos en la secuencia de fotos/video.
De esta manera, si el paso de alguien por delante de la cámara dispara el evento, dispondremos de las imágenes inmediatamente anteriores a que se produjera el evento.
Utiliza valores bajos preferiblemente.

post_capture 0
Idem del anterior pero a la inversa. Una vez finalizada la detección ¿cuantos fotogramas más se incluirán en la captura?

output_normal on
Las opciones son
on: al detectar movimiento se guardan las imágenes
off: al detectar movimiento NO se guardan imágenes
first: al detectar movimiento guarda solo la primera imagen
best: al detectar movimiento guarda aquella imagen que más movimiento muestra

snapshot_interval 0
Ademas de capturar imágenes al detectar movimiento, Motion puede realizar capturas periódicas independientemente de que haya ó no movimiento. Indica aquí el intervalo en segundos entre capturas.

snapshot_filename %v-%Y%m%d%H%M%S-temporizador
Nombre que recibirá el archivo generado por «snapshot_interval«

jpeg_filename %v-%Y%m%d%H%M%S-%q
Nombre que recibirá el archivo generado por la detección de movimiento.

webcam_port 8081
Puerto de tu ordenador desde el cual podrás acceder a las imágenes tomadas por la webcam. Recuerda abrirlo en el Firewall si vás a acceder desde fuera ó deseas hacerlo público.

control_port 8080
A través de este puerto, y previa autentificación podras acceder al archivo de configuración de Motion para alterarlo durante la ejecución, para corregir brillo, contraste, texto sobreimpreso en el fotograma, o «disparar» la cámara de forma manual.

control_localhost off
La opción por defecto (on) impide el acceso al servidor de control de Motion desde cualquier otro ordenador que no sea localhost. Ponlo en OFF para poder acceder desde fuera.

control_authentication usuario:contraseña

Si desactivas la opcion control_localhost aqui debes indicar el usuario y contraseña solicitados para acceder al panel de control web.

on_event_start value
on_event_end value
on_picture_save value
on_motion_detected value
on_movie_start value
on_movie_end value

Casi al final del documento disponeis de una serie de valores para configurar el comportamiento de Motion al «comenzar un evento» «al finalizar un evento» «al guardar una imagen» «al detectar movimiento» «al comenzar una grabación» y «al finalizar una grabación».
Si no quereis hacer nada especial, solo grabar imágenes al detectar movimiento, estos parámetros estarán comentados (;)
Si deseais que Motion os envie una imagen por correo cuando se detecte movimiento podeis añadiron_picture_save echo "Captura realizada, esta es la imagen:" | mail -s "Avisos de Motion" -a %f micorreo@servicor.com