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;
}

效果圖
這裏寫圖片描述

雖然實現了進度條滑塊隨着視頻的播放而移動,但是視頻播放並不流暢,有待解決!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章