Fluxo óptico: ler o movimento entre quadros

O rastreamento de movimento por fluxo óptico é o único sinal sobre o qual todo script do AutoScript Sync é construído. Entre cada par de quadros amostrados, o fluxo óptico denso DIS mede como os pixels da região em movimento se deslocaram. Isso dá a velocidade, que o motor integra num traçado de posição e prende a uma âncora para limitar o desvio. O fluxo roda na CPU em todas as máquinas.

Conferido com o código do app em 21 de setembro de 2026.

Fluxo óptico DIS na região em movimento

O motor de IA adaptativo padrão usa o fluxo óptico DIS (Dense Inverse Search) do OpenCV com o preset FAST. Ele roda na região que o motor encontrou em movimento, ou na caixa que você desenhou com Set Motion Region… ou Live Track, dentro de um quadro reduzido para 320 px de largura. Uma segunda passada DIS em meia resolução, com o preset ultrafast, roda em paralelo para verificar se o fluxo é confiável.

Fast
Fluxo a cada 4º quadro: 7,5 amostras por segundo em vídeo de 30 fps.
Balanced
A cada 3º quadro: 10 amostras por segundo em vídeo de 30 fps. O padrão.
High
A cada 2º quadro: 15 amostras por segundo em vídeo de 30 fps. Em vídeos planos (não RV) com pelo menos 640 px de largura, o fluxo da região rastreada também é medido a 640 px. A anotação do desenvolvedor registra um pequeno ganho com isso (+0,007 e +0,003 de F1 de cursos em dois filmes) com cerca de 1,4 vez o tempo de análise.

O intervalo é uma contagem fixa de quadros, então em vídeo de 60 fps todas as taxas dobram.

Você pode ler em outros lugares que o AutoScript Sync usa fluxo óptico Farneback. O motor principal não usa. O Farneback aparece apenas no motor básico, que você obtém desmarcando Use adaptive AI engine para o botão principal Generate, e no amostrador por trás do AI Bulk Learn.

Da velocidade à posição

O fluxo diz a que velocidade algo se moveu, não onde está. Somar as velocidades dá uma posição, mas cada pequeno erro se soma junto e o traçado vai se desviando. Por isso o motor prende o fluxo integrado a uma âncora: uma medida de posição absoluta e mais lenta, eleita por vídeo a partir do centro da região em movimento, dos pontos-chave da pose e da profundidade relativa. Por padrão, a âncora se torna uma mistura, amostra a amostra, de todos os canais legíveis, se essa mistura pontuar pelo menos tão bem quanto o vencedor único.

Um filtro de Kalman com um suavizador RTS (uma passada para a frente seguida de uma passada para trás sobre o vídeo inteiro) funde os dois num único traçado de posição. A configuração Depth priority, de 30 a 90 com padrão de 85, define quanto desse traçado vem da velocidade: quanto mais alta, menor o peso da âncora. A própria dica da configuração descreve a troca: a velocidade carrega o tamanho do curso, enquanto a âncora impede o desvio, mas achata a profundidade e não consegue acompanhar cursos rápidos. Mudá-la exige gerar de novo, não apenas reenviar.

Onde o rastreamento falha, a lacuna é preenchida com movimento rítmico continuado a partir dos cursos dos dois lados, e a parcela da linha do tempo preenchida assim é registrada nos metadados do script.

Limpar o ritmo

Duas limpezas rodam por padrão no traçado pronto. O dobramento harmônico remove zigue-zagues no dobro da taxa real de cursos. A regularização do ritmo move os picos de baixa confiança em direção à batida local. Os pontos são então colocados em cada inversão, como descrito em como funciona a geração de funscript com IA.

Vetores de movimento do codec e o envelope de áudio

Enquanto a passada principal roda, uma thread em segundo plano lê mais dois sinais com o PyAV. Ambos são opcionais: sem o PyAV ou sem uma faixa de áudio, o caminho só de vídeo roda sem alterações.

  • Vetores de movimento do codec. O vídeo comprimido já guarda, para cada quadro, como os blocos da imagem se moveram. O app lê esses vetores em todos os quadros, não só nos amostrados, dentro de um limite de tempo de 25 a 150 segundos que cresce com a duração do filme. A velocidade deles só é usada como sinal quando cobrem pelo menos 90% do filme.
  • Um envelope de volume do áudio a 50 Hz, dentro de um limite de 20 a 120 segundos. O áudio mantém o movimento das lacunas preenchidas em fase com a batida da trilha sonora.

