一个简单读取视频文件代码: #include"highgui.h" int main() { cvNamedWindow("flv"); //结构体Cv的C是大写的 函数cv的c是小写的 CvCapture* capture = cvCreateFileCapture("D:\\BaiduYunDownload\\2015-03-13远程关机\\远程关机.flv"); IplImage*frame; while (1) { frame = cvQueryFrame(capture);//该函数读取当前帧的下一帧 if (!frame)break; cvShowImage("flv",frame); char c = cvWaitKey(33); if (c == 27) //ESC的ASCII码为27 break; } cvReleaseCapture(&capture); cvDestroyWindow("flv"); return 0; }
结构体CvCaptureapi
CvCapture是一个结构体,用来保存图像捕获所须要的信息dom
opencv从外部捕获图像的两种方式:ide
一种是从摄像头中函数
一种是经过解码视频获得图像ui
两种方式都必须从第一帧开始一帧一帧的按顺序获取,所以每获取一帧后都要保存相应的状态和参数spa
(帧数/帧率就是在1秒钟时间里传输的图片的量,也能够理解为图形处理器每秒钟可以刷新几回,一般用fps表示指针
每一帧都是静止的图象)视频
好比从视频文件获取,须要保存视频文件的文件名,相应×××的类型,下一次若是要获取将须要解码那一帧接口
这些信息都保存在CvCapture结构中,每获取一帧后,这些信息都将被更新图片
获取下一帧须要将新信息传给获取的api接口
函数解释:
CVAPI(CvCapture*) cvCreateFileCapture( const char* filename );
经过输入要读取的视频文件(已经转码的)的路径,而后,该函数返回一个指向CvCapture结构体的指针
CVAPI(IplImage*) cvQueryFrame( CvCapture* capture );
输入一个CvCapture类型的指针
该函数的主要功能是将视频文件的下一帧加载到内存
与cvLoadImage的不一样在于该函数不从新分配内存空间
char c = cvWaitKey(33);
当前帧被显示后,等33毫秒。若是用户触发一个按键,c被设置成这个按键的ASCII码,不然设为-1
cvWaitKey(33)另外一个做用就是控制频率
/* stop capturing/reading and free resources */ CVAPI(void) cvReleaseCapture( CvCapture** capture );
释放CvCapture结构体开辟的内存空间
关闭打开的视频文件有关的文件句柄
读取摄像头:
/* start capturing frames from camera: index = camera_index + domain_offset (CV_CAP_*) */ CVAPI(CvCapture*) cvCreateCameraCapture( int index );
该函数的输入参数是一个ID号 只有存在多个摄像头时才起做用
当ID=-1; 表示随机选择一个
只有一个摄像机时,参数值取0
把上述代码替换为
CvCapture* capture = cvCreateCameraCapture(0);
即可读取摄像头(本机只有一个摄像头)