2014-06-13 59 views
9

我想從我的網絡攝像頭輸出使用opencv創建一個AVI視頻。不會拋出任何異常,但是它創建的avi文件大小爲414字節,不會增長。opencv寫網絡攝像頭輸出到AVI文件

此外,它不會與任何媒體播放器一起玩。我懷疑寫入文件部分有問題。

下面是代碼:

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"); 

我已經沒有運氣參考,並嘗試了以下樣品:

回答

31

不使用過時的C,使用C++ API,它很容易使用和簡單的,例如上面的代碼可以在C重寫++等,下面的代碼

#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

上面的代碼是否會生成播放實時視頻?我看到你將視頻固定爲10 FPS,而許多攝像頭允許錄製30 FPS? –

+1

您可以將其更改爲25或30 ... – Haris

+0

現在正在進行測試,並且由於我的相機價格便宜,因此在不同的光線設置下它不會提供穩定的幀頻。例如。光環境使得三分之一fps與較暗的環境一樣。因此,如果場景正在改變,則視頻將比預期更快或更慢地播放。無論如何,感謝您的快速回復:) –

5

使用從捕獲相機輸入寫AVI格式。

#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; 

}