0

openCVでビデオフレームのフレーム比較をしたい。ビデオファイルのフレーム#10とフレーム#100を考えてみましょう。メインのビデオキャプチャループで実行すると機能します。しかし今、私はそれを専用のメソッド(IplImagesを入力として受け取る)に移動したいと思います。

 // MAIN CAPTURE LOOP
 while(1) {

        cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, 10);
        frame = cvQueryFrame(capture);
        if (!frame) break;
        cvShowImage("Window_1", frame);

        cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, 100);
        nextFrame = cvQueryFrame(capture);
        if (!nextFrame) break;

        cvShowImage("Window_2", nextFrame);  // THIS SHOWS ME TWO DIFFERENT FRAMES

        // PASS THE IMAGES TO THE NEW METHOD

        [self compareFrame: frame withFrame: nextFrame]);                       

        char c = cvWaitKey(5);  
        if(c==27) {
            NSLog(@"ESC pressed!");
            break;
        }

これは私の方法です(簡略化)

- (int) compareFrame: (IplImage*) firstFrame withFrame: (IplImage*) secondFrame
{

// THIS SHOWS ME ONLY THE firstFrame IN BOTH      
// WINDOWS?

cvShowImage("Window_1", firstFrame);
cvShowImage("Window_2", secondFrame); 

return 1;

}

なぜこれが起こるのですか?

4

1 に答える 1

3

の結果を所有していないためcvQueryFramecvCapture構造は所有しています。結果を使って何かをしたい場合は、最初にコピーを作成する必要があります。2つの異なるフレームが表示される理由cvShowImageは、表示する前に独自のコピーを作成するためです。呼び出す場所に到達すると[self compareFrame]、frameとnextFrameは同じデータを指します。

代わりにこれを試してください:

while (1) {
    cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, 10);
    frame =cvQueryFrame(capture);
    if (!frame) {
        NSLog(@"Couldn't read frame 10");
        break;
    };

    frame = cvCloneImage(frame); //Make a copy of the frame     

    cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, 100);
    nextFrame = cvQueryFrame(capture);
    if (!nextFrame) {
        NSLog(@"Couldn't read frame 100");
        break;
    };

    nextFrame = cvCloneImage(nextFrame); //Make a copy of the frame

    // PASS THE IMAGES TO THE NEW METHOD
    [self compareFrame: frame withFrame: nextFrame];
    char c = cvWaitKey();

    cvReleaseImage(&frame);
    cvReleaseImage(&nextFrame);
    if(c==27) {
        NSLog(@"ESC pressed!");
        break;
    }
}
于 2012-12-29T00:56:16.707 に答える