• opencv播放视频


    作者:Akira.Panda

    参考书籍及资料

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

    内容提要

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

     

    准备工作

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

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

    代码

    C代码  收藏代码
    1. /* 
    2. * main.cpp 
    3. * 
    4. *  Created on: 2011-10-26 
    5. *      Author: Akira.Pan 
    6. */  
    7. #include "highgui.h"  
    8. int main(int argc, char ** argv) {  
    9.     char* fileName = "E:\\Media\\20110606(001).mp4";  
    10.     char* windowTitle = "Vedio";  
    11.     int ESC_KEY = 27;  
    12.     cvNamedWindow(windowTitle, CV_WINDOW_AUTOSIZE);  
    13.     CvCapture *capture = cvCreateFileCapture(fileName);  
    14.     IplImage* frame;  
    15.     while (1) {  
    16.         frame = cvQueryFrame(capture);  
    17.         if (!frame) {  
    18.             break;  
    19.         }  
    20.         cvShowImage(windowTitle, frame);  
    21.         int c = cvWaitKey(33);  
    22.         if (c == ESC_KEY) {  
    23.             break;  
    24.         }  
    25.     }  
    26.     cvReleaseCapture(&capture);  
    27.     cvDestroyWindow(windowTitle);  
    28.     return 0;  
    29. }  

    代码解析

    重要函数

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

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

    代码

    C代码  收藏代码
    1. /* 
    2.  * main.cpp 
    3.  * 
    4.  *  Created on: 2011-10-26 
    5.  *      Author: Akira.Pan 
    6.  */  
    7. #include "highgui.h"  
    8. int gSliderPos = 0;  
    9. CvCapture* gCapture = NULL;  
    10. void showPosFrame(int pos) {  
    11.     /*show the pos of frame*/  
    12.     cvSetCaptureProperty(gCapture, CV_CAP_PROP_POS_FRAMES, pos);  
    13. }  
    14. int main(int argc, char ** argv) {  
    15.     char* fileName = "E:\\Media\\20110606(001).mp4";  
    16.     char* windowTitle = "Vedio";  
    17.     int ESC_KEY = 27;  
    18.     cvNamedWindow(windowTitle, CV_WINDOW_AUTOSIZE);  
    19.     CvCapture *capture = cvCreateFileCapture(fileName);  
    20.     gCapture = capture;  
    21.     int frameCount = (int) cvGetCaptureProperty(capture,  
    22.             CV_CAP_PROP_FRAME_COUNT);  
    23.     if (frameCount != 0) {  
    24.         cvCreateTrackbar("Track Bar", windowTitle, &gSliderPos, frameCount,  
    25.                 showPosFrame);  
    26.     }  
    27.     IplImage* frame;  
    28.     while (1) {  
    29.         frame = cvQueryFrame(capture);  
    30.         if (!frame) {  
    31.             break;  
    32.         }  
    33.         cvShowImage(windowTitle, frame);  
    34.         gSliderPos++;  
    35.         if (gSliderPos % 150 == 0)  
    36.             cvSetTrackbarPos("Track Bar", windowTitle, gSliderPos);  
    37.         int c = cvWaitKey(50);  
    38.         if (c == ESC_KEY) {  
    39.             break;  
    40.         }  
    41.     }  
    42.     cvReleaseCapture(&capture);  
    43.     cvDestroyWindow(windowTitle);  
    44.     return 0;  
    45. }  

    代码解析

    重要函数

    • 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的位置。通过调整其播放帧数调整播放的进度。

  • 相关阅读:
    Java Platform SE binary已停止运行 Can't load AMD 64-bit.dll on a IA 32-bit platform错误
    ORACLE PL/SQL编程之触发器
    JVM年轻代(young generation)老年代(old generation tenured)持久代(permanent generation)GC
    在JVM中,新生代和旧生代有何区别?GC的回收方式有几种?server和client有和区别?
    spring的笔记1 关云长
    雷林鹏分享:Java 流(Stream)、文件(File)和IO
    雷林鹏分享:Java 方法
    雷林鹏分享:Java 正则表达式
    雷林鹏分享:Java 日期时间
    雷林鹏分享:Java 数组
  • 原文地址:https://www.cnblogs.com/gune/p/3039790.html
Copyright © 2020-2023  润新知