显示图像类似,让我们先看看处理视频相关的函数,首先用到的肯定是读写视频的文件的函数。在OpenCV中,处理视频要用到CvCapture结构。CvCapture结构包含从摄像机或视频文件读取帧所需的信息。根据视频来源,我们可以使用下面两个函数之一来初始化CvCapture结构。
CvCapture* cvCreateFileCapture (const char* filename);
CvCapture* cvCreateCameraCapture( int index);
当使用cvCreateFileCapture()时,我们只需要将MPG或者AVI视频文件名告诉cvCreateFileCapture(),OpenCV会打开并准备读取视频。如果打开成功,将返回一个指向已经初始化了的CvCapture结构的指针,随后便可以读入视频的帧。
注:检查函数的返回结果,一些情况下无法打开文件,函数会返回NULL指针;当压缩视频的编码未知时cvCreateFileCapture()也会返回NULL指针。(视频压缩编码是为了视频可以被成功的读入)。这就出现了一台机器上可以读入视频文件,换了机器后,由于可能缺少视频压缩编码库就读不了视频文件了。
从摄像机中得到图像
从摄像机中得到图像要用到函数cvCreateCameraCapture(),这个函数只有一个参数,常用的参数有两个,当只有一个摄像机的时候,参数值取0;当参数设置为-1时,OpenCV会打开一个窗口让用户选择需要的摄像机。
读视频
int cvGrabFrame( CvCapture* capture);
IplImage* cvRetrieveFrame(CvCapture* capture);
IplImage* cvQueryFrame( CvCapture* capture);
创建一个有效的CvCapture结构后,便可以开始读取视频帧。有两种方法,第一种方法是使用cvGrabFrame(),该函数是以CvCapture指针为参数,返回一个整数,当读取帧成功时返回1,否则返回0。cvGrabFrame()将视频帧复制到了一个用户不可见的内存空间里。为什么要这样那?以为获取的视频帧数据是未经处理的,cvGrabFrame()被设计为用于快速将视频帧读入内存。
在cvGrabFrame()后,可以调用cvRetrieveFrame()来处理cvGrabFrame()读入的视频数据。这个函数会对读入帧做多有必须的处理(包括图像解码操作),并且返回一个IplImage指针,改指针指向另一块内部内存空间(但是cvGrabFrame()下一次被调用时,指针多指向的空间被新的图像覆盖)。如果要特殊处理这幅图像,可以先将图像数据复制其他地方。
第二种方法,使用cvQueryFrame()函数。这个函数其实是cvGrabFrame()和cvRetrieveFrame()的一个组合。
注意:对于一个视频文件,当调用cvGrabFrame()时,视频帧会自动前进一步,所以下一次调用会自动读入下一视频。
释放CvCa结构,调用cvReleaseCapture():
void cvReleaseCapture(CvCapture * capture);
查询和设置视频的各种属性:
double cvGetCaptureProperty(
CvCapture* capture,
int property_id
);
int cvSetCaptureProperty(
CvCapture* capture,
int property_id,
double value
);
写视频
写视频必须要创建一个CvVideoWriter结构,CvVideoWriter是一个类似于CvCapture的视频写入结构。该结构与下面的函数一起使用。
CvVideoWriter* cvCreateVideoWriter(
const char* filename,
int fourcc,
double fps,
CvSize frame_size,
int is_color =1
);
int cvWriteFrame(
CvVideoWriter* writer,
const IplImage* image
);
void cvReleaseVideoWriter(
CvVideoWriter** writer
);
写入完成后,为了关闭写入结构,必须调用CvReleaseVideoWriter()函数。如果不显示的释放写入结构,视频文件可能被损坏。
补充:ConvertImage函数
此函数使用广泛,同时也是非常重要。
void cvConvertImage(
const CvArr* src,
CvArr* dst,
int flags = 0
);
cvCOnvertImage()用于在常用的不同图像格式之间转换。文件格式在src与dst图像的头文件中指出。
原图像可以是单个、3个或者4个通道,可以是8位或者浮点类型像素格式。目标图像必须是8位的单通道或者3通道。参数flags可以垂直旋转图像。
补:不能光说不做假把式,最近做个小项目,把已经学到的知识应用到实际中!