Detección de movimiento con Motion y cámara ESCAM QD520

Me reincorporo de nuevo a este blog para explicaros como podemos montar un sistema de videovigilancia con motion y una cámara barata HD720 como la ESCAM QD520.

La cámara en cuestión es la siguiente:

Cámara Escam QD520.
Cámara Escam QD520.

 

Se trata de una cámara bastante barata (35€ puesta en casa enviada desde China). Para no aburriros con la tabla de detalles estas son las más importantes:

  • Tiene visión nocturna, con un alcance de unos 15 metros.
  • Es fija, aunque la podemos orientar una vez anclada a la pared o techo que queramos.
  • Resolución 1280 x 720 H.264 (RTSP).
  • Conexión RJ45, sin Wifi.
  • Sirve para exterior (IP66) e interior, la carcasa de aluminio es bastante resistente.
  • Funciona con 12V/1A.
  • Permite detectar movimiento, enviar correos, subir imágenes a FTP, …
  • El panel de control web que lleva funciona con un ActiveX en Internet Explorer.

Un ejemplo de imagen capturada es el siguiente (en un sótano que estoy pintando y limpiando):

Captura de la Cámara. Clic para ampliar.
Captura de la Cámara. Clic para ampliar.

Lo realmente importante es que a través del protocolo RTSP podemos obtener un flujo de video que posteriormente motion podrá usar como fuente de video para detectar movimiento.

La otra pieza clave es motion, un software de detección de movimiento para sistemas Linux, bastante flexible y potente. La última versión, la 3.2.12, es del 1 de Junio de 2010, aunque existen varios forks que amplían funcionalidades. En nuestro caso vamos a usar uno de esos forks, el de Dr dave.

Compilando  motion

Lo primero que debemos hacer es instalar las dependencias que vamos a necesitar para luego compilar el software:

sudo apt-get install git autoconf automake build-essential libtool libjpeg8-dev libzip-dev
sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev libav-tools libswscale-dev
git clone https://github.com/Mr-Dave/motion

Con esto ya tendremos la herramientas para compilar, las librerías libav para procesar el video, y el código fuente de motion. Ahora entramos en la carpeta motion y configuramos las opciones de compilación:

cd motion
./configure --prefix=/usr

Esto comprobará el sistema y al final nos mostrará un resumen como el siguiente:

**************************
Configure status
motion Unofficial-Git-a5b5f13
**************************

OS             :     Linux
pthread support:     Yes
jpeg support:        Yes
V4L support:         Yes
V4L2 support:        Yes
SDL support:         No
FFmpeg support:      Yes
SQLite3 support:     No
MYSQL support:       No
PostgreSQL support:  No

CFLAGS:  -g -O2 -D_REENTRANT -DHAVE_FFMPEG -I/usr/local/include -DFFMPEG_NEW_INCLUDES -DHAVE_FFMPEG_NEW -DMOTION_V4L2 -DMOTION_V4L2_OLD -DTYPE_32BIT="int" -DHAVE_BSWAP   -march=native -mtune=native
LIBS: -lm  -lpthread -ljpeg -L/usr/local/lib  -lavformat -lavcodec -lavutil -lm -lz -lswscale
LDFLAGS:   -L/usr/local/lib

Install prefix:       /usr

Las lineas importantes son las de ffmpeg a Yes y la de librerías avformat, avcodec y avutil.

make
make install

Al cabo de unos segundos tendremos el software compilado e instalado. Solo nos falta crear un enlace de /usr/etc/motion a /etc/motion (para tener las cosas ordenadas):

ln -s /usr/etc/motion /etc/motion

 

Configurando motion

Una vez instalado el software, ahora tenemos que configurarlo para ello necesitamos saber la dirección IP de la cámara y la URL del stream RTSP que nos dará el video. En el caso de la cámara QD520, es la siguiente:

rtsp://IP_CAMARA:554/user=USUARIO&password=PASSWORD&channel=1&stream=0.sdp?

donde IP_CAMARA es la dirección IP de la cámara, USUARIO es el usuario con permisos para visualizar el video (yo uso admin) y PASSWORD es la contraseña del usuario (en mi caso la de admin).

