您的位置:首页 > 产品设计 > UI/UE

OpenCV(七)细说HighGUI(视频处理)

2016-11-17 16:15 381 查看
显示图像类似,让我们先看看处理视频相关的函数,首先用到的肯定是读写视频的文件的函数。在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可以垂直旋转图像。
补:不能光说不做假把式,最近做个小项目,把已经学到的知识应用到实际中!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息