《计算机视觉算法:基于OpenCV的计算机应用开发》 —2.7 视频文件读写

举报
华章计算机 发表于 2020/02/15 13:54:34 2020/02/15
【摘要】 本节书摘来自华章计算机《计算机视觉算法:基于OpenCV的计算机应用开发》 一书中第2章,第2.7.1节,作者是[伊朗] 阿明·艾哈迈迪·塔兹赫孔迪(Amin Ahmadi Tazehkandi) ,陈靖 杨欣 译。

2.7 视频文件读写

OpenCV中使用videoio模块来实现视频文件的读写,准确来说,就是使用了VideoCapture和VideoWriter类。视频相对于图像的明显区别是它们包含了一组连续的图像(更好的说法是帧)。因此,视频常是在一个循环中被读取、处理或写入,这个循环覆盖了视频中全部或所有需要的帧。让我们用一段代码来介绍如何使用OpenCV中的VideoCapture类来读取和播放一段视频:

 image.png

 

上面的代码中,视频文件的名字构建好后被传递给VideoCapture类。如果视频文件存在,并且你的计算机(和OpenCV)支持这种格式,那么视频文件将被自动打开。因此可以用isOpened函数来检查视频文件是否被成功打开。之后,VideoCaptrue类中的get函数用来获取已打开视频文件的每秒帧数(framerate per second,FPS)。get是VideoCapture中非常重要的函数,它可以用来检索被打开的视频文件的各种属性。这里是一些参数举例,这些参数可传递给get函数以获得所需结果:

  • CAP_PROP_POS_FRAMES:下一个待处理帧的序号,从0开始计数。

  • CAP_PROP_FRAME_WIDTH:视频流每一帧的宽度。

  • CAP_PROP_FRAME_HEIGHT:视频流每一帧的高度。

  • CAP_PROP_FPS:视频帧率。

  • CAP_PROP_FRAME_COUNT:视频文件的总帧数。

完整的列表可参考OpenCV文档中VideoCaptureProperties的枚举类型。回到前面的示例代码,在用get函数获取帧率后,它被用来计算两个帧之间的延迟,这样当回放的时候就不会太快或者太慢。然后,在一个无限循环中,可用>>操作符读取和显示帧。注意,这个操作符本质上是简化的VideoCapture函数形式,例如read、grab和retrieve。我们已经学习了imshow函数及其用法。另外,waitKey和我们前面看到的有稍许不同,被用来插入延迟,同时等待按键。在这种情况下,预先计算的延迟(以毫秒为单位)***入到显示的帧之间,如果空格键被按下,循环就会被终止。最后的release函数则无须解释。

除了我们使用的VideoCapture类及其方法之外,如果我们不想把文件名传递给构造函数,或者视频文件在VideoCapture构造时并不存在,我们可以在之后调用它的open函数来打开视频文件。VideoCapture中另一个重要的函数是set函数。可以把set看成get函数的相反操作,它允许设置VideoCapture和打开的视频文件的参数。试试用前面提过的VideoCaptureProperties枚举类型的不同参数进行试验。

VideoWriter类的使用方法非常类似,可用来写入视频文件。这里展示了如何创建一个VideoWriter对象:

 image.png

这将创建一个宽1920、高1080、帧率为30的视频,并写入“C:/output.avi”文件。但是fourcc是什么?它叫四字符码(Four Character Code,FourCC)就是一个四字节码的视频格式(或编解码器),用来保存视频文件。在此例中,我们使用了一种最常见的FourCC值,但是你也可以在网上查找更全面的FourCC值和规范。

VideoWriter对象创建后,你可以使用<< 操作符或write函数把一个图像(大小和视频相同)写入视频文件:

 image.png

或者使用下面的代码:

 image.png

最后,可以调用release函数以确保视频文件被释放并在文件中写入了所有的改动。

除了前面提到的VideoCapture和VideoWriter类的方法,还可以设置你偏好的后端API。参考OpenCV中VideoCaptrueAPIs文档以获得更多信息。如果省略的话,将使用计算机支持的默认后端API,我们的例子就是这种情况。

2.7.1 使用摄像头

我们用VideoCapture类来访问视频文件,OpenCV通过它访问系统上可用的摄像头。唯一不同的是你必须给对应的每个可用摄像头提供一个从0开始的索引号,而不是给VideoCapture类的构造函数传递一个文件名。例如,可用以下代码访问并显示计算机上默认的网络摄像头:

 image.png

 

如上所见,唯一的不同之处是构造函数。VideoCapture类允许用户用同样的方式来处理不同类型的视频源,因此可以编写几乎相同的代码来处理摄像头或视频文件。网络流媒体也是一样,下一节会详细描述。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。