Editamos el fichero /etc/motion/motion.conf y ajustamos las siguientes variables:

  • Modo de funcionamiento, en segundo plano (on) o en primer plano (off): daemon on
  • Archivo de registro: logfile /var/log/motion.log
  • Ancho de la imagen: width 1280
  • Alto de la imagen: height 720
  • URL del stream de video: netcam_url “rtsp://IP_CAMARA:554/user=USUARIO&password=PASSWORD&channel=1&stream=0.sdp?” (es muy importante que comentemos la linea videodevice /dev/video0, si usamos una cámara IP). También son importantes las comillas en la URL para no tener problemas con los caracteres especiales.
  • Número de píxeles que deben cambiar entre imágenes para detectar movimiento: threshold 1500
  • Guardar imágenes si se detecta movimiento: output_pictures on
  • Calidad de las imágenes guardadas (calidad jpeg): quality 75
  • Guardar video si se detecta movimiento: ffmpeg_output_movies on
  • Formato de video de salida: ffmpeg_video_codec mpeg4
  • Marcar con un recuadro la zona de movimiento: locate_motion_mode on
  • Carpeta donde se guardaran imágenes y videos: target_dir /mnt/Data/motion/capturas

Hay montones de variables que podemos modificar aparte de las anteriores, un grupo importante para los sistemas de videovigilancia son las de gestión de eventos: on_event_start, on_event_end, on_motion_detected, on_picture_saved, on_movie_start, on_movie_end, on_camera_lost… que nos permiten ejecutar un comando de nuestra elección (generalmente un script) cuando se produce un evento. Por ejemplo: podemos hacer que nos envie una foto por email, o que nos mande un correo si se pierde la conexion con la camara, o que cuando haya acabado de grabar un video lo suba a un ftp,…

Cuando acabamos de modificar el fichero motion.conf, lo guardamos, y lanzamos el programa con:

motion -c /etc/motion/motion.conf

y si no hemos especificado fichero de log (logfile) en el fichero de configuración obtendremos por pantalla una lista de todo lo que va haciendo y detectando motion durante su ejecución. El registro sería algo parecido a esto (obtenido de un archivo de log):

