¿Existe un proceso automatizado para dividir un video en secciones con movimiento?

Tengo algunos archivos de video con un fondo razonablemente estático y movimiento ocasional en la escena. Me gustaría reducir el metraje a solo las secciones con movimiento. Como hay varias horas de metraje, preferiría no hacerlo a mano.

Esperaba encontrar una secuencia de comandos o una utilidad a la que pudiera canalizar los medios y obtener segmentos con movimiento del otro lado. Mi búsqueda limitada no ha sugerido nada que pueda hacer esto, a menos que pueda hacer que VLC use su filtro de movimiento de alguna manera para etiquetar cosas.

Preferiría usar un sistema gratuito o FOS, ya que soy barato. Si esa no es una opción, consideraré pagar. Estoy feliz de que el software esté basado en Windows o Linux. Preferiría no volcar todos los cuadros como imágenes fijas, ejecutar una diferencia y volver a codificar, pero si esa es la única forma, entonces probablemente pueda trabajar con eso. Puedo codificar en C, C++, Ruby y un par de otros lenguajes de secuencias de comandos si me presionan. No me importa dedicar un poco de tiempo a escribir algo si no hay nada disponible y otros pueden encontrarlo útil. Sin embargo, no tengo experiencia en el procesamiento de medios, por lo que, aunque entiendo los conceptos, estaría bastante perdido al elegir bibliotecas para usar como punto de partida, etc.

El video es de un comedero para pájaros con un seto y una cerca detrás. Hay un movimiento lento de sombras a medida que el sol se mueve, pero por lo demás el fondo parece estable. Creo que alrededor del 5 % del cuadro se llenará con el movimiento que necesito captar. Solo menciono eso porque configuré la captura de movimiento de ZoneMinder en el pasado, así que estoy familiarizado con la configuración de su filtro.

Incluso si alguien no puede darme una respuesta completa, agradecería algunos consejos, sugerencias y palabras clave que me ayuden a llevar esto adelante.

Comenzaría investigando opencv. Quizás haya una aplicación de código abierto que lo use y ya haga lo que quieres.
También creo que imageMagick puede procesar video e incluye una función de comparación que compara también imágenes. Tal vez pueda indicar que descarte fotogramas donde la diferencia sea 0 y mantenga los fotogramas cuando haya una diferencia real
Sin embargo, un poco de clic conduce a algo útil que suena "Mire aquí para encontrar el uso en sus algoritmos de transmisión de video como: extracción de movimiento ..." docs.opencv.org/doc/tutorials/video/table_of_content_video/… Lamentablemente parece que hay no hay tutorial allí todavía. Sin embargo, me ocuparé de encontrar o configurar algo con OpenCV, luego quizás agregue algunas notas allí. Gracias por la sugerencia.

Respuestas (2)

Hay una pregunta similar en el desbordamiento de pila.

https://stackoverflow.com/questions/28320004/detect-if-video-file-contains-movement

Además de OpenCV, también sugieren SimpleCV http://simplecv.org/ y "Motion" http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome

Si agrega un voto negativo, al menos agregue un comentario sobre por qué. De lo contrario, ¿cómo puedo mejorar esta respuesta?

No lo he probado, pero creo que sería posible hacerlo con el filtro de cambio de escena seleccionado de ffmpeg. Puedes intentar algo como:

ffmpeg -i input.ext -filter:v "select=gt(scene\,0.2)" -c:v copy output.ext

Tenga en cuenta que debe escapar de la coma, aunque el valor esté entre comillas. El segundo parámetro es con lo que necesita jugar para determinar lo que considera "movimiento".

Saqué la idea de: https://www.bogotobogo.com/FFMpeg/ffmpeg_thumbnails_select_scene_iframe.php