2

OpenCVクラスVideoCaptureを使用して、ループで多くのビデオファイル(たとえば、200)を開くのに問題があります。以下に私のコードがあります。

具体的には、私のプログラムは特定の数のビデオ(通常は171-173)を開くことに成功しましたが、他のビデオを開くことができませんでした。(以下の例のように)常に同じファイルを開こうとしましたが、動作は同じです。

私の意見では、これはメモリリークの問題ではないはずです(実際にはメモリリークがありますが、合計で約50MBしか消費しません)。それぞれの動画を開くと、いくつかのスレッドも開かれ、決して閉じられないので、それらが蓄積するという事実に関連していると思います。しかし、これが本当の理由なのか、もしそうなら、それをどのように解決するのかはわかりません。

Visual Studioを使用してコンパイルし、Windows7OSを使用しています。

手がかりや解決策があれば教えてください。

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
}

コードが非常に単純なので、この問題を簡単に再現できると思います。

4

1 に答える 1

1

Mac OS X で OpenCV 2.3.0 を使用しましたが、コードの実行に問題はありませんでした。

バージョンを 2.3.1にアップグレードして、もう一度やり直してください。問題が解決しない場合は、Windows の実装に固有の問題であるか、Windows 7 に固有の問題である可能性があります。

また、現在使用している C++ インターフェースの代わりに、OpenCV の 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()。確認してください!

于 2012-04-21T14:56:37.983 に答える