OpenCV网络摄像头帧率

时间:2012-06-08 10:08:33

标签: opencv video webcam

我有一个能够支持1080p 30fps的网络摄像头,我已经使用VirtualDub预览并保存了网络摄像头本身的视频。

出于某种原因,OpenCV只会给我大约4FPS,CPU没有最大化任何内核,所以我不明白为什么? (这实际上并没有实际输出Feed,只是获取帧)。

有OpenCV经验的人知道为什么吗?可能是因为OpenCV没有使用DirectShow从网络摄像头读取(假设DirectShow是你需要的30fps / 1080p - 我相信这是virtualdub使用的)。 OpenCV将图像读入其专有数据类型Mat的事实是否会成为瓶颈?

我的相机是Microsoft LifeCam Studio,我的操作系统是带有Visual Studios 2010的Windows 7。

有没有人有任何想法?

2 个答案:

答案 0 :(得分:2)

通过捕获压缩视频(很可能是JPEG)来实现30 FPS。我碰巧OpenCV正在切换到捕获原始视频,例如RGB,在这种情况下,有效的FPS受到USB带宽的限制。 4 FPS是关于USB可以在1920x2080 24位RGB(25 MB / s)中推送的数据量。

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

答案 1 :(得分:2)

正如Roman所指出的,大多数网络摄像头的默认模式是 MJPEG-compression ,以降低需要通过USB连接的数据速率(和可能是USB集线器等)和/或最大化可用的帧速率/分辨率。

对于计算机视觉,这通常是不合需要的,因为我们宁愿更低的帧速率,但没有压缩伪像。实际上,通常可以以与例如其中相同的方式改变流格式(例如,改变为未压缩的YUV)。决议改变了。是否实际可能取决于

  • 硬件支持的模式,
  • 低级驱动程序支持哪些模式(通常是通用USB视频类/ UVC驱动程序),
  • 后一种模式中的哪一种通过所涉及的各种框架(例如Video for Windows / DirectX / Video4Linux2等)和
  • 最后在OpenCV中使用视频捕获后端支持哪些。

不幸的是,后者的答案只是。 OpenCV有18个(!)不同的捕获后端(针对各种平台,例如移动电话,OS X,Windows和Linux,通常是针对不同版本的底层框架的几个),尽管似乎有一个用于更改流格式的API [ 1],它似乎没有被任何后端实现。 : - (

如果您或其他任何人想要解决此问题,您可能需要查看我打开的OpenCV问题:http://code.opencv.org/issues/3007

在我的情况下,我调查了一些Logitech网络摄像头,它甚至具有Windows和Linux低级驱动程序所暴露的不同功能。在Linux下,我在不知不觉中使用了OpenCV的GStreamer后端,这意味着另一层次的间接 - 在底层它总是归结为V4L(Linux视频)内核API。使用libv4l后端改进了一些东西,因为它具有默认为某种YUV流格式的良好属性(尽管可能更低的帧速率,这在其他上下文中可能是不合需要的)。 (甚至可以different, diverging backends直接访问v4l内核API或通过libv4l。)

[1]请参阅API文档中的CV_CAP_PROP_FORMAT:http://opencv.willowgarage.com/documentation/cpp/reading_and_writing_images_and_video.html