天天看点

《OpenCV图像处理》——1.6 读取和写入视频文件

本节书摘来自华章计算机《opencv图像处理》一书中的第1章,第1.6节,作者:[西]葛罗瑞亚·布埃诺·加西亚(gloria bueno garcía)著,更多章节内容可以访问云栖社区“华章计算机”公众号查看

视频处理的是运动图像,而不是静止图像。视频资源可以是一个专用摄像机、网络摄像头、视频文件或图像文件序列。在opencv中,videocapture类和videowriter类为视频处理中所涉及的捕获和记录任务提供了一个易用的c++ api。

1.?recvideo示例代码

recvideo示例是一个简短的代码片段,使您可以了解如何使用一个默认摄像机作为一个捕捉设备,来抓取帧,对它们进行边缘检测,并且将新的转换视频帧作为一个文件保存。而且,创建两个窗口同时显示原始帧和处理过的帧。该示例的代码为:

《OpenCV图像处理》——1.6 读取和写入视频文件
《OpenCV图像处理》——1.6 读取和写入视频文件

在本示例中,应该快速浏览一下如下这些函数:

double videocapture::get(int propid):这个函数为一个videocapture对象返回指定的属性值。在videoio.hpp头文件中包含了基于dc1394(ieee 1394数码相机规范)属性的一个完整列表。

static int videowriter::fourcc(char c1, char c2, char c3, char c4):这个函数把四个字符连接起来形成一个fourcc码。在示例中,msvc代表微软视频(仅在windows上可用)。

bool videowriter::isopened():如果写入视频的对象被成功初始化,这个函数返回true。例如,使用一个不正确的编解码器会产生一个错误。

注意,在一个系统中有效的fourcc码依赖于本地安装的编解码器。

videocapture& videocapture::operator>>(mat& image):这个函数抓取、解码并返回下一帧。这个方法和布尔函数videocapture::read(outputarray image)等价。可以使用这个函数而不使用函数videocapture::grab(),然后使用videocapture::retrieve()。

videowriter& videowriter::operator<<(const mat& image):这个函数写入下一帧。这个方法和布尔函数videowriter::write(const mat& image)等价。

在本示例中,有一个读取/写入循环,可同时地获取并处理窗口事件。waitkey(1000/fps)函数调用负责执行这个任务。在这个示例中,1000/fps表示返回外部循环之前等待的毫秒数。尽管不精确,但对于录制的视频仍能获取每秒帧数的一个近似度量。

void videocapture::release():这个函数释放视频文件或采集设备。尽管在本示例中没有必要显式地包含,但为了说明它的使用,示例中仍包含了这个

函数。

继续阅读