OpenCV网络摄像头帧率

4

我有一台支持1080p 30fps的网络摄像头,使用VirtualDub进行预览和保存时已经确认了。

但是,OpenCV却只能给我大约4FPS,CPU也没有到达最高使用率,所以我不知道原因在哪里?(顺便说一句,这只是获取帧而没有实际输出视频)

有经验的OpenCV用户是否知道原因?是否可能是OpenCV没有使用DirectShow来读取网络摄像头(假设DirectShow是需要30fps/1080p的,我相信这是VirtualDub使用的),还是OpenCV将图像读入其专有的数据类型Mat 是瓶颈所在?

我的摄像头是Microsoft LifeCam Studio,操作系统是Windows 7和Visual Studios 2010。

是否有人有什么想法呢?


我也遇到了这个问题。你解决了吗?你能在这里发布一些可能的解决方案吗? - Tony
使用DirectX进行捕获。 - Cheetah
2个回答

3
正如Roman所指出的,大多数网络摄像头的默认模式是MJPEG压缩,以减少需要通过USB连接传输(可能还包括USB集线器等)的数据速率和/或最大化可用帧率/分辨率。
对于计算机视觉来说,这通常是不可取的,因为我们更愿意拥有较低的帧率,但没有压缩伪影。事实上,一般可以像改变分辨率一样改变流格式(例如无压缩YUV)。能否真正地做到这一点取决于以下几个因素:
  • 硬件支持哪些模式,
  • 底层驱动程序支持哪些模式(通常是通用USB视频类/UVC驱动程序),
  • 后面涉及的各种框架(例如Windows视频/DirectX/Video4Linux2等)支持哪些模式,以及
  • 最终由OpenCV使用的视频捕捉后端支持哪些模式。
很遗憾,后者的答案是没有。 OpenCV有18个(!)不同的捕获后端(用于各种平台,例如手机,OS X,Windows和Linux,通常为不同版本的底层框架提供几个),尽管似乎有一个API用于更改流格式[1],但它似乎没有被任何后端实现。 :-(
如果您或其他人想要解决此问题,可以查看我开放的OpenCV问题:http://code.opencv.org/issues/3007 在我的情况下,我调查了一些罗技网络摄像头,这些摄像头甚至由Windows和Linux低级驱动程序公开了不同的功能。在Linux下,我无意中使用了OpenCV的GStreamer后端,这意味着另一层间接性 - 在底层始终归结为V4L(视频Linux)内核API。使用libv4l后端改善了事情,因为它具有默认到某些YUV流格式的良好属性(尽管可能以较低的帧速率进行,这在其他情况下可能是不可取的)。 (甚至有直接访问v4l内核API或通过libv4l进行的不同、分散的后端。)
[1] 请参阅API文档中的CV_CAP_PROP_FORMAT:http://opencv.willowgarage.com/documentation/cpp/reading_and_writing_images_and_video.html

3

通过捕获压缩视频(很可能是JPEG),可以实现30帧每秒的效果。如果OpenCV切换到捕获原始视频,例如RGB,则有效帧率受USB带宽限制。在1920x2080 24位RGB下,USB可以推送约4 FPS的数据(25 MB / s)。

解决方案是确保捕获格式(DirectShow术语中的媒体类型)为压缩视频,并进行软件解压缩。


1
我也遇到了这个问题,想知道是否有人能够在仍然使用OpenCV的情况下提高视频捕获的速度。 - giogadi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接