【04】Opencv读视频和摄像头

一个简单读取视频文件代码:
#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);

即可读取摄像头(本机只有一个摄像头)