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 }

 

 

posted on 2013-04-05 15:07  happycaoyue  阅读(521)  评论(0编辑  收藏  举报