【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;
}


结构体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);

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

你可能感兴趣的:(opencv)