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

本文介绍如何使用OpenCV进行视频处理,包括从视频文件或摄像头读取视频帧、处理帧数据及将处理后的视频写入文件的方法。同时,还介绍了如何使用cvCreateFileCapture和cvCreateCameraCapture函数初始化CvCapture结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

显示图像类似,让我们先看看处理视频相关的函数,首先用到的肯定是读写视频的文件的函数。在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可以垂直旋转图像。
补:不能光说不做假把式,最近做个小项目,把已经学到的知识应用到实际中!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值