2013-01-04 51 views
3

我使用opencv直接從網絡攝像頭捕捉視頻並將其保存到avi文件。我已經使用了以下代碼:視頻沒有寫入文件

#include "StdAfx.h" 


using namespace std; 
using namespace cv; 


int _tmain() 
{ 
    VideoCapture src; 
    src.open(1); 
    if(!src.isOpened()) 
    { 
     cout<<"could not open camera\n"; 
     return -1; 
    } 
    else 
    { 
     cout<<"camera opened\n"; 
    } 

    int ex=static_cast<int>(src.get(CV_CAP_PROP_FOURCC)); 
    Size s(Size((int)src.get(CV_CAP_PROP_FRAME_WIDTH),(int)src.get((CV_CAP_PROP_FRAME_HEIGHT)))); 
    VideoWriter out; 
    out.open("out.avi",ex,20,s); 
    while(1) 
    { 
     Mat im; 
     src>>im; 
     imshow("vid",im); 
     out<<im; 
     char c; 
     c=cvWaitKey(50); 
     if(c==27) 
      break; 
    } 

    system("pause"); 
} 

所有標題都包含在stdafx.h中。 但實際上我得到一個大小爲0bite的avi文件。如何解決這個問題?我需要記錄攝像頭視頻而不顯示。


注:我在OpenCV中新,我使用Visual Studio 2010

+0

喜,一看便知here..http://stackoverflow.com/questions/12054907/opencv-videowriter-wont-write-anything-although- cvwritetoavi-does/12059944#12059944 ..它可能會幫助你。 – G453

回答

1

其實在你的程序中沒有邏輯錯誤。唯一的問題是您用來編寫視頻的編碼解碼器FOUR_CC

當我運行你的代碼時,我遇到了與你一樣的確切問題。當我將錯誤檢查添加到out.open()函數時,我發現了這個問題。

很可能,相機的FOUR_CC編解碼器不受avi容器支持。

當您使用Windows時,一個不錯的選擇是在out.open的第二個參數中使用CV_FOURCC_PROMPT

這將打開包含不同FOUR_CC編解碼器的彈出列表框。如果您不知道選擇哪一個,請選擇Full Frames (Uncompressed)。這是最兼容的選項,但會增加輸出視頻文件的大小。

最後的代碼應該是這樣的:

if(!out.open("out.avi",CV_FOURCC_PROMPT,20,s)) 
{ 
    cout<<"Writer Not Opened"<<endl; 
    return -1; 
} 
+0

我有同樣的問題,'CV_FOURCC_PROMPT'做了這項工作。謝謝 – powder

2

運行不顯示應用程序的網絡攝像頭只是刪除

imshow("vid",im); 

out.avi大小是0,因爲您在應用程序運行時(打開視頻流並在其上寫入時)打開它,打開您錄製的視頻,只需關閉應用程序即可在視頻上結束寫入,然後將其打開。

+0

我知道我不應該寫imshow()。但即使正常關閉文件大小爲0kbit – deeiip