OpenCV TrackbarSlider 奇怪的行为

OpenCV TrackbarSlider strange behaviour

本文关键字:TrackbarSlider OpenCV      更新时间:2023-10-16
嗨,我

正在阅读"学习openCV"一书,在一个早期的例子中,我遇到了问题。

我想构建一个小的视频播放器,它可以向前和向后移动单个帧,可以通过输入帧号跳转到特定帧,并通过 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 - 让滑块在视频播放期间更新其位置

谢谢尤乔诺

Der Fehler liegt in 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 TrackBarEinwandfrei 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);