2014-06-13 25 views
9

Sto provando a creare un video avi dall'uscita della mia webcam usando opencv. Non vengono generate eccezioni, tuttavia il file avi che crea ha una dimensione di 414 byte e non cresce.opencv scrive l'uscita della webcam nel file avi

Inoltre, non funzionerà con nessun lettore multimediale. Sospetto che ci sia qualcosa di sbagliato nella scrittura del file.

Ecco il codice:

CvCapture *capture = cvCaptureFromCAM(0); 

    int width = (int)cvGetCaptureProperty(capture, 
    CV_CAP_PROP_FRAME_WIDTH); 

    int height = (int)cvGetCaptureProperty(capture, 
    CV_CAP_PROP_FRAME_HEIGHT); 
    CvVideoWriter *writer = cvCreateVideoWriter("CamCapture.avi",              
    -1,30, cvSize( width, height)); 

    cvNamedWindow("capWindow", CV_WINDOW_AUTOSIZE); 
    IplImage *frame = 0; 

    // this returns 0 not sure why ?? 
    //double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 
    double fps = 30; 

    while(1) 
    { 
     frame = cvQueryFrame(capture); 
     cvShowImage("capWindow",frame); 
     cvWriteFrame(writer, frame); 
     char c = cvWaitKey(1000/fps); 

     if(c == 27) break; 
    } 

    cvReleaseCapture(&capture); 
    cvReleaseVideoWriter(&writer); 
    cvDestroyWindow("capWindow"); 

ho fatto riferimento e ha cercato i seguenti campioni senza fortuna:

risposta

31

Non usare c obsoleto, uso C++ api, è facile da usare e semplice, per esempio, il codice di cui sopra può essere riscrivere in C++ come,

#include "opencv2/opencv.hpp" 
#include <iostream> 

using namespace std; 
using namespace cv; 

int main(){ 

    VideoCapture vcap(0); 
     if(!vcap.isOpened()){ 
      cout << "Error opening video stream or file" << endl; 
      return -1; 
     } 

    int frame_width= vcap.get(CV_CAP_PROP_FRAME_WIDTH); 
    int frame_height= vcap.get(CV_CAP_PROP_FRAME_HEIGHT); 
    VideoWriter video("out.avi",CV_FOURCC('M','J','P','G'),10, Size(frame_width,frame_height),true); 

    for(;;){ 

     Mat frame; 
     vcap >> frame; 
     video.write(frame); 
     imshow("Frame", frame); 
     char c = (char)waitKey(33); 
     if(c == 27) break; 
    } 
    return 0; 
} 
+1

Il codice sopra riportato produce un video riprodotto in tempo reale? Vedo che hai fissato il video a 10 FPS, mentre molte webcam consentono 30 FPS per la registrazione? –

+1

Puoi cambiarlo in 25 o 30 ... – Haris

+0

Lo sto testando ora e, dato che la mia fotocamera è economica, non offre una frequenza fotogrammi costante in diverse impostazioni di illuminazione. Per esempio. gli ambienti luminosi danno fps trip come quelli più scuri. E così il video verrà riprodotto più velocemente o più lentamente del previsto se la scena sta cambiando. Grazie per la risposta veloce comunque :) –

5

utilizzare sotto codice per scrivere formato AVI da catturare ingresso telecamera.

#include "opencv2/highgui/highgui.hpp" 
#include <iostream> 

using namespace cv; 
using namespace std; 

int main(int argc, char* argv[]) 
{ 
    VideoCapture cap(0); // open the video camera no. 0 

    if (!cap.isOpened()) // if not success, exit program 
    { 
     cout << "ERROR: Cannot open the video file" << endl; 
     return -1; 
    } 

namedWindow("MyVideo",CV_WINDOW_AUTOSIZE); //create a window called "MyVideo" 

    double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); //get the width of frames of the video 
    double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //get the height of frames of the video 

    cout << "Frame Size = " << dWidth << "x" << dHeight << endl; 

    Size frameSize(static_cast<int>(dWidth), static_cast<int>(dHeight)); 

VideoWriter oVideoWriter ("D:/MyVideo.avi", CV_FOURCC('P','I','M','1'), 20, frameSize, true); //initialize the VideoWriter object 

    if (!oVideoWriter.isOpened()) //if not initialize the VideoWriter successfully, exit the program 
    { 
     cout << "ERROR: Failed to write the video" << endl; 
     return -1; 
    } 

    while (1) 
    { 

     Mat frame; 

     bool bSuccess = cap.read(frame); // read a new frame from video 

     if (!bSuccess) //if not success, break loop 
     { 
      cout << "ERROR: Cannot read a frame from video file" << endl; 
      break; 
     } 

     oVideoWriter.write(frame); //writer the frame into the file 

     imshow("MyVideo", frame); //show the frame in "MyVideo" window 

     if (waitKey(10) == 27) //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop 
     { 
      cout << "esc key is pressed by user" << endl; 
      break; 
     } 
    } 

    return 0; 

}