Привет, я просматриваю книгу «Изучение 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 - заставить ползунок обновлять свое положение во время воспроизведения видео
Спасибо, эуджоно.