OpenCV4应用开发:入门、进阶与工程化实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.6 加载视频

OpenCV不仅可以加载各种格式的图像文件,还支持加载主流格式的视频文件(如avi、mp4、wav等),支持直接读取视频流地址或者连接各种摄像头设备读取视频流。下面就来看一下OpenCV支持的视频读取函数:

其中,index表示摄像头的编号索引,默认从0开始。大家往往会忽视的是第二个参数apiPreference,它表示实际读取视频底层支持库。目前OpenCV支持CAP_FFMPEG、CAP_IMAGES和CAP_DSHOW这3种方式,默认表示自动检测支持库。当然,开发者也可以通过设置apiPreference参数实现强制支持。视频加载与显示的代码演示如下:

注意:在处理视频的时候,在while循环的代码中,waitKey应该永远设置为waitKey(1),除非你对程序有特殊要求。比如,这里设置为waitKey(100)是为了让视频以正常速度播放。

(1)从摄像头中读取

要从摄像头中读取,只需要对上述演示代码中的capture.open进行修改即可,如下:

这样就可以实现从计算机自带的摄像头中读取视频流了。

注意:这里声明了apiPreference参数实际使用的是CAP_DSHOW方式,当你不知道该用哪种方式的时候,CAP_ANY永远是你的第一选择。

(2)从视频URL地址中读取

从视频地址中读取信息的方式也很简单,只需要对上述演示代码中的capture.open进行修改即可,如下:

替换以后,编译运行,会播放高清电影的视频,真是一个惊喜,但很遗憾的是,没有声音。这里需要特别说明一下,OpenCV只对视频进行处理,没有处理音频,这是因为OpenCV是视觉库而不是音频处理库,不能处理音频相关的编解码。这一点后续将不再赘述。

(3)获取视频属性

OpenCV中的VideoCapture类还提供了一个get函数,该函数可以获取视频的常用属性,具体如下。

1)帧高度:对应get函数的属性为CAP_PROP_FRAME_HEIGHT。

2)帧宽度:对应get函数的属性为CAP_PROP_FRAME_WIDTH。

3)帧率(FPS):表示1秒内播放/处理的帧数,对应get函数的属性为CAP_PROP_FPS。

4)总帧数:视频文件总的帧数,对应get函数的属性为CAP_PROP_FRAME_COUNT。

从视频文件中获取上述4个属性的代码如下:

(4)保存视频

有时,OpenCV需要用来保存一段经过处理的视频片段,方便以后查看或者分析程序处理效果,这个时候就需要通过VideoWriter类来实现视频保存的功能。关键问题是,如何初始化VideoWriter类的实例,实现代码如下:

完成初始化以后,就可以在为每帧调用writer.write(frame)时完成视频文件的写入操作了。

完整的加载和保存视频的示例代码如下:

这里需要特别说明的是,在初始化VideoWriter对象的时候,强烈建议通过代码读取视频文件的方式直接调用capture.get(CAP_PROP_FOURCC),避免手动设置编码导致出现不支持问题。另外,在程序正常结束之前,需要调用release方法释放capture对象与writer对象。