0

こんにちは、初期の例で「openCVの学習」という本を読んでいます。問題が発生します。

単一フレームを前後に移動でき、フレーム番号を入力して特定のフレームにジャンプし、TrackbarSlider でフレームをブラウズできる小さなビデオ プレーヤーを作成したいと思います。TrackbarSlider は、現在のフレーム番号も表示する必要があります。

現時点では、TrackbarSlider のみを実装しています。ビデオのフレームをカウントアップしたいのですが、特定の位置でクリックすると、その位置からビデオが再生されます。

残念ながら、これは起こりません。スライダーのどこかをクリックすると、ビデオはフレーム 0 から始まります。スライダーもこの位置にリセットされます。

同様に、スライドが発生した後にフレーム番号が0にリセットされることがコンソールに表示される理由がわかりません。(あるフレームから次のフレームへのスライダー位置の移動により、onTrackbarSlide() へのコールバックが発生することがわかっています)

// Example2-3.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

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

int g_slider_position = 0;
CvCapture* g_capture = NULL;

void onTrackbarSlide(int pos)
{
    cout << "TrackbarSlide occured " << endl;
    cout << "pos: " << pos << endl;
    cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);
    cout << "Framenumber after SetTrackbarPos ";
    cout << cvGetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES) << endl; 

}

int main(int argc, char* argv[])
{

    cout << "TEST" << endl;
    cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE);
    g_capture = cvCreateFileCapture("test.avi");
    //g_capture = cvCreateFileCapture( argv[1]);
    int frames = (int) cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);
    if (frames != 0)
    {
        cvCreateTrackbar( "Position","Example3",&g_slider_position,frames,onTrackbarSlide);
    }
    IplImage* frame;
    while(1)
    {

        frame = cvQueryFrame(g_capture);

        if(!frame) break;
        cvShowImage("Example3",frame);

        char c = cvWaitKey(250);
        if(c==27) break;

        cout << "Framenumber ";
        cout << cvGetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES) << endl; 

        cvSetTrackbarPos("Position", "Example3", cvGetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES));


    }
    cvReleaseCapture(&g_capture);
    cvDestroyWindow("Example3");
    return 0;
}

それは私がコンソールから得たものです: コンソール出力: http://s14.directupload.net/images/120422/9cdu7mhk.png

言及するのを忘れました...次のサイトは興味深いかもしれません:OpenCV - ビデオの再生中にスライダーの位置を更新する

ユジョノありがとう

4

1 に答える 1

0

Der Fehler liegt in der Zeile

cvSetTrackbarPos("Position", "Example3", 
                 cvGetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES));

Sie setzt das Video immer wiederaufdenAnfangzurück。Klammere die Zeile ausunddasVideoläßtsichüberdieTrackBareinwandfreibewegen。

Möchteman、dass derScrollbalkenmitläuft、muss die Nullsetzungabgefangenwerden。zB:

int FramePos = cvGetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES);
if (FramePos!=0) 
  cvSetTrackbarPos("Position", "Example3",FramePos); 

間違いは列にあります

cvSetTrackbarPos("Position", "Example3", 
                 cvGetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES));

このコマンドは、ビデオを最初にリセットします。その行をコメントとしてマークすると、正常に機能します。

トラックバーを実行したい場合は、ゼロ調整をインターセプトできます。例えば:

int FramePos = cvGetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES);
if (FramePos!=0) 
  cvSetTrackbarPos("Position", "Example3",FramePos); 
于 2013-03-03T16:25:43.937 に答える