OpenCV TrackbarSlider奇怪的行为

时间:2012-04-22 17:52:37

标签: c++ opencv slider trackbar

您好我正在阅读“学习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 - getting the slider to update its position during video playback

谢谢 eujono

1 个答案:

答案 0 :(得分: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 denAnfangzurück。 Klammere die Zeile aus und dasVideoläßtsichüberdieTrackBar einwandfrei bewegen。

Möchteman,dass derScrollbalkenmitläuft,muss die Nullsetzung abgefangen werden。 z.B:

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运行,可以拦截归零。 e.g:

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