2013-12-17 2 views
5

Ho un video lungo 30 minuti (codificato mp4: h264) e ho bisogno di contare i numeri di tagli nel film. Dovrebbe includere tagli e dissolvenze incrociate.Numero di tagli in un file video 30min

Quindi qualcosa di molto simile al rilevamento I-Frame ....

che ho a disposizione Linux con ffmpeg/libav così come un Windows con Adobe Premiere.

Eventuali indizi? O altro software?

+0

Sarebbe una buona idea chiedere su [Doom9] (http://forum.doom9.org/) –

+3

Questo suona come il tipo di cosa che dovresti fare con un clicker (premi un pulsante ogni volta che un evento di interesse appare) manualmente, come se tu avessi solo 1 video e hai solo bisogno di farlo una volta che una soluzione programmatica potrebbe essere eccessiva. –

+0

Le dissolvenze incrociate non saranno facili da ottenere con qualsiasi programma. – claj

risposta

4

Come altre risposte hanno sottolineato, ottenere una buona precisione con una soluzione automatica è difficile. Dissolvenze incrociate, zoom, panoramiche, ecc. Rendono difficile per uno strumento automatico concludere se i fotogrammi consecutivi appartengono o meno alla stessa scena.

Detto questo, vorrei provare a utilizzare la libreria OpenCV per analizzare le differenze tra fotogrammi consecutivi e provare a determinare, utilizzando una soglia empirica, se sono abbastanza simili da essere considerati dalla stessa scena (scegliere l'intervallo di fotogrammi , non necessariamente ogni fotogramma).

È facile estrarre i fotogrammi da un video utilizzando la classe VideoCapture.

Una volta estratti i frame, è possibile utilizzare vari metodi per provare a stabilire se due frame sono correlati.

alcune idee:

  1. Utilizzare il metodo Lucas-Kanade a find the optical flow tra fotogrammi e concludere se la differenza in effetti il ​​risultato di movimento degli oggetti nei frame, o se si tratta di scene completamente diversi.
  2. Utilizzare un algoritmo features detection (SIFT, SURF, ecc.) Per caratterizzare il frame e compare it in altri frame. Vedi anche la discussione here.

Buona fortuna!

2

Per farlo a livello di codice, vorrei semplicemente calcolare la somma delle differenze assolute per l'intero fotogramma. Questo potrebbe, tuttavia, traboccare abbastanza facilmente, quindi forse qualcosa come la somma media delle differenze assolute per due fotogrammi. È quindi possibile utilizzare un valore di soglia per determinare se si tratta di un fotogramma chiave.

Utilizzando librerie come ffmpeg, dovresti riuscire a trovare la somma delle differenze assolute per i macro-blocchi come parte dei suoi algoritmi di stima del movimento. Dato che non ho familiarità con la libreria (ho usato solo lo strumento da riga di comando), non posso dire se sia possibile trovare le somme senza generare il vettore di movimento, o se le somme saranno disponibili dopo. Se genera i vettori di movimento, potrebbe segnalare i macro-blocchi che non hanno blocchi simili vicini.

Si noti che pentole, dolly o zoom veloci possono essere facilmente rilevati come tagli in questo modo.

Le dissolvenze incrociate non vengono rilevate a meno che non siano sufficientemente veloci.

Se maggiore precisione è importante, il suggerimento di Paul di utilizzare un clicker semplice è un'opzione decente.

È possibile scrivere un programma che tagga tutti i tagli rilevati e consente il controllo umano con semplici clic del tasto (potrebbe mostrare i due fotogrammi coinvolti e l'utente può fare clic su yo n per taggarlo come rilevato correttamente o non correttamente) . Se ci sono molti tagli, il controllo può richiedere molto tempo, ma se i tagli sono molto veloci, potrebbe essere difficile per gli umani rilevare o contare correttamente usando comunque un clicker.

3

Questo è un classico problema di visione da computer. Il termine di ricerca è "segmentazione di scene video", "estrazione di scene video", "segmentazione automatica di scene video" o "rilevamento di confini di riprese". Dovresti controllare la letteratura su questo perché non esiste una soluzione per proiettili d'argento. Come molte tecniche applicate alla visione artificiale, la segmentazione dipende molto dal contenuto dell'immagine/video e dalle caratteristiche che possono essere estratte da esso.

Dette caratteristiche espressive (ad esempio estremi cambiamenti di tonalità o luminosità) possono essere rilevate più facilmente rispetto alle caratteristiche non espressive (partita di calcio con un leggero cambiamento). Probabilmente troverai qualche semplice codice MATLAB che può essere convertito in codice OpenCV.

Ci sono serie di dati annotati per testare gli algoritmi di yout.

Anche dare un'occhiata a: What is the best way to divide a video into scenes (segments)