opencv_study第二篇|opencv播放AVI视频

<span style="font-family:Comic Sans MS;">#include "highgui.h"
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
int main(int argc, char **argv)
{
	cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE);
	CvCapture *capture = cvCreateFileCapture("test.avi");
	IplImage *frame;
	while (1)
	{
		frame = cvQueryFrame(capture);
		if (!frame)
			break;
		cvShowImage("Example2", frame);
		char c = cvWaitKey(33);
		if (c == 27)
			break;
	}
	cvWaitKey(0);
	cvReleaseCapture(&capture);
	cvDestroyWindow("Example2");
	return 0;
}</span>
<span style="font-family:Comic Sans MS;">CvCapture *capture=cvCreateFileCapture("test.avi");</span>

      函数CvCreateFileCapture()通过参数设置确定要读入的AVI文件,返回一个指向CvCapture结构的指针。这个结构包括了所有关于要读入AVI文件的信息,其中包含状态信息。在调用这个函数后,返回指针所指向的CvCapture结构被初始化到对应AVI文件的开头。

<span style="font-family:Comic Sans MS;">frame=cvQueryFrame(capture);</span>
      一旦进入while (1)循环,程序便开始读入AVI文件,cvQueryFrame的参数为CvCapture结构的指针。用来将下一帧视频文件载入内存(实际是填充或更新CvVapture结构中)。返回一个对应当前帧的指针。与cvLoadImage()不同的是,cvLoadImage()为图像分配内存空间,而cvQueryFrame()使用已经在cvCapture结构中分配好的内存。这样的话,就没有必要通过cvReleaseImage()对这个返回的图像指针进行释放,当CvCapture结构被释放后,每一帧图像所对应的内存空间即会被释放。

<span style="font-family:Comic Sans MS;">c=cvWaitKey(33);
if (c==27)
  break;

</span>
      当前帧被显示后,我们会等待33ms。如果其间用户触发了一个按键,c会被设置成这个按键的ASCII码,否则,c会被设置成-1.如果用户触发了ESC键(ASCII 27),循环会被退出,读入视频停止。否则33ms以后继续执行循环。

      需要指出的是,在这个简单的例子程序中,我们没有使用任何准确的方法来控制视频帧率。我们只是简单的通过cvWaitKey()来固定时间间隔载入帧图像,在一个精度要求更高的程序中,从CvCapture结构中读取实际帧率是一个更好的方法!

<span style="font-family:Comic Sans MS;">cvReleaseCapture(&capture);</span>
      退出循环体(视频文件已经读入结束或者用户触发了Esc键)后,我们应该释放CvCapture结构开辟的内存空间,这同时也会关闭所有打开的AVI文件相关的文件句柄。


      


你可能感兴趣的:(学习笔记,opencv,avi)