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 - 在视频播放期间让滑块更新其位置

谢谢你eujono

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 wieder auf den Anfang zurück。Klammere die Zeile aus und das Video läßt sich über die TrackBar einwandfrei bewegen。

Möchte man, dass der Scrollbalken mitläuft, muss die Nullsetzung abgefangen werden。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));

该命令将视频重置为开头。将该行标记为注释,它工作正常。

你想让 Trackbar 运行,调零可以被拦截。例如:

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