openCV学习笔记(一)------进度条视频播放控制

利用openCV的函数实现进度条以帧为单位来控制视频播放,进度条的滑块可随视频播放而自动滑动。
代码参考自《openCV学习》
#include <opencv2\highgui.hpp>

using namespace cv;

int g_slider_position = 0;
CvCapture* g_capture = NULL;

//回调函数,实现窗口滚动条
void onTrackbarSlide(int pos)
{
    cvSetCaptureProperty(   //设置视频获取属性
        g_capture,          //视频获取结构
        CV_CAP_PROP_POS_FRAMES, //单位为帧数的位置(只对视频文件有效)
        pos                 //
    );
}

void video_test01()
{
    cvNamedWindow("video_test01", CV_WINDOW_AUTOSIZE);  //创建窗口,窗口大小随着视频画面大小而变化
    g_capture = cvCreateFileCapture("D:\\picture\\airplane.flv");   //获得视频结构体
    int frames = cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);  //获取视频流的各种属性,CV_CAP_PROP_FRAME_COUNT获取视频文件中总的帧数
    if (frames != 0)
    {
        cvCreateTrackbar(
            "Position",             //创建滚动条的名字
            "video_test01",         //窗口名字,滚动条所在窗口的名字
            &g_slider_position,     //g_slider_position其值反应了滑块的位置,此时是滚动条创建时滑块的位置
            frames,                 //滑块位置的最大值,最小值为0,可以理解为视频的总的帧数
            onTrackbarSlide         //每次滑块位置发生变化时,就会调用回调函数
        );
    }
    IplImage* frame;    //图像结构体
    //while loop capture & show video
    while (1)
    {
        frame = cvQueryFrame(g_capture);    //从视频文件中抓取一帧,并返回一帧
        if (!frame)
            break;  //如果视频文件抓取结束,跳出循环
        cvShowImage("video_test01", frame);
        cvSetTrackbarPos("Position", "video_test01", g_slider_position); //设置trackbar显示的位置

        onTrackbarSlide(g_slider_position++); //可以实现滑块随着视频的播放而滚动
        char c = cvWaitKey(33);
        if (c == 27)
            break;
    }
    //Release memory and destory window
    cvReleaseCapture(&g_capture);
    cvDestroyWindow("video_test01");
}

int main(int argc, char** argv)
{
    video_test01();
    return 0;
}

效果图
这里写图片描述

虽然实现了进度条滑块随着视频的播放而移动,但是视频播放并不流畅,有待解决!

猜你喜欢

转载自blog.csdn.net/tuoniaoatuoniao/article/details/76408940
今日推荐