Странное поведение OpenCV TrackbarSlider

Привет, я просматриваю книгу «Изучение 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 - заставить ползунок обновлять свое положение во время воспроизведения видео

Спасибо, эуджоно.


person user1349802    schedule 22.04.2012    source источник


Ответы (1)


Der Fehler лейтенант в 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. я.Б.:

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); 
person Chaled    schedule 03.03.2013