[0] [NTC] [ALL] [Feb 10 14:03:53] motion_startup: Using log type (ALL) log level (NTC)
[0] [NTC] [ALL] [Feb 10 14:03:53] become_daemon: Motion going to daemon mode
[0] [NTC] [ALL] [Feb 10 14:03:53] become_daemon: Created process id file /var/run/motion/motion.pid. Process ID is 25642
[0] [NTC] [ALL] [Feb 10 14:03:53] motion_startup: Motion running as daemon process
[0] [NTC] [ENC] [Feb 10 14:03:53] ffmpeg_init: ffmpeg LIBAVCODEC_BUILD 3561060 LIBAVFORMAT_BUILD 3554154
[0] [NTC] [ALL] [Feb 10 14:03:53] main: Thread 1 is from /etc/motion/motion.conf
[0] [NTC] [ALL] [Feb 10 14:03:53] main: Thread 1 is device: rtsp://IP_CAMARA:554/user=admin&password=PASSWORD&channel=1&stream=0.sdp? input -1
[0] [NTC] [ALL] [Feb 10 14:03:53] main: Stream port 8081
[0] [NTC] [ALL] [Feb 10 14:03:53] main: Waiting for threads to finish, pid: 25642
[1] [NTC] [ALL] [Feb 10 14:03:53] motion_init: Thread 1 started , motion detection Enabled
[1] [ALR] [NET] [Feb 10 14:03:53] netcam_start: Network Camera thread starting... for url (rtsp://IP_CAMARA:554/user=admin&password=PASSWORD&channel=1&stream=0.sdp?)
[0] [NTC] [STR] [Feb 10 14:03:53] httpd_run: motion-httpd testing : IPV4 addr: 0.0.0.0 port: 8080
[0] [NTC] [STR] [Feb 10 14:03:53] httpd_run: motion-httpd Bound : IPV4 addr: 0.0.0.0 port: 8080
[0] [NTC] [STR] [Feb 10 14:03:53] httpd_run: motion-httpd/Unofficial-Git-5c6f4be running, accepting connections
[0] [NTC] [STR] [Feb 10 14:03:53] httpd_run: motion-httpd: waiting for data on 0.0.0.0 port TCP 8080
[1] [NTC] [NET] [Feb 10 14:03:53] netcam_rtsp_open_context: Using tcp transport
[1] [NTC] [NET] [Feb 10 14:03:56] netcam_connect_rtsp: Camera connected
[1] [NTC] [ALL] [Feb 10 14:03:56] image_ring_resize: Resizing pre_capture buffer to 1 items
[1] [ALR] [NET] [Feb 10 14:03:56] netcam_handler_loop: Camera handler thread [2] started
[1] [NTC] [STR] [Feb 10 14:03:57] http_bindsock: motion-stream testing : IPV4 addr: 127.0.0.1 port: 8081
[1] [NTC] [STR] [Feb 10 14:03:57] http_bindsock: motion-stream Bound : IPV4 addr: 127.0.0.1 port: 8081
[1] [NTC] [ALL] [Feb 10 14:03:57] motion_init: Started motion-stream server in port 8081 auth Disabled
[1] [NTC] [EVT] [Feb 10 14:04:01] event_new_video FPS 2
[1] [NTC] [ENC] [Feb 10 14:04:01] ffmpeg_open Selected Output FPS 2
[1] [NTC] [EVT] [Feb 10 14:04:01] event_newfile: File of type 8 saved to: /mnt/Data/motion/captura/01-20150210140401.avi
[1] [NTC] [ALL] [Feb 10 14:04:01] motion_detected: Motion detected - starting event 1
[1] [NTC] [EVT] [Feb 10 14:04:01] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140401-00.jpg
[1] [NTC] [EVT] [Feb 10 14:04:01] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140401-01.jpg
[1] [NTC] [EVT] [Feb 10 14:04:02] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140402-00.jpg
[1] [NTC] [EVT] [Feb 10 14:04:02] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140402-01.jpg
[1] [NTC] [EVT] [Feb 10 14:04:03] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140403-00.jpg
[1] [NTC] [EVT] [Feb 10 14:04:03] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140403-01.jpg
[1] [NTC] [EVT] [Feb 10 14:04:04] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140404-00.jpg
[1] [NTC] [EVT] [Feb 10 14:04:04] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140404-01.jpg
[1] [NTC] [EVT] [Feb 10 14:04:05] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140405-00.jpg
[1] [NTC] [EVT] [Feb 10 14:04:05] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140405-01.jpg
[1] [NTC] [EVT] [Feb 10 14:04:06] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140406-00.jpg
[1] [NTC] [EVT] [Feb 10 14:04:06] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140406-01.jpg
[1] [NTC] [EVT] [Feb 10 14:04:07] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140407-00.jpg
[1] [NTC] [EVT] [Feb 10 14:04:07] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140407-01.jpg
[1] [NTC] [EVT] [Feb 10 14:04:08] event_newfile: File of type 1 saved to: /mnt/Data/motion/captura/01-20150210140408-00.jpg
[1] [NTC] [ALL] [Feb 10 14:05:08] motion_loop: End of event 1

Fácil, ¿verdad? Pues en mi odroid U3, tan solo consume un 7% de CPU, funciona perfectamente, y muchísimo más configurable que la detección de movimiento de la propia cámara.

Espero que os haya gustado, y como siempre, todas las pregustas y comentarios serán bien recibidas 🙂

Actualización 1/12/2015:

A petición de Juan, publico aquí el contenido de mi fichero motion.conf para que podáis comparar con el vuestro si tenéis algún problema:

daemon on
process_id_file /var/run/motion/motion.pid
setup_mode off
log_level 6
log_type all
v4l2_palette 17
input -1
norm 0
frequency 0
rotate 0
width 1280
height 720
framerate 2
minimum_frame_time 0
netcam_url "rtsp://192.168.2.170:554/user=USUARIO&password=PASSWORD&channel=1&stream=0.sdp?"
netcam_keepalive off
netcam_tolerant_check off
rtsp_uses_tcp on
auto_brightness off
brightness 0
contrast 0
saturation 0
hue 0
roundrobin_frames 1
roundrobin_skip 1
switchfilter off
threshold 1500
threshold_tune off
noise_level 32
noise_tune on
despeckle_filter EedDl
smart_mask_speed 0
lightswitch 0
minimum_motion_frames 1
pre_capture 0
post_capture 0
event_gap 60
max_movie_time 0
emulate_motion off
output_pictures on
output_debug_pictures off
quality 75
picture_type jpeg
ffmpeg_output_movies on
ffmpeg_output_debug_movies off
ffmpeg_timelapse 0
ffmpeg_timelapse_mode daily
ffmpeg_bps 400000
ffmpeg_variable_bitrate 0
ffmpeg_video_codec mpeg4
ffmpeg_deinterlace off
use_extpipe off
snapshot_interval 0
locate_motion_mode on
locate_motion_style box
text_right %Y-%m-%d\n%T-%q
text_changes off
text_event %Y%m%d%H%M%S
text_double off
target_dir /mnt/Data/motion/captura
snapshot_filename %v-%Y%m%d%H%M%S-snapshot
picture_filename %v-%Y%m%d%H%M%S-%q
movie_filename %v-%Y%m%d%H%M%S
timelapse_filename %Y%m%d-timelapse
ipv6_enabled off
stream_port 8081
stream_quality 50
stream_motion off
stream_maxrate 1
stream_localhost on
stream_limit 0
stream_auth_method 0
webcontrol_port 8080
webcontrol_localhost on
webcontrol_html_output on
track_type 0
track_auto off
track_iomojo_id 0
track_step_angle_x 10
track_step_angle_y 10
track_move_wait 10
track_speed 255
track_stepsize 40
quiet on

 

18 comentarios

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.