Flujo óptico: leer el movimiento entre fotogramas

El seguimiento de movimiento por flujo óptico es la única señal sobre la que se construye todo script de AutoScript Sync. Entre cada par de fotogramas muestreados, el flujo óptico denso DIS mide cuánto se desplazaron los píxeles de la región en movimiento. Eso da la velocidad, que el motor integra en una traza de posición y sujeta a un ancla para limitar la deriva. El flujo se ejecuta en la CPU en todos los equipos.

Comprobado con el código de la aplicación el 21 de septiembre de 2026.

Flujo óptico DIS sobre la región en movimiento

El motor de IA adaptativo predeterminado usa el flujo óptico DIS (Dense Inverse Search) de OpenCV con su preajuste FAST. Se ejecuta sobre la región que el motor detectó en movimiento, o sobre el recuadro que dibujaste con Set Motion Region… o Live Track, dentro de un fotograma reducido a 320 px de ancho. Una segunda pasada DIS a media resolución con el preajuste ultrafast se ejecuta en paralelo para comprobar si el flujo es fiable.

Fast
Flujo entre uno de cada 4 fotogramas: 7,5 muestras por segundo en vídeo de 30 fps.
Balanced
Uno de cada 3 fotogramas: 10 muestras por segundo en vídeo de 30 fps. El predeterminado.
High
Uno de cada 2 fotogramas: 15 muestras por segundo en vídeo de 30 fps. En imágenes planas (no RV) de al menos 640 px de ancho, el flujo de la región seguida también se mide a 640 px. La nota del desarrollador registra una pequeña mejora con esto (+0,007 y +0,003 de F1 de recorridos en dos películas) a cambio de aproximadamente 1,4 veces el tiempo de análisis.

El intervalo es un número fijo de fotogramas, así que en vídeo de 60 fps todas las tasas se duplican.

Puede que leas en otros sitios que AutoScript Sync usa el flujo óptico Farneback. El motor principal no lo usa. Farneback solo aparece en el motor básico, que obtienes al desmarcar Use adaptive AI engine para el botón principal Generate, y en el muestreador que hay detrás de AI Bulk Learn.

De la velocidad a la posición

El flujo te dice lo rápido que se movió algo, no dónde está. Sumar velocidades da una posición, pero cada pequeño error se suma con ella y la traza se desvía. Por eso el motor sujeta el flujo integrado a un ancla: una medida de posición absoluta y más lenta, elegida por vídeo entre el centro de la región en movimiento, los puntos clave de la pose y la profundidad relativa. Por defecto, el ancla pasa a ser una mezcla muestra a muestra de todos los canales legibles, si esa mezcla puntúa al menos tan bien como la ganadora única.

Un filtro de Kalman con un suavizador RTS (una pasada hacia delante seguida de una pasada hacia atrás sobre todo el vídeo) fusiona ambos en una única traza de posición. El ajuste Depth priority, de 30 a 90 con un valor predeterminado de 85, fija qué parte de esa traza procede de la velocidad: cuanto más alto, menor es el peso del ancla. La propia descripción emergente del ajuste explica el compromiso: la velocidad aporta el tamaño del recorrido, mientras que el ancla detiene la deriva pero aplana la profundidad y no puede seguir los recorridos rápidos. Cambiarlo requiere regenerar, no basta con volver a enviar.

Donde el seguimiento se pierde, el hueco se rellena con movimiento rítmico continuado a partir de los recorridos de ambos lados, y la proporción de la línea de tiempo rellenada así se registra en los metadatos del script.

Limpiar el ritmo

Por defecto se aplican dos limpiezas a la traza terminada. El plegado armónico elimina los zigzags al doble de la frecuencia real de recorrido. La regularización del ritmo desplaza los picos de baja confianza hacia el pulso local. Después se colocan los puntos en cada inversión, como se describe en cómo funciona la generación de funscript con IA.

Vectores de movimiento del códec y envolvente de audio

Mientras se ejecuta la pasada principal, un hilo en segundo plano lee dos señales más con PyAV. Ambas son opcionales: sin PyAV o sin pista de audio, la vía solo de vídeo funciona sin cambios.

  • Vectores de movimiento del códec. El vídeo comprimido ya almacena, para cada fotograma, cómo se movieron los bloques de la imagen. La aplicación lee esos vectores de todos los fotogramas, no solo de los muestreados, dentro de un presupuesto de tiempo de 25 a 150 segundos que crece con la duración de la película. Su velocidad solo se usa como señal cuando cubren al menos el 90% de la película.
  • Una envolvente de volumen de audio a 50 Hz, dentro de un presupuesto de 20 a 120 segundos. El audio mantiene el movimiento rellenado en fase con el ritmo de la banda sonora.

