#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;
}
《学习OpenCV》练习4-4
最新推荐文章于 2022-12-12 22:47:23 发布