一个简单读取视频文件代码: #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; }
结构体CvCapture
CvCapture是一个结构体,用来保存图像捕获所需要的信息
opencv从外部捕获图像的两种方式:
一种是从摄像头中
一种是通过解码视频得到图像
两种方式都必须从第一帧开始一帧一帧的按顺序获取,因此每获取一帧后都要保存相应的状态和参数
(帧数/帧率就是在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);
便可读取摄像头(本机只有一个摄像头)