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 }