<二>新手学opencv之cvCreateTrackbar笔记

       opencv实现播放视频的时候可以添加进度条cvCreateTrackbar,控制播放的进度,当然也可以用进度条来实现视频的暂停和开始。其函数原型为int cvCreateTrackbar( const char* trackbar_name, const char* window_name, int* value, int count, CvTrackbarCallback on_change )。第一个参数是命名的进度条名称,第二个参数是视频窗口名称,第三个参数是进度条滑块开始的位置,反映滑块的位置。第四个参数是视频总帧数。第五个参数是回调函数。


     下面是《学习opencv》书中添加滑块,以及实现其暂停和播放的代码。

int g_slipde_position=0;//进度条开始的位置  表示进度条从0开始
int g_switch_position=0;
int i=0;
int t=0;
CvCapture *capture;//CvCapture 数据类型 capture全局变量
void ontrackslide(int pos)//回调函数,传递位置参数
{
	cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,pos);//设置跳转关键帧进行播放
	i=pos;
}
void ontrackslide2(int pos)//回调函数,传递参数 参数为0 和 1
{
	if(pos==0)
	{
		t=0;
	}
	else
	{
		t=1;
	}
}
int main()
{
	capture=cvCreateFileCapture("C:\\Users\\hongbing\\Desktop\\1234.avi");
	cvNamedWindow("shipin",CV_WINDOW_AUTOSIZE);
	int frames=cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);//获得视频总帧数
	if(frames!=0)
	   {
		 cvCreateTrackbar("进度条","shipin",&g_slipde_position,frames,ontrackslide);
		 cvCreateTrackbar("On/Off","shipin",&g_switch_position,1,ontrackslide2);
	   }
	IplImage *frame;
	while(1)
	{
		frame=cvQueryFrame(capture);
		if(27==cvWaitKey(30))
		break;
		cvShowImage("shipin",frame);
		if(t==0)//为0时一帧一帧的播放(也可以10帧10帧的播放,修改一下就行)
		{
			i=i+1;
			if(i%20==0)
		//cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,i);//设置跳转关键帧进行播放帧数大 则视频不流畅
		  cvSetTrackbarPos("进度条","shipin",i);//进度条上显示播放进度20帧跳一次 时间越短,画面越卡如慢动作
		}
		else//画面暂停,只播放这一帧画面
		{
			cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,i);
		}
		if(!frame)
			break;

	}
	cvReleaseCapture(&capture);//释放capture内存空间而不是图片frame内存
	cvDestroyWindow("shipin");
	return 0;
}



你可能感兴趣的:(opencv)