我有一个能够支持1080p 30fps的网络摄像头,我已经使用VirtualDub预览并保存了网络摄像头本身的视频。
出于某种原因,OpenCV只会给我大约4FPS,CPU没有最大化任何内核,所以我不明白为什么? (这实际上并没有实际输出Feed,只是获取帧)。
有OpenCV经验的人知道为什么吗?可能是因为OpenCV没有使用DirectShow从网络摄像头读取(假设DirectShow是你需要的30fps / 1080p - 我相信这是virtualdub使用的)。 OpenCV将图像读入其专有数据类型Mat
的事实是否会成为瓶颈?
我的相机是Microsoft LifeCam Studio,我的操作系统是带有Visual Studios 2010的Windows 7。
有没有人有任何想法?
答案 0 :(得分:2)
解决方案是确保捕获格式(DirectShow术语中的媒体类型)是压缩视频,并在软件中进行解压缩。
答案 1 :(得分:2)
正如Roman所指出的,大多数网络摄像头的默认模式是 MJPEG-compression ,以降低需要通过USB连接的数据速率(和可能是USB集线器等)和/或最大化可用的帧速率/分辨率。
对于计算机视觉,这通常是不合需要的,因为我们宁愿更低的帧速率,但没有压缩伪像。实际上,通常可以以与例如其中相同的方式改变流格式(例如,改变为未压缩的YUV)。决议改变了。是否实际可能取决于
不幸的是,后者的答案只是无。 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