Script in Matlab per creare un filmato avi da una sequenza di immagini jpg.
Mi è capitato, di recente, di dover creare un filmato avi a partire da una sequenza di immagini jpg. Non volendo cercare e installare programmini sparsi per la rete, ed avendo a disposizione i computer della Facoltà ove studio, sui quali è installato Matlab, ho provveduto con lo script seguente.
Si tratta di uno script che, oltre a mostrare alcune chiamate strettamente necessarie per creare i filmati, contiene anche delle istruzioni sulla creazione di stringhe, per cui può esservi utile anche in tal senso.
Eccolo: mov = avifile('output.avi'); estensione = 'b.JPG'; for i=0:239 p = double(i); p = int2str(p); nomefile = strcat(p, estensione); immagine = imread(nomefile); f = im2frame(immagine); mov = addframe(mov, f); end; mov = close(mov); Esaminiamolo passo per passo. Con la prima istruzione apriamo uno stream di output, specificando che intendiamo scrivere un file di tipo avi (avifile), cioè un video, da memorizzare con nome 'output.avi'. Il percorso è dato dal nostro workspace. Tale stream verrà "memorizzato" nella variabile "mov".
La seconda istruzione riguarda la "costruzione" del suffisso e dell'estensione per i nomi dei file di input. Nel mio caso, infatti, i nomi dei file di input erano numerati (da 0 a 239) e finivano tutti in "b", con estensione "JPG". Memorizzo quindi una stringa "b.JPG", da utilizzare in seguito.
Il ciclo for, in questo caso, va da 0 a 239 perchè, come ho detto, questo era il mio caso... ovviamente dovrete modificare questa sezione in base alle vostre esigenze (es.: una collezione di nomi di file, o un range numerico differente).
Le prime tre istruzioni contenute nel for non riguardano strettamente la creazione del file avi, ma la definizione del nome del file immagine da aprire e aggiungere al filmato. Con p=double(i) effettuo una promozione esplicita di i a double e memorizzo tale valore in p. Questo casting mi serve per poter utilizzare il metodo int2str, che trasforma l'argomento (un double) in una stringa. Nel mio caso, tale stringa è di nuovo p (matlab mi consente di cambiare il tipo di p a runtime). Ho infatti bisogno di una stringa per poter concatenare l'indice del ciclo, numerico, e l'estensione precedentemente dichiarata. Adesso che ho questi ingredienti, li unisco con strcat(p, estensione), ossia "strings concatenation": concatenazione di stringhe che, come è facilmente intuibile, "attacca in coda" al primo parametro il secondo. Memorizzo il nome del file di input così generato nella variabile "nomefile". A questo punto avviene la lettura del file di input: mediante l'istruzione imread (image read, lettura immagine) carichiamo il file di nome "nomefile" (la stringa costruita un attimo prima) e ne depositiamo il contenuto nella variabile "immagine".
Per creare un filmato, comunque, non possiamo aggiungere direttamente le immagini così come sono. I filmati sono costituiti da FRAMES. Durante la riproduzione del filmato, viene mostrato un certo numero di frames al secondo (di default, 15), quindi occhio a quanti ne inserite (a volte potrebbero essere necessarie delle ripetizioni). Il numero di frames al secondo (fps) e altri parametri (come la compressione o la qualità) possono essere impostati esplicitamente durante la creazione del nostro avifile (prima istruzione, in questo script) o anche successivamente; per maggiori dettagli, vedere la pagina riguardante la funzione avifile su MathWorks (cliccare qui). Con im2frame, quindi, effettuiamo una conversione da immagine a frame, come suggerisce il nome della funzione, a partire dall'immagine "immagine", depositando il risultato nella variabile f. A questo punto abbiamo il nostro frame, che aggiungiamo in coda al filmato con mov = addframe(mov, f). Il ciclo for viene ripetuto per inserire tutti i file immagine in coda al frame. Come ultima istruzione abbiamo close(mov), per chiudere lo stream di scrittura sul file di output.
Con questo è tutto su questo argomento... buon lavoro ! ;-)
|