Por los presupuestos, una película larga puede quedar cubierta solo en parte. Su función principal es servir de testigos de frecuencia: ayudan a decidir qué tramos reciben una segunda pasada que los vuelve a leer a la tasa de fotogramas completa. Esa pasada se dirige a ventanas donde el movimiento parece demasiado rápido para la tasa de muestreo o donde la calidad del seguimiento es baja. Esa pasada abarca como máximo 4 tramos y como máximo el 35% del vídeo. En la medición del desarrollador cubrió en realidad del 0,2 al 0,6% de cada película de prueba, todo en los primeros 40 segundos, porque los tramos se mantienen en orden cronológico. No es una pasada a tasa completa sobre toda la película. Para un tramo que elijas, Re-analyze del editor de línea de tiempo lo hace cuando lo pides.

Detección de cortes de escena

Integrar el flujo a través de un corte trataría un cambio de cámara como un movimiento enorme. Por eso el motor comprueba cada par de fotogramas muestreados: una diferencia media de píxeles superior a 28 marca un posible corte, y solo cuenta como corte si los histogramas de brillo de los dos fotogramas en escala de grises también tienen una correlación inferior a 0,80. La comprobación del histograma distingue un corte real de un movimiento rápido, que cambia muchos píxeles pero desplaza la misma imagen en lugar de sustituirla. Los cortes se detectan así, no a partir de los vectores de movimiento del códec.

Lo que cuesta el flujo

El flujo no es la parte cara. En el laboratorio de flujo del desarrollador, el paso de flujo en CPU costó una mediana de 4,8 a 5,1 ms por muestra con el ajuste Balanced, y de 7,6 a 9,1 ms con la resolución de región duplicada de High. Esas cifras proceden de 200 a 400 muestras en cada una de tres películas, midiendo solo el paso de flujo, no una generación completa, así que tómalas como una idea de escala y no como una prueba de rendimiento. Desde que la profundidad pasó a la GPU, la inferencia de pose ha sido la etapa más grande en las mediciones del desarrollador.

Límites

  • Recorridos rápidos y tasa de muestreo. Con Balanced en vídeo de 30 fps, el motor ve 10 fotogramas por segundo. Frente a los clips de prueba con scripts hechos a mano por el desarrollador, los recorridos de las dos películas más rápidas salieron mucho más pequeños que los de la persona, y la explicación de trabajo es que esta tasa suaviza hasta borrar el movimiento rápido. High muestrea con más densidad; Re-analyze lee un tramo seleccionado a la tasa de fotogramas completa.
  • El flujo mide movimiento, no significado. Cualquier movimiento dentro de la región seguida se registra, sea o no el recorrido que te interesa. En los tramos que una persona marcó como sin acción, el motor siguió produciendo unos 85 cambios de sentido por minuto.
  • Solo CPU. El flujo se ejecuta con la implementación en CPU de OpenCV en todos los PC. Una GPU más rápida acelera la pose y la profundidad, no el flujo.

Preguntas

¿Por qué la aplicación usa DIS en lugar de Farneback?

El motor de IA adaptativo, que es el predeterminado, usa DIS con el preajuste FAST más una comprobación de fiabilidad a media resolución. Farneback solo sobrevive en el motor básico y en el muestreador de AI Bulk Learn. Son dos métodos distintos de flujo denso de OpenCV; esta página describe lo que ejecuta el código, no una comparación directa que hayamos publicado.

¿Un vídeo necesita sonido?

No. La envolvente de audio ayuda a mantener los huecos rellenados al ritmo cuando hay banda sonora. Sin ella, la vía solo de vídeo funciona sin cambios.

¿Puedo hacer que el flujo siga una parte concreta del fotograma?

Sí. Set Motion Region… toma un recuadro para todo el vídeo, y Live Track te permite mover el recuadro mientras se reproduce el vídeo; el seguimiento se guarda junto al vídeo como un archivo .roitrack.json.

Sigue leyendo

Pruébalo con tus propios vídeos

La prueba dura un día y se ejecuta en tu propio PC; tus vídeos se analizan localmente y nunca se suben.