2012-04-19 109 views
2

我有一個問題,通過使用OpenCV類VideoCapture在循環中打開許多視頻文件(例如200)。下面你可以找到我的代碼。OpenCV VideoCapture無法打開許多視頻文件

更具體地說,我的程序成功地打開了一定數量的視頻(通常是171-173),但是無法打開其他視頻。我甚至試圖打開總是相同的文件(如下面的例子),但行爲是相同的。

在我看來,它不應該是一個內存泄漏問題(實際上有內存泄漏,但總共只消耗約50MB)。我認爲這與以下事實有關:當每個視頻被打開時,多個線程也被打開並且從不關閉,因此它們累積。但我不知道這是否是真正的原因,或者如果是,如何解決。

我使用Visual Studio編譯和Windows 7操作系統。

如果您有任何線索和/或解決方案,請讓我知道。

string video_filename = "MyVideo.mp4"; 
for(int j=0; j<200; j++) 
{ 
    VideoCapture video(video_filename); 
    if(!video.isOpened()) 
    { 
     cout << "Video #" << j << " could not be opened" << endl; 
    } 

    video.release(); // I've tried also to comment this out 
} 

我覺得你可以很容易地試着重現這個問題,因爲代碼很簡單。

+0

第一個問題...視頻文件有多大? – TomP89 2012-04-19 08:02:36

+0

相當小,介於1和20 MB之間 – user1343279 2012-04-19 08:15:21

+0

我想你可能會耗盡內存。你正在運行32位或64位的Windows?你有多少內存?最糟糕的情況下,200 x 20mb視頻= 4GB – TomP89 2012-04-19 08:42:46

回答

1

我在Mac OS X上使用了OpenCV 2.3.0,並且在運行代碼時沒有任何問題。

您可能想要upgrade your version to 2.3.1,然後重試。如果問題仍然存在,則可能是Windows實施特有的問題,甚至可能只是針對Windows 7。

另一個瘋狂的猜測是使用OpenCV的C接口而不是您正在使用的C++接口來實現上述程序馬上。我過去遇到過問題(與視頻無關),這些問題已經解決。我不建議混合接口,所以如果你打算做什麼用的C接口,不要在程序中使用的OpenCV的C++接口

for (int j=0; j<200; j++) 
{ 
    CvCapture* capture = cvCaptureFromAVI("MyVideo.mp4"); 
    if (!capture) 
    { 
     cout << "Video #" << j << " could not be opened" << endl; 

     // Prevent calling cvReleaseCapture() on a capture that didn't succeeded 
     continue; 
    } 

    cvReleaseCapture(&capture); 
} 

我不記得是否它是cvCaptureFromAVI()cvCreateFileCapture()。請確認!

+0

謝謝@karlphillip。我會嘗試你所說的 - 到目前爲止,我一直在爲MS Visual Studio使用預編譯的OpenCV 2.3庫。我也將在Linux上嘗試相同的代碼,並將發佈將會發生的事情。 – user1343279 2012-04-22 10:07:44

相關問題