risposta

16

È possibile utilizzare la classe VideoWriter, ma è necessario utilizzare lo the correct FourCC code che rappresenta lo standard H264. FourCC sta per Four Character Code, che è un identificatore per un codec video, un formato di compressione, un colore o un pixel utilizzato nei file multimediali.

In particolare, quando si crea un oggetto VideoWriter, si specifica il codice FourCC durante la costruzione. Consultare la documentazione OpenCV per maggiori dettagli: http://docs.opencv.org/trunk/modules/highgui/doc/reading_and_writing_images_and_video.html#videowriter-videowriter

sto supponendo che si sta utilizzando C++, e quindi la definizione del costruttore VideoWriter è:

VideoWriter::VideoWriter(const String& filename, int fourcc, 
         double fps, Size frameSize, bool isColor=true) 

filename è l'uscita del file video, fourcc è il codice FourCC per il codice che si desidera utilizzare, fps è la frequenza fotogrammi desiderata, frameSize corrisponde alle dimensioni desiderate del video e isColor specifica se si desidera che il video sia a colori. Anche se FourCC utilizza quattro caratteri, OpenCV ha un'utilità che analizza FourCC e genera un singolo ID intero che viene utilizzato come ricerca per poter scrivere il formato video corretto sul file. Si utilizza la funzione CV_FOURCC e si specificano quattro singoli caratteri, ognuno corrispondente a un singolo carattere nel codice FourCC del codec desiderato.

In particolare, si dovrebbe chiamare in questo modo:

int fourcc = CV_FOURCC('X', 'X', 'X', 'X'); 

Sostituire X con ogni personaggio che appartiene alla FourCC (in ordine). Poiché si desidera lo standard H264, si potrebbe creare un oggetto VideoWriter in questo modo:

#include <iostream> // for standard I/O 
#include <string> // for strings 

#include <opencv2/core/core.hpp>  // Basic OpenCV structures (cv::Mat) 
#include <opencv2/highgui/highgui.hpp> // Video write 

using namespace std; 
using namespace cv; 

int main() 
{ 
    VideoWriter outputVideo; // For writing the video 

    int width = ...; // Declare width here 
    int height = ...; // Declare height here 
    Size S = Size(width, height); // Declare Size structure 

    // Open up the video for writing 
    const string filename = ...; // Declare name of file here 

    // Declare FourCC code 
    int fourcc = CV_FOURCC('H','2','6','4'); 

    // Declare FPS here 
    int fps = ...; 
    outputVideo.open(filename, fourcc, fps, S); 

    // Put your processing code here 
    // ... 

    // Logic to write frames here... see below for more details 
    // ... 

    return 0; 
} 

In alternativa, si può semplicemente fare questo quando si dichiara il vostro VideoWriter oggetto:

VideoWriter outputVideo(filename, fourcc, fps, S); 

Se si utilizza quanto sopra, si è non è necessario chiamare il numero open poiché questo aprirà automaticamente il writer per scrivere i frame su file.


Se non siete sicuri se H.264 è supportato sul computer, specificare -1 come il codice FourCC, e una finestra dovrebbe pop-up quando si esegue il codice che visualizza tutti i codec video disponibili che sono sul tuo computer. Mi piacerebbe ricordare che questo funziona solo per Windows. Linux o Mac OS non ha questa finestra spuntata quando si specifica -1. In altre parole:

VideoWriter outputVideo(filename, -1, fps, S); 

È possibile scegliere quale è più adatto se H.264 non esiste sul computer. Una volta fatto, OpenCV creerà il codice FourCC giusto da inserire nel costruttore VideoWriter in modo da ottenere un'istanza VideoWriter che rappresenta un VideoWriter che scriverà quel tipo di video su file.

Una volta che avete una cornice pronta, memorizzato in frm per la scrittura al file, è possibile effettuare una:

O

outputVideo.write(frm); 

Come bonus, ecco un tutorial su come leggere/scrivere video in OpenCV: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html - Tuttavia, è scritto per Python, ma ciò che è bene sapere è vicino alla parte inferiore del link, c'è una lista di codici FourCC che sono noti per k per ciascun sistema operativo. BTW, il codice FourCC specificato per lo standard H264 è in realtà 'X','2','6','4', quindi se 'H','2','6','4' non funziona, sostituire H con X.

Un'altra piccola nota. Se si utilizza Mac OS, quindi è necessario utilizzare 'A','V','C','1' o 'M','P','4','V'. Dall'esperienza, 'H','2','6','4' o 'X','2','6','4' quando si tenta di specificare il codice FourCC non sembra funzionare.

+0

Ho provato il programma. Per prima cosa quando ho provato ad usare il parametro Fourcc come -1 nessuna finestra è spuntata. Quando ho provato ad usare x264 come hai accennato, ho avuto l'errore "impossibile aprire codec: libx264" e altri errori come "impostazioni ffmpeg errate rilevate" .. cosa dovrei fare BTW io uso ubuntu 14.04 –

+1

Ciò significa che non hai le librerie H264 .... Questo è un altro post tutto insieme. Quando sarò al lavoro, ti darò un link. Btw the -1 funziona solo su Windows. Ho dimenticato di menzionarlo anche Oops! – rayryeng

+0

Grazie ... fammi sapere quando lavori sull'installazione di h264 lib. . Devo sapere con impazienza –