0

ファイルからビデオを表示し、キーを押したときにフレームを個々の画像として保存する小さなプログラムを作成しようとしています。

フレームの保存中にビデオがフリーズすることを除けば、問題なく動作しているように見えます。これにより、フレームの保存をいつ停止するかを判断するのが非常に困難になります。誰かがこの問題を回避する方法を知っているかどうか疑問に思っています。

これはそのままのプログラムです:

#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
#include <iostream>

int main( int argc, char** argv[] ) {
    int cnt = 1;
    char c;

    cvNamedWindow( "Video", CV_WINDOW_AUTOSIZE );
    CvCapture* capture = cvCreateFileCapture( "D:\\AVI Video\\SGVideo.mp4" );
    IplImage* frame;

    while(1) {
        char num[40]="D:\\Bilder\\SGVSamples\\";
        char str[10];
        char pmp[10]=".jpg";
        _itoa(cnt, str, 10);
        strcat(num,str);
        strcat(num,pmp);

        frame = cvQueryFrame( capture );
        if( !frame ) {
            cout << "End of video!\n"; 
            break;
        }
        cvShowImage( "Video", frame );
        c = cvWaitKey(34);

        // 'Space' -> Save frame :: 'Esc' -> Exit
        if( c == 32 ) {
            try {
                cvSaveImage( num, frame );
                cout << "Saved image: " << num <<" - Frame count: " << cnt << "\n";
            } catch(...) {
                cout << "Failed to save image!\n";
            }
        } else if( c == 27 ) {
            cout << "Shutting down...";
            break;
        }
        cnt = cnt+1;
    }

    cvReleaseCapture( &capture );
    cvDestroyWindow( "Video" );
}

私は一般的にOpenCVとcppにかなり慣れていないので、どんなヒントでも大歓迎です!

4

1 に答える 1

0

画像を保存するには、別のスレッドを実行する必要があります。

        try {
                cvSaveImage( num, frame );
                cout << "Saved image: " << num <<" - Frame count: " << cnt << "\n";
            } catch(...) {
                cout << "Failed to save image!\n";
            }

そのブロックがフリーズしています。このブロックのみを処理する別のスレッドがあれば (必要な場合)、ビデオがフリーズすることはありませんでした。

于 2012-05-20T18:25:08.490 に答える