2012-04-22 2 views
0

Привет, я прохожу через книгу «Изучение openCV» на раннем примере, я получаю проблемы.OpenCV TrackbarSlider странное поведение

Я хотел бы создать небольшой видеопроигрыватель, который может идти одним кадром вперед и назад, может перейти к определенному кадру, введя номер кадра и просматривая кадры с помощью 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

Thank You eujono

ответ

0

Der Fehler liegt в дер Зеи le

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. 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)); 

Команда сбрасывает видео в начале. Отметьте эту строку как комментарий, и она отлично работает.

Вы хотите, чтобы трекбар работал, обнуление можно перехватить. например .:

int FramePos = cvGetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES); 
if (FramePos!=0) 
    cvSetTrackbarPos("Position", "Example3",FramePos); 
Смежные вопросы