OpenCV 网络摄像头帧率
Posted
技术标签:
【中文标题】OpenCV 网络摄像头帧率【英文标题】:OpenCV webcam frame rate 【发布时间】:2012-06-12 09:29:39 【问题描述】:我有一个能够支持 1080p 30fps 的网络摄像头,我已通过使用 VirtualDub 来预览和保存来自网络摄像头本身的视频来确认这一点。
出于某种原因,OpenCV 只会给我大约 4FPS,CPU 没有使任何内核最大化,所以我不明白为什么? (顺便说一句,这并没有实际输出提要,只是获取帧)。
有OpenCV经验的人知道为什么吗?可能是 OpenCV 没有使用 DirectShow 从网络摄像头读取数据(假设 DirectShow 是 30fps/1080p 所需的 - 我相信这就是 virtualdub 使用的)。 OpenCV 将图像读入其专有数据类型Mat
的事实是否会成为瓶颈?
我的相机是 Microsoft LifeCam Studio,我的操作系统是带有 Visual Studios 2010 的 Windows 7。
有人有什么想法吗?
【问题讨论】:
我也有这个问题。你解决了吗?你能在这里发布一些可能的解决方案吗? 使用 DirectX 进行捕获。 【参考方案1】:30 FPS 是通过捕获压缩视频(最有可能是 JPEG)来实现的。我碰巧 OpenCV 正在切换以捕获原始视频,例如 RGB,在这种情况下,有效 FPS 受到 USB 带宽的限制。 4 FPS 大约是 USB 在 1920x2080 24 位 RGB (25 MB/s) 中可以传输的数据量。
解决方案是确保捕获格式(DirectShow 术语中的媒体类型)是压缩视频,并在软件中进行后解压缩。
【讨论】:
我也遇到了这个问题,想知道是否有人能够在仍然使用 OpenCV 的同时提高视频捕获的速度。【参考方案2】:正如 Roman 指出的,大多数网络摄像头的 默认 模式是 MJPEG 压缩,以降低需要通过 USB 连接的数据速率(以及可能是 USB 集线器等)和/或最大化可用的帧速率/分辨率。
对于计算机视觉,这通常是不可取的,因为我们宁愿拥有较低的帧速率,但没有压缩伪影。实际上,通常可以以与例如分辨率已更改。这对你来说实际上是否可行取决于
硬件支持哪些模式, 低级驱动程序支持哪些模式(通常是通用 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 流格式的良好属性(尽管帧速率可能较低,这在其他情况下可能是不受欢迎的)。 (甚至还有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
【讨论】:
以上是关于OpenCV 网络摄像头帧率的主要内容,如果未能解决你的问题,请参考以下文章