

OpenCV初心者です。  
トラックバーの位置に応じて動画をジャンプする機能を付けたいのですが、cvSetTrackbarPosで動画再生中にトラックバーが移動できるようにすると１フレーム表示されてすぐに終了してしまいます。  
<http://opencv.jp/opencv-2svn/cpp/reading_and_writing_images_and_video.html>  
のパラメタを見ながら色々設定を変えたのですがどうしても１フレーム表示されてすぐに終了してしまいます。  
なぜ、１フレーム表示されてすぐに終了してしまうのかわかりません。どのようにしたら動画を最後まで再生さることができるようになりますか

[code]

    #include<opencv/highgui.h>
    #include<opencv/cv.h>
    #include<iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int g_slider_position=0;
    int g_point=0;
    
    CvCapture* g_capture=NULL;
    
    //トラックバー移動時のコールバック
    void onTrackbarSlide(int pos){
        cvSetCaptureProperty(g_capture,
            CV_CAP_PROP_POS_AVI_RATIO,
            pos
        );
        cvSetTrackbarPos("Position","Example3",pos);
    
    }
    int main(int argc, char** argv)
    {
        const char Wname[]="Example3";
        cvNamedWindow(Wname,CV_WINDOW_AUTOSIZE);
        g_capture=cvCreateFileCapture(argv[1]);
        //現在の位置を100分率で表すため
        int frames =100;
        //トラックバーをフレーム数に応じて利用していたため
        (int) cvGetCaptureProperty(
            g_capture,
            CV_CAP_PROP_FRAME_COUNT
        );
        IplImage* frame;
    
        if(frames!=0){
            //トラックバーの作成
            cvCreateTrackbar(
                "Position",
                Wname,
                &g_slider_position,
                frames,
                onTrackbarSlide
            );
        }
        while(1){
            frame =cvQueryFrame(g_capture);
            if(!frame)break;
            cvShowImage(Wname,frame);
            char c=cvWaitKey(1000);
            if(c==27)break;
            //コメントを外すと正しく動かない
    //      cvSetTrackbarPos("Position",Wname,(int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT)*100);
        }
        return 0;
    }
    
[/code]


CC BY-SA 3.0
2015-08-03T04:04:55.377
12969
2016-10-02T04:31:54.777
10770
question
opencv
cvSetTrackbarPosでトラックバーを移動させるとすぐに終了してしまう


リンク先のサンプルプログラムの cvCreateTrackbar の使い方が間違っています。

// (2)ウィンドウ，およびトラックバーを作成する  
cvNamedWindow ("Image", CV_WINDOW_AUTOSIZE);  
cvCreateTrackbar ("Trackbar1", "Image", 0, 100, on_trackbar1);  
cvCreateTrackbar ("Trackbar2", "Image", 0, 100, on_trackbar2);  
cvShowImage ("Image", img);  
cvWaitKey (0);

このあたりのを以下のように変更してください

// (2)ウィンドウ，およびトラックバーを作成する  
cvNamedWindow ("Image", CV_WINDOW_AUTOSIZE);  
int a=0,b=50;//追加  
cvCreateTrackbar ("Trackbar1", "Image", &a, 100, on_trackbar1);//変更  
cvCreateTrackbar ("Trackbar2", "Image", &a, 100, on_trackbar2);//変更  
cvShowImage ("Image", img);  
cvWaitKey (0);

bについては使ったらどうなるか宿題です。


CC BY-SA 3.0
2015-08-04T09:16:09.193
13024
2015-08-04T09:16:09.193
10794
12969
answer