OpenCV学习备忘 Vol .2 播放视频文件

 

作者:Akira.Panda

参考书籍及资料

  • OpenCV中文社区
  • 《学习OpenCV》

内容提要

  • 播放视频文件
  • 使用播放控制条,控制播放进度

 

准备工作

准备一段视频格式最好为avi或者mp4格式的,不要RMVB格式。

实验1 播放视频,按ESC键退出

代码

 

/*
* main.cpp
*
*  Created on: 2011-10-26
*      Author: Akira.Pan
*/
#include "highgui.h"
int main(int argc, char ** argv) {
    char* fileName = "E:\\Media\\20110606(001).mp4";
    char* windowTitle = "Vedio";
    int ESC_KEY = 27;
    cvNamedWindow(windowTitle, CV_WINDOW_AUTOSIZE);
    CvCapture *capture = cvCreateFileCapture(fileName);
    IplImage* frame;
    while (1) {
        frame = cvQueryFrame(capture);
        if (!frame) {
            break;
        }
        cvShowImage(windowTitle, frame);
        int c = cvWaitKey(33);
        if (c == ESC_KEY) {
            break;
        }
    }
    cvReleaseCapture(&capture);
    cvDestroyWindow(windowTitle);
    return 0;
}

 

 

代码解析

重要函数

  • CvCapture * cvCreateFileCapture(char* filename ) 从指定路径中读取视频文件,相对的还有从设备中(设摄像头)读出。
  • IplImage* cvQueryFrame( CvCapture* capture ) 获取下一帧图片,如果下一帧无图片为空则表示视频结束
  • void cvReleaseCapture( CvCapture** capture ) 释放掉一段Capture资源

 

实验2 播放视频,按ESC键退出,上面有播放进度控制条

代码

 

/*
 * main.cpp
 *
 *  Created on: 2011-10-26
 *      Author: Akira.Pan
 */
#include "highgui.h"
int gSliderPos = 0;
CvCapture* gCapture = NULL;
void showPosFrame(int pos) {
    /*show the pos of frame*/
    cvSetCaptureProperty(gCapture, CV_CAP_PROP_POS_FRAMES, pos);
}
int main(int argc, char ** argv) {
    char* fileName = "E:\\Media\\20110606(001).mp4";
    char* windowTitle = "Vedio";
    int ESC_KEY = 27;
    cvNamedWindow(windowTitle, CV_WINDOW_AUTOSIZE);
    CvCapture *capture = cvCreateFileCapture(fileName);
    gCapture = capture;
    int frameCount = (int) cvGetCaptureProperty(capture,
            CV_CAP_PROP_FRAME_COUNT);
    if (frameCount != 0) {
        cvCreateTrackbar("Track Bar", windowTitle, &gSliderPos, frameCount,
                showPosFrame);
    }
    IplImage* frame;
    while (1) {
        frame = cvQueryFrame(capture);
        if (!frame) {
            break;
        }
        cvShowImage(windowTitle, frame);
        gSliderPos++;
        if (gSliderPos % 150 == 0)
            cvSetTrackbarPos("Track Bar", windowTitle, gSliderPos);
        int c = cvWaitKey(50);
        if (c == ESC_KEY) {
            break;
        }
    }
    cvReleaseCapture(&capture);
    cvDestroyWindow(windowTitle);
    return 0;
}

 

 

代码解析

重要函数

  • int    cvSetCaptureProperty( CvCapture* capture, int property_id, double value ); 设置Capture的一项属性,我们这里设置的当前的Frame的位置。使Capture获取的下一帧的位置变为Frame的Pos位置;
  • double cvGetCaptureProperty( CvCapture* capture, int property_id );获取Capture一项属性,这里获取的是CV_CAP_PROP_FRAME_COUNT即所有Frame的总数;
  • int cvCreateTrackbar( const char* trackbar_name, const char* window_name,
                                 int* value, int count, CvTrackbarCallback on_change) 不要被函数签名吓住了其实这个函数也很简单。trackbar_name代表trackbar空间的标题名,和window一样也是一个key值,window_name表示是依附在哪个window上的,value代表当前控制条的位置计数,注意这个是一个引用传递值,随着拖动trackbar这个值都会发生变化;count表示最大的数值;on_change是一个回调函数即当用户拖动控制条的时候触发的一个函数。

一些说明

  •  trackbar和capture的机制


用户拖动了TrackBar之后,触发了on_click时间,程序执行回调函数showPosFrame(int);而该函数的主要作用是指定capture的播放的frame的位置。通过调整其播放帧数调整播放的进度。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值