Por causa dos limites de tempo, um filme longo pode ser coberto só em parte. A função principal deles é servir de testemunhas de frequência: ajudam a decidir quais trechos recebem uma segunda passada que os relê na taxa de quadros completa. Essa passada mira janelas onde o movimento parece rápido demais para a taxa de amostragem ou onde a qualidade do rastreamento é baixa. Essa passada pega no máximo 4 trechos e no máximo 35% do vídeo. Na medição do desenvolvedor, ela na prática cobriu de 0,2 a 0,6% de cada filme de teste, tudo nos primeiros 40 segundos, porque os trechos são mantidos em ordem cronológica. Não é uma passada na taxa de quadros completa sobre o filme inteiro. Para um trecho que você escolher, o Re-analyze do editor de linha do tempo faz isso quando você quiser.

Detecção de cortes de cena

Integrar o fluxo através de um corte trataria uma troca de câmera como um movimento enorme. Por isso o motor verifica cada par de quadros amostrados: uma diferença média de pixels acima de 28 marca um corte candidato, e ele só conta como corte se os histogramas de brilho dos dois quadros em escala de cinza também tiverem correlação abaixo de 0,80. A verificação do histograma separa um corte real de um movimento rápido, que muda muitos pixels, mas desloca a mesma imagem em vez de substituí-la. Os cortes são detectados assim, não pelos vetores de movimento do codec.

Quanto custa o fluxo

O fluxo não é a parte cara. No laboratório de fluxo do desenvolvedor, a etapa de fluxo na CPU custou uma mediana de 4,8 a 5,1 ms por amostra na configuração Balanced, e de 7,6 a 9,1 ms com a resolução de região dobrada do High. Esses números vêm de 200 a 400 amostras em cada um de três filmes, medindo só a etapa de fluxo, não uma geração completa, então tome-os como uma noção de escala, não como um benchmark. Desde que a profundidade passou para a GPU, a inferência de pose tem sido a maior etapa nas medições do desenvolvedor.

Limites

  • Cursos rápidos e a taxa de amostragem. Em Balanced, num vídeo de 30 fps, o motor vê 10 quadros por segundo. Comparados com os clipes de teste roteirizados à mão pelo desenvolvedor, os cursos nos dois filmes mais rápidos saíram bem menores que os do humano, e a explicação provisória é que essa taxa suaviza o movimento rápido até ele sumir. O High amostra com mais densidade; o Re-analyze lê um trecho selecionado na taxa de quadros completa.
  • O fluxo mede movimento, não significado. Qualquer movimento dentro da região rastreada é registrado, seja ou não o curso que interessa a você. Em trechos que um humano marcou como sem ação, o motor ainda produziu cerca de 85 mudanças de direção por minuto.
  • Só CPU. O fluxo roda pela implementação em CPU do OpenCV em todos os PCs. Uma GPU mais rápida acelera a pose e a profundidade, não o fluxo.

Perguntas

Por que o app usa DIS em vez de Farneback?

O motor de IA adaptativo, que é o padrão, usa DIS com o preset FAST mais uma verificação de confiabilidade em meia resolução. O Farneback sobrevive apenas no motor básico e no amostrador do AI Bulk Learn. Os dois são métodos diferentes de fluxo denso do OpenCV; esta página descreve o que o código roda, não uma comparação direta que tenhamos publicado.

O vídeo precisa ter som?

Não. O envelope de áudio ajuda a manter as lacunas preenchidas na batida quando há trilha sonora. Sem ela, o caminho só de vídeo roda sem alterações.

Posso fazer o fluxo seguir uma parte específica do quadro?

Sim. O Set Motion Region… usa uma caixa para o vídeo inteiro, e o Live Track permite mover a caixa enquanto o vídeo toca; o rastreamento é salvo ao lado do vídeo como um arquivo .roitrack.json.

Leia a seguir

Experimente nos seus próprios vídeos

O teste dura um dia e roda no seu próprio PC; seus vídeos são analisados localmente e nunca são enviados.