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:

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):

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
Primero gracias por compartir todo tu conocimiento.
Le escribo desde Colombia y mi pregunta es porque el FFmpeg me sale con «no». Pues tu dices que es importante que salg con «yes». Y entonces como hago para que salga el «yes».
Te agradezco de antemano cualquier ayuda.
Es importante que esté a ‘Yes’ porque el video que genera la cámara está en formato h264 y motion utiliza las ffmpeg (las librerias av: avformat, avcodec y avutil) para decodificar el video y procesarlo.
Revisando las librerias tampoco me salen
Al ejecutar el comando ‘sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev libav-tools libswscale-dev’ debería instalarte las librerías. ¿Has buscado en el sistema si tienes los ficheros libavcodec.so o libavcodec.so.54…?
Si aun tienes problemas puedes editar el fichero ‘configure’ y a partir de la linea 5278 puedes ver los comandos que ejecuta el script para comprobar que tienes instaladas correctamente las librerías. El script busca en /usr/lib, /usr/lib64, /usr/local/lib y alguna otra. Si tienes las librerías instaladas en tu sistema pero no están en alguna de esas rutas, tendrás que especifícaselas al script ‘configure’ cuando lo ejecutes:
–with-ffmpeg=DIR Specify the prefix for the install path for libavcodec/libavformat (part of ffmpeg) be able to encode mpeg movies realtime. If this is not specified motion will try to find the libraries in /usr and /usr/local.
–with-ffmpeg-headers=DIR Specify the prefix for ffmpeg headers.
–with-ffmpeg-libs=libs Specify the extra libs for ffmpeg
Buenos días José María!!! Lo primero, muchas gracias.
He conseguido instalar este fork de Motion en una Raspberry, me genera vídeo y fotos, si bien, el problema que tengo es que no consigo que la imagen sea demasiado nítida, ni en fotos ni en video. En algunos casos, la imagen se distorsiona. He leído toda la documentación y estoy trasteando con los parámetros de configuración, pero no consigo dar con la tecla.
Si conecto directamente a la cámara vía http, la imagen es mucho más nítida que la grabada a través de Motion. ¿es normal?
Después de este «rollo», la pregunta es, ¿tú has conseguido hacer grabaciones y fotos de calidad? Si es así, ¿me podrías pasar tu archivo de configuración para contrastar las opciones con las mías?
Saludos cordiales.
Por cierto, por si sirve de algo, el video normalmente lo graba a 2 ó 3 FPS. En el log que tu has puesto a modo de ejemplo, los FPS son 2 (ffmpeg_open Selected Output FPS 2″. ¿has conseguido hacer que capture a más FPS? Gracias!
La carga de procesamiento depende de los FPS que le pongas). Si con 2 la carga es muy fuerte, con más, será mucho peor. Usando mpv y la detección de alertas al puerto 15002 podrás capturar a los FPS que quieras, ya que la carga será de disco (al guardar las imágenes o vídeos) más que de CPU (al detectar movimiento). Claro, esto último dependerá de la codificación del vídeo que hagas (a más compresión mas carga…)
Lo de que la imagen se distorsione supongo que te refieres a que desde cierta altura, la imagen aparece como en franjas verticales. Ese es el problema que he tenido yo, y no conseguí solucionarlo en su momento. La cámara es capaz de detectar movimiento por sí misma, y subir snapshots, NO videos, por FTP a un servidor. En su día tampoco lo conseguí hacer funcionar debido a un problema con la versión de firmware que me traía la cámara, del 2014… Justo la semana pasada encontré un post en otro foro (aqui: https://www.ipcamtalk.com/showthread.php/1812-Review-TOP-201-Super-Mini-720P-HD-IP-Cam-%28The-Cheapest-IP-Cam-So-Far-!!%29/page5?s=2b814088f5f296590b433afefb43d772), donde explicaban que esta cámara en realidad es una ‘remarcada’ de otra marcha china (modelo TOP 210)), y que navegando por su foro en chino podías encontrar el firmware actualizado (la web original es: http://www.microsofttranslator.com/bv.aspx?from=&to=en&a=http%3A%2F%2Fwiki.xm030.com%2Findex.php%2FIPC%25E7%25A8%258B%25E5%25BA%258F%25E4%25B8%258B%25E8%25BD%25BD%25E5%259C%25B0%25E5%259D%2580). Me lo bajé (de aqui: http://www.microsofttranslator.com/bv.aspx?from=&to=en&a=http%3A%2F%2Fpan.sohu.net%2Ff%2FMTY2NzYsaGRkaWQ.htm), lo instalé, y funcionó a la primera. Ahora mismo puedo detectar movimiento con la cámara (sin motion) y hacer que suba las imágenes cada segundo a un FTP. Además cuando detecta movimiento, la cámara envía una alerta a un servidor que le definamos (hace una conexión al puerto 15002 de una IP que le podemos definir). Como la cámara no puede grabar video a un FTP cuando detecta movimiento (segun el fabricante, tiene poca memoria y potencia para hacerlo), lo que podemos hacer es detectar esa alarma (conexión al puerto 15002) y lanzar un programa para grabar el vídeo directamente desde el servidor. Esto último lo podemos hacer con el programa mpv mas o menos así (no lo he probado, habría que pulir algo el comando):
mpv «rtsp://192.168.2.204:554/user=USUARIO&password=PASSWORD&channel=1&stream=0.sdp?» -o output.mkv -profile 1080p -ofps 24000/1001
Si queremos grabar imágenes al recibir la alerta nos valdría con (este si que lo he probado y funciona):
mpv «rtsp://192.168.2.204:554/user=USUARIO&password=PASSWORD&channel=1&stream=0.sdp?» -vo=image:format=jpg:jpeg-quality=100 –frames=1 –no-audio
La calidad que da motion depende del tamaño de la imagen de salida y de los parámetros que tengas configurados (como ‘quality 75’). Con mpv los defines en la misma linea de comandos con ‘…jpeg-quality=100…’.
Personalmente me parece una camara con buena optica (mejor que una Foscam FI9851 muy similar que tengo), pero con la pega de que la captura de video habria que hacerla con el programa mpv al detectar una conexión al puerto 15002, dejando la deteccion de movimiento a la camara para no cargar a la Raspberry Pi o a la Odroid demasiado, porque motion carga, y mucho a estas placas. La Raspberry casi se queda inutilizada al usar motion, mientras que usando mpv y las alertas funciona como la seda.
Se me olvidaba: en la web https://www.ipcamtalk.com/showthread.php/1812-Review-TOP-201-Super-Mini-720P-HD-IP-Cam-%28The-Cheapest-IP-Cam-So-Far-!!%29?p=19499&viewfull=1#post19499 hay un SDK para desarrolladores con un archivo que dice que puedes acceder por telnet a la camara con el usuario ‘root’ y la contraseña ‘xmhdipc’. Lo he probado con el firmware nuevo y funciona a la perfección 🙂
Hora de trastearrrrr, jajajajaja.
Muchas gracias José María. Lo probaré a ver que tal.
Por cierto, ¿cómo actualizas el firmware de la cámara? Thanks!
Si accedes a la camara con Internet Explorer, en la opcion Settings -> Advanced, aparece el botón Upgrade.
Si te bajas este fichero, https://www.dropbox.com/s/791blfar39ozu99/QD%20IPC%20CD.rar?dl=0
dentro tienes ‘User Manual/IE Operation User Guide/IE Operation User Guide.doc’, en el punto 13.4 tienes el procedimiento.
🙂
Thanks!!
De nada 🙂
Buenas tardes.
Estoy tratando de instalar el Motion en mi equipo con Kali Linux; pero me indica que no puede localizar las librerias al ejecutar este comando:
sudo apt-get install git autoconf automake build-essential libtool libjpeg8-dev libzip-dev
no encuentra las librerias libjpeg8-dev y libzip-dev
y cuando ejecuto el comando. /configure
fatal error you must have jpeg support motion
Me podrías indicar como solucionar este problema, de antemano gracias.
Tiene toda la pinta de ser un problema con los repositorios de Kali. Puedes probar a instalar libjpeg-turbo o libjpeg-dev.
Excelente de verdad ya estoy loco por tener el Odroid XU4, saludos, gradioso blog, con contenido brillante amigo.
Muchisimas gracias 🙂