嗨,我正在阅读早期示例中的“学习 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 - 在视频播放期间让滑块更新其位置
谢谢你eujono