《学习OpenCV》第四章课后题4

来源:互联网 发布:电缆标识球数据 编辑:程序博客网 时间:2024/05/29 23:44

题目说明:创建一个程序读入和显示视频文件,并可以使用滑动条控制视频文件的播放。一个滑动条用来控制视频播放位置,以10为步长跳进。另一个滑动条用来控制停止/播放。

#include <highgui.h>#include <cv.h>int g_slider_position = 0;CvCapture* g_capture = NULL;int i = 0;int g_slider_position1 = 0;bool t = true;//回调函数1void onTrackbarSlide(int pos){    if(pos%10 != 0)    {       pos = pos - pos%10 ;//调整滚动条开始处均以10为单位    }    cvSetCaptureProperty ( g_capture, CV_CAP_PROP_POS_FRAMES, pos );    i = pos;}//回调函数2void switch_callback(int position){    if(position == 0)    {        t = true;//使滚动条以10帧为步距进行播放    }    else    {        t = false;//使滚动条一致播放当前帧    }}int main(){    cvNamedWindow("Video", CV_WINDOW_AUTOSIZE);    g_capture = cvCaptureFromFile("E:/song.mp4");    int frames = (int)cvGetCaptureProperty( g_capture, CV_CAP_PROP_FRAME_COUNT );    if(frames != 0)    {        //控制视频播放的滑动条        cvCreateTrackbar( "播放进度条", "Video", &g_slider_position, frames, onTrackbarSlide);        //控制视频停止播放的滑动条        cvCreateTrackbar( "播放停止条", "Video", &g_slider_position1, 1, switch_callback);    }    cvSetTrackbarPos("播放进度条", "Video", 1 );    cvSetTrackbarPos("播放停止条", "Video", 0 );    IplImage * frame;    while( (frame= cvQueryFrame(g_capture)) != NULL)    {           //计算机获取视频需要一定时间,时间未知        char c = cvWaitKey(50);        if(c == 27) break;        cvShowImage("Video", frame);        //设置滚动条移动步距        cvSetTrackbarPos("播放进度条", "Video", i);        if(t)        {            i = i+ 10;  // 10为步长            cvSetCaptureProperty( g_capture, CV_CAP_PROP_POS_FRAMES, i );        }        else        {            cvSetCaptureProperty( g_capture, CV_CAP_PROP_POS_FRAMES, i );        }    }    cvReleaseCapture(&g_capture);    //cvReleaseImage(&frame);    /*没有必要通过cvReleaseImage()对这个返回的图像指针进行释放,当       CvCapture结构被释放后,每一帧图像所对应的内存空间即会被释放*/     cvDestroyWindow("Video");    return 0;}

运行结果:
这里写图片描述

引用:qdsclove的专栏
http://blog.csdn.net/stk_overflow/article/details/8760110

0 0
原创粉丝点击