2012-04-19 3 views
2

У меня есть проблема с открытием многих видеофайлов (например, 200) в цикле с использованием класса VideoCapture OpenCV. Ниже вы можете найти мой код.OpenCV VideoCapture не может открыть много видеофайлов

В частности, моей программе удается открыть определенное количество видео (обычно 171-173), но потом не удается открыть другие. Я даже пытался открыть всегда тот же файл (как в примере ниже), но поведение такое же.

По-моему, это не проблема с утечкой памяти (на самом деле происходит утечка памяти, но она потребляет всего около 50 МБ). Я думаю, что это связано с тем, что, когда каждое видео открыто, несколько потоков также открыты и никогда не закрываются, поэтому они накапливаются. Но я не знаю, является ли это реальной причиной или, если это так, как ее решить.

Я использую 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

+0

Довольно маленький, между 1 и 20 МБ – user1343279

+0

Я предполагаю, что у вас потенциально заканчивается память. Ваши запущенные 32-битные или 64-битные окна? и сколько у вас RAM? Худший сценарий, 200 x 20mb видео = 4GB – TomP89

ответ

1

Я использовал OpenCV 2.3.0 на Mac OS X и не имел проблем с запуском вашего кода.

Возможно, вам понадобится upgrade your version to 2.3.1 и повторите попытку. Если проблема не устранена, это может быть проблемой для реализации Windows или даже, возможно, просто специфичной для Windows 7.

Еще одна дикая догадка заключается в том, чтобы реализовать программу выше, используя интерфейс C OpenCV вместо используемого интерфейса C++ прямо сейчас. У меня были проблемы в прошлом (не связанные с видео), которые были исправлены с использованием этого трюка. Я не рекомендуется смешивать интерфейсы, так что если вы собираетесь сделать что-то с интерфейсом C, не использовать C++ интерфейс из OpenCV в программе:

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. Я попробую то, что вы сказали. До сих пор я использовал предварительно скомпилированную библиотеку OpenCV 2.3 для MS Visual Studio. Я также попробую использовать тот же код в Linux и опубликую, что произойдет. – user1343279

Смежные вопросы