Detección de movimientos sobre un archivo de vídeo
sábado, 20 de febrero de 2010Lo común es realizar la detección de movimientos sobre un dispositivo conectado al ordenador y grabando en tiempo real, pero imagina que ya tienes la grabación, un archivo de vídeo de 12 horas de grabación continua: a ver quien es el guapo que zampa esas 12 horas en busca de alguna actividad.
El otro día un amigo me comentaba esta posibilidad: con la idea de obtener unas secuencias con una calidad mejor de las que puede ofrecer una triste capturadora+cámara+cctv, usar una cámara de vídeo «standard» para «grabar todo, a lo bruto» y a continuación pasar sobre ese (mega) video resultante un «detector de movimientos«.
Por supuesto, la aplicación utilizada para detectar movimientos es Motion, sinembargo Motion no viene preparado para tomar como fuente de datos un simple archivo de vídeo, asi es que lo he hecho es emitir el streaming en localhost del archivo de vídeo con la ayuda de VLC y a continuación lanzar Motion diciendole que dicho streaming es una cámara en red.
Preparar y lanzar Motion
Primero creamos un archivo sencillo de configuración para Motion donde le indicamos la ruta de la cámara que crearemos posterior con VLC. Este archivo contiene los parametros de detección de movimiento habituales: threshold, despeckle, post_capture, etc…
Un archivo de configuración básico podría ser algo como esto (copia estas líneas a un archivo fake_camara.conf) :
daemon off
width 720
height 576
framerate 100
netcam_url http://localhost:9000/video.mjpg
threshold 300
despeckle edl
gap 10
max_mpeg_time 3600
ffmpeg_cap_new on
ffmpeg_bps 800000
ffmpeg_deinterlace off
text_right ""
target_dir /home/mi-user/Desktop
movie_filename fake_video_%Y%m%d%H%M%S
Observa algunos puntos, como la url hacia la que apuntamos Motion hacia una cámara de red ubicada en http://localhost:9000/video.mjpg que crearemos a continuación, con el framerate 100 no aseguramos codificar al mismo nivel que se recibe . El resto de parámetros son bastante autoexplicativos.
Aunque no hayamos lanzando todavía el streaming ya puede iniciar Motion con estos parametros, el programa quedará a la espera de poder conectar con la cámara de red. Abre una consola y escribe:
motion -c ~/Desktop/fake_camara.conf
Enviar streaming de vídeo a Motion
Motion se encuentra a la espera de conectar una cámara de red que sirva JPEG individuales ó multipart (MJPEG). Con ayuda de VLC codificamos nuestro video ORIGINAL.MPG a dicho formato y lo volcamos en la dirección que está escuchando Motion.
vlc ORIGINAL.MPG --sout '#transcode{vcodec=mjpg,vb=1600,fps=24}:duplicate{dst=standard{access=http{mime=multipart/x-mixed-replace;boundary=--7b3cc56e5f51db803f790dad720ed50a},mux=mpjpeg,dst=0.0.0.0:9000/video.mjpg},dst=display}'
Esto lanza una ventana de VLC en la que podemos ver nuestro vídeo al mismo tiempo que el streaming que es capturado por Motion. A partir de este momento irán apareciendo en tu escritorio secuencia de vídeo «fake_video_xxxx.avi» a medida que se detecte actividad en la secuencia de vídeo.
Es importante utilizar un bitrate de compresión a mjpg (vb=1600) lo más parecido posible al que traiga el archivo original, de esta manera nos aseguramos la menor pérdida de calidad en el proceso de conversion de un formato a otro.
Algunas mejoras
He probado el sistema descrito con un vídeo de 10 minutos grabado por la cámara de vídeo a 720×576@25 y resultado ha sido bueno desde el primero momento, obteniendo los 4-5 vídeos que contenian movimiento.
Lo primero que habría que mejorar sería la recodificación constante del video original, es decir: tenemos un mpeg que codificamos a mjpeg para emitirlo en streaming y que al detectar movimiento se guarda como msmpeg4.
Evidentemente esto es absurdo, pero no debería costar mucho configurar Motion para que en lugar de capturar las partes del video que contienen movimiento se limite a producir un archivo Log de texto en el que queden recogidos los minutos:segundos.
Por lo pronto, según el modo anterior se producirian vídeos con nombres que indican la hora:minuto:segundo con lo que resulta facil saber en que posición del video original se encuentra el movimiento.
La otra cuestión es mas complicada de solucionar: la detección en tiempo real.
El método descrito requiere que si tenemos un vídeo de 24 horas de duración, tengamos al ordenador otras 24 horas procesando dicho vídeo. Esto desde luego es un incordio importante y no se me ocurre como solucionarlo.
Quizás jugando con los framerate pudieramos acelerar algo el proceso y obligar a Motion a procesar una fuente de vídeo a 240 FPs, un suponer,pero ignoro cual podría ser el resultado.
none
#1/ 20 de February/2010 a 13:54:50
Otros comentarios de «none»
muy espabilado...
yo pensaba que motion si podía leer desde un archivo directamente... pero parece que no, como nunca lo he necesitado.
no soy programador , pero no debe ser muy difícil de implementar teniendo el código de motion, que esta disponible.
Leo
#2/ 15 de October/2010 a 19:39:42
Otros comentarios de «Leo»
hola me gustaria saber si me podes hacer unos trabajos en motion, seguro ya tenes hecho lo que necesito.saludos. espero tu correo
Ennio
#3/ 16 de January/2011 a 01:05:38
Otros comentarios de «Ennio»
Hola estoy buscando un programador para hacer un software de escaneo de moviento con una camara, a lo mejor te interesa el trabajo, es una propuesta seria escrivime a mi correo y hablamos gracias
LE0 037
#4/ 04 de August/2012 a 00:32:27
Otros comentarios de «LE0 037»
Hola. Inspirado por tu trabajo, decidí implementar un sistema de cámaras de seguridad con debian 6.0, una pico2000bt878(igual a la tuya) y 2 cámaras, motion y vcl instalados. Puedo ver las imágenes de las cámaras. No logro realizar lo que haces aquí con motion y vcl. Cómo indicarle de que cámara debe tomar la señal? la verdad estoy confundido. Ejecutando la sentencia de vcl que dejaste sale "archivo no encontrado" no recuerdo bien. Te agradecería mucho si me puedes orientar.(algun manual sobre el tema o link para estudiar). Desde ya gracias por compartir tus conocimientos.
Trebol-a
#5/ 04 de August/2012 a 01:08:27
Otros comentarios de «Trebol-a»
Hola Leo,
a ver, estoy lo hice para un amigo que tenía cientos de horas de video de grabaciones realizadas en el monte. Para no tener que visionar todos los vídeos buscando algo "interesante" desarrollé este método. La verdad es que no lo he vuelto a usar, pero es relativamente simple:
Basicamente le dices a VLC que reproduzca un archivo de vídeo (original_0001.mpg, por ejemplo) y lo emita en el puerto 9000 de tu ordenador bajo el nombre video.mjpg.
A continuación (o antes, es indiferente) le dices a Motion que la cámara está en netcam_url http://localhost:9000/video.mjpg (que es el vídeo que está distribuyendo VLC)
A partir de ahí motion se comporta como siempre, busca actividad y extrae secuencias con movimiento del vídeo original.
Luis garcia
#6/ 11 de October/2012 a 10:05:13
Otros comentarios de «Luis garcia»
Simplemente, quería darte gracias por el aporte. He aprendido mucho de motion gracias a tu blog y especialmente este artículo me ha evitado mucho trabajo.
Trebol-a
#7/ 11 de October/2012 a 11:02:53
Otros comentarios de «Trebol-a»
Hola Luis,
me alegra que estas cosas, siendo tan específicas sirvan de vez en cuando a alguien para algo! :D
Un saludo
18 de December, 2024 @ 17:59