4

我有一个能够达到 1080p 30fps 的网络摄像头,我已经通过使用 VirtualDub 来预览和保存来自网络摄像头本身的视频进行了确认。

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

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

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

有没有人有任何想法?

4

2 回答 2

2

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

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

于 2012-06-08T10:12:55.430 回答
2

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

对于计算机视觉,这通常是不可取的,因为我们宁愿拥有较低的帧速率,但没有压缩伪影。实际上,通常可以以与例如改变分辨率的方式大致相同的方式来改变流格式(例如到未压缩的YUV)。这对你来说是否真的可行取决于

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

不幸的是,后者的答案是none。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

于 2015-01-01T20:48:25.000 回答