• openvc学习笔记(2)——视频播放


     1 #include "stdafx.h"
     2 #include "highgui.h"
     3 #include <iostream> 
     4 using namespace std;
     5 int main( int argc, char** argv ) { 
     6 cvNamedWindow( "Example2",0);
     7 //CvCapture* capture = cvCaptureFromAVI( argv[1] ); // either one will work
     8 CvCapture* capture = cvCreateFileCapture( "C:/abc.avi" );
     9 IplImage* frame;
    10     while(1) {
    11         frame = cvQueryFrame( capture );
    12         if( !frame ) break;
    13         cvShowImage( "Example2", frame );
    14         char c = cvWaitKey(33);
    15         if( c == 27 ) break;
    16     }
    17     cvReleaseCapture( &capture );
    18     cvDestroyWindow( "Example2" );
    19     
    20     return 0;
    21 }

    #include <iostream>
    using namespace std;

    假如输入输出代码需要用的头文件,本例中可以不使用

    cvNamedWindow( "Example2",0);

    创建叫做“Example2”的窗口,参数0,表示视频大小会跟着窗口大小进行改变。

    若设成CV_WINDOW_AUTOSIZE,窗口会自然根据视频大小进行调整,及时改变窗口大小,视频大小不改变

    CvCapture* capture = cvCreateFileCapture( "C:/abc.avi" );
    创建一个Capture类型的指针,参数是路径名。要用‘/’否则出错

    //CvCapture* capture = cvCaptureFromAVI( argv[1] ); // either one will work

    与刚才的代码一样

    IplImage* frame;
        while(1) {
            frame = cvQueryFrame( capture );

    把下一帧视频载入内存,capture已经开辟内存了。而cvLoadImage是开辟内存

    cvReleaseImage()用来释放内存,capture一旦被释放则整个内存就会被释放
            if( !frame ) break;

    下一帧为0,故结束
            cvShowImage( "Example2", frame );
            char c = cvWaitKey(33);
            if( c == 27 ) break;

    当前帧显示后等待33ms,c用来存放用户输入的键盘的阿斯科马值,ESC的值是27.故输入27时候结束
        }
        cvReleaseCapture( &capture );
        cvDestroyWindow( "Example2" );
     
     return 0;
    }

    cvQueryFrame

    从摄像头或者文件中抓取并返回一帧

    IplImage* cvQueryFrame( CvCapture* capture );
    
    capture
    视频获取结构。

    函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。

    这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。

    cvGetCaptureProperty

    获得视频获取结构的属性

    double cvGetCaptureProperty( CvCapture* capture, int property_id );
    
    capture
    视频获取结构。
    property_id
    属性标识。可以是下面之一:
    CV_CAP_PROP_POS_MSEC - 影片目前位置,为毫秒数或者视频获取时间戳
    CV_CAP_PROP_POS_FRAMES - 将被下一步解压/获取的帧索引,以0为起点
    CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾) CV_CAP_PROP_FRAME_WIDTH - 视频流中的帧宽度
    CV_CAP_PROP_FRAME_HEIGHT - 视频流中的帧高度
    CV_CAP_PROP_FPS - 帧率 CV_CAP_PROP_FOURCC - 表示codec的四个字符
    CV_CAP_PROP_FRAME_COUNT - 视频文件中帧的总数

    函数cvGetCaptureProperty获得摄像头或者视频文件的指定属性。

    有时候这个函数在cvQueryFrame被调用一次后,再调用cvGetCaptureProperty才会返回正确的数值。

    cvCreateTrackbar

    创建trackbar并将它添加到指定的窗口。

    CV_EXTERN_C_FUNCPTR( void (*CvTrackbarCallback)(int pos) );
    
    int cvCreateTrackbar( const char* trackbar_name, const char* window_name,
                          int* value, int count, CvTrackbarCallback on_change );
    
    trackbar_name
    被创建的trackbar名字。
    window_name
    窗口名字,这个窗口将为被创建trackbar的父对象。
    value
    整数指针,它的值将反映滑块的位置。这个变量指定创建时的滑块位置。
    count
    滑块位置的最大值。最小值一直是0。
    on_change
    每次滑块位置被改变的时候,被调用函数的指针。创建一个回调函数。
    这个函数应该被声明为void Foo(int);
    如果没有回调函数,这个值可以设为NULL。

    函数cvCreateTrackbar用指定的名字和范围来创建trackbar(滑块或者范围控制),指定与trackbar位置同步的变量,并且指定当trackbar位置被改变的时候调用的回调函数。被创建的trackbar显示在指定窗口的顶端。

    cvSetTrackbarPos

    设置trackbar位置

    void cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos );
    
    trackbar_name
    trackbar的名字。
    window_name
    trackbar父窗口的名字。
    pos
    新的位置。

    函数cvSetTrackbarPos设置指定trackbar的位置。

     1 #include "stdafx.h"
     2 #include "highgui.h"
     3 #include <fstream>
     4 #include <iostream> 
     5 using namespace std;
     6 int         g_slider_position = 0;
     7 CvCapture*  g_capture         = NULL;
     8 
     9 void onTrackbarSlide(int pos) {
    10     cvSetCaptureProperty(
    11         g_capture,
    12         CV_CAP_PROP_POS_FRAMES,
    13         pos
    14     );
    15 }
    16 
    17 int main( int argc, char** argv ) {
    18     cvNamedWindow( "E2滑动条控制视频播放", CV_WINDOW_AUTOSIZE );
    19     g_capture = cvCreateFileCapture("C:/abc.avi");
    20     
    21     int frames = (int) cvGetCaptureProperty(
    22         g_capture,
    23         CV_CAP_PROP_FRAME_COUNT
    24     );
    25 
    26 cvCreateTrackbar(
    27         "Position",
    28         "E2滑动条控制视频播放",
    29         &g_slider_position,
    30         frames,
    31         onTrackbarSlide
    32     );
    33 
    34     IplImage* frame;
    35     
    36     while(1) {
    37         
    38         frame = cvQueryFrame( g_capture );
    39         if( !frame ) break;
    40         char c = cvWaitKey(33);
    41         cvShowImage( "E2滑动条控制视频播放", frame );
    42         printf("\n%d\n",frame);
    43         if( c == 27 ) break;
    44         g_slider_position++;
    45          cvSetTrackbarPos("Position",
    46         "E2滑动条控制视频播放",
    47         g_slider_position);
    48         
    49        
    50     }
    51     cvReleaseCapture( &g_capture );
    52     cvDestroyWindow( "E2滑动条控制视频播放" );
    53     int s;
    54     cin>>s;
    55     return(0);
    56 }
  • 相关阅读:
    玩转车联网1---初识OBD和行车助手
    Confluence DotNet API发布
    深入理解最强桌面地图控件GMAP.NET ---[更新]百度地图
    猜想豌豆夹,360手机助手,腾讯手机管家,小米盒子传屏等工具开发思路
    有用文章搜藏
    Hbase Region Server整体架构
    无密码ssh操作步骤备忘
    cgwin的ssh错误解决办法
    Java系列笔记(1)
    SQL四种语言:DDL,DML,DCL,TCL
  • 原文地址:https://www.cnblogs.com/happycaoyue/p/2999534.html
Copyright © 2020-2023  润新知