《学习OpenCV》练习4-4

#include "cv.h"
#include "highgui.h"
#include "stdio.h"

/*声明滑动条当前位置全局变量*/
int        g_slider_position = 0;
/*声明视频状态标志位,其值为0和1,分别控制开关的断开与闭合(按下),对应视频的暂停与播放*/
int g_switch_value = 1;			
/*声明视频当前状态信息全局变量*/
CvCapture* g_capture         = NULL;

//*****************************************************
//滑动条回调函数:根据滑动条当前位置来设置显示帧
//          pos:视频当前位置
//*****************************************************
void onTrackbarSlide( int pos )
{
	cvSetCaptureProperty( g_capture, CV_CAP_PROP_POS_FRAMES, pos );
}

//*****************************************************
//按钮关闭函数:按钮关闭后的动作
//*****************************************************
void switch_off_function() 
{
	printf("Pause\n");				//按钮关闭,显示暂停
} 

//*****************************************************
//按钮开启函数:按钮开启后的动作
//*****************************************************
void switch_on_function() 
{
	printf("Run\n");				//按钮开启,显示播放
}

//*****************************************************
//滑动条回调函数:这里只给滑动条设置0和1的值以实现按钮功能
//     position:当前滑动条处于的位置
//*****************************************************
void switch_callback( int pos ) 
{
	if (pos == 0)					//如果滑动条处于0位置则为按钮关闭(没按下)
	{
		switch_off_function();
	} 
	else							//否则(为1)则滑动条为按钮开启(按下)
	{
		switch_on_function();
	}
}

//*****************************************************
//主函数
//*****************************************************
int main( int argc, char **argv )
{
	cvNamedWindow( "homework_4-4", CV_WINDOW_AUTOSIZE );
	g_capture = cvCreateFileCapture( "homework_4-4.mp4" );
	if (!g_capture)																	//如果捕获的capture为0,即获取视频失败
	{
   		printf(	"Failed to open %s\n", "homework_4-4.mp4" );						//则显示失败且返回-1
   		return -1;
	}
	//获得总帧数,也就是滚动条位置的最大值,这个函数的功能和第二个参数有关
	int count = ( int )cvGetCaptureProperty( g_capture, CV_CAP_PROP_FRAME_COUNT );	
	if( count!=0 )
	{
		//当滚动条被拖动时,opencv会自动将当前位置所代表的值传给指针所指向的整数,也就是说当滚动条被拖动时,g_slider_position的值是在改变的
		//另外最后一个参数是滑动条回调函数的指针,指向滑动条回调函数的首地址
		cvCreateTrackbar( "position", "homework_4-4", &g_slider_position, count, onTrackbarSlide );
		//在"homework_4-4"创建名为"switch"的滑动条;当滑动条被拖动时,OpenCV会自动将当前位置值传给g_switch_value;
		//1代表为滑动条最大值;最后一个参数直接引用滑动条回调函数的函数名,即将滑动条回调函数的首地址传到下面函数
		cvCreateTrackbar( "switch", "homework_4-4", &g_switch_value, 1, switch_callback );
	}
	//如果此处滚动条没有被拖动,此语句的作用就是在窗口上创建了一个滚动条,其位置为0,即在初始位置

	IplImage* frame = NULL;									//帧图像
	while( 1 )
	{
		if (g_switch_value == 1)							//如果g_switch_value为1,即为播放状态
		{
			frame = cvQueryFrame( g_capture );				//帧图像从查询视频信息中获取
			if( !frame )									//如果视频播放结束,让视频处于停在最后一帧的暂停状态
			{
				g_switch_value = 0;
				cvCreateTrackbar( "switch", "homework_4-4", &g_switch_value, 1, switch_callback );
			}
			cvShowImage( "homework_4-4", frame );			//循环显示帧,即播放视频
			//每次循环都在当前位置重新创造一个滚动条,也就是滚动条随着视频播放自动移动
			cvCreateTrackbar( "position", "homework_4-4", &g_slider_position, count, onTrackbarSlide );
			g_slider_position++;
		}	
		char c = cvWaitKey( 33 );							
		if( c==27 )												
			break;		
	}
	cvReleaseCapture( &g_capture );
	cvDestroyWindow( "homework_4-4" );

	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值