#include "stdafx.h"
#include "highgui.h"
#include <cv.h>
#include <cxcore.h>
#include "iostream"
using namespace std;
using namespace cv;
int g_slider_position = 0;
CvCapture* g_capture = NULL;
const char* window_name = "The Tom 'n Jerry Show";
const char* trackbar_name = "Position";
void onTrackbarSlide( int pos )
{
cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);
g_slider_position = pos;
}
int main(int argc, char** argv)
{
cvNamedWindow(window_name, CV_WINDOW_AUTOSIZE);
g_capture = cvCreateFileCapture("D:\\C++ Projects\\OpenCV_project\\test_video\\gate_11ms_00-30s.avi");
int frames = (int) cvGetCaptureProperty(
g_capture,
CV_CAP_PROP_FRAME_COUNT
);
if (frames != 0)
{
cvCreateTrackbar(
trackbar_name,
window_name,
&g_slider_position,
frames,
onTrackbarSlide
);
}
IplImage* frame;
while (1)
{
frame = cvQueryFrame(g_capture);
if (!frame)
break;
/* 此函數會讓視頻畫面出現長時間靜止不動. 去掉之後trackbar能實現拖動播放的功能.
如果回調函數onTrackbarSlide 不設置capture的當前幀數,set函數能正常工作.
跟蹤內存發現 加上settrackbar函數後,capture的幀數會靜止到一個固定值.不知道是不是溢出造成的.如果是,那麼可能是cvSetTrackbarPos 和 onTrackbarSlide 相互調用造 成的. 但是onTrackbarSlide函數無法跟蹤,因爲在斷點模式下只能到達一次.
待解決*******
cvSetTrackbarPos(trackbar_name,
window_name,
g_slider_position+1
);
*/
cvShowImage(window_name, frame);
char c = cvWaitKey(33);
if (c == 27)
break;
}
cvReleaseCapture(&g_capture);
cvDestroyWindow(window_name);
return 0;
}