2012-04-22 77 views
0

嗨,我正在閱讀一本書「學習openCV」,在我遇到問題的早期示例中。OpenCV TrackbarSlider奇怪的行爲

我想建立一個小視頻播放器,它可以前進和後退一幀,可以通過輸入幀號並通過TrackbarSlider瀏覽幀來跳轉到特定幀。 TrackbarSlider還應該顯示當前的幀號。

目前我只實現了TrackbarSlider。 我希望它能夠計算我的視頻的幀數,如果我在特定位置單擊它,視頻應該從該位置繼續播放。

不幸的是,這並沒有發生。 如果我單擊滑塊中的任何位置,則視頻從第0幀滑塊開始也會重置到此位置。

Aswell我不明白爲什麼控制檯顯示我發生幻燈片發生後幀號重置爲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

回答

0

明鏡Fehler liegt在德賊le

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

這是一個視頻immer wieder auf den Anfangzurück。 Klammere die Zeile aus und das Videoläßtsichüberdie TrackBar einwandfrei bewegen。

Möchteman,dass der Scrollbalkenmitlä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);