我有一个网络摄像头,能够1080p 30fps,我已经确认使用VirtualDub预览和保存从网络摄像头本身的视频。
由于某些原因,OpenCV只给我大约4FPS,处理器没有最大限度地使用任何核心,所以我看不到为什么?(顺便说一句,这实际上并没有输出提要,只是获取帧)。
有OpenCV经验的人知道为什么吗?会不会是OpenCV没有使用DirectShow来读取摄像头(假设30fps/1080p需要DirectShow -我相信这就是virtualdub使用的)。OpenCV将图像读取到其专有数据类型Mat中的事实会成为瓶颈吗?
我的相机是,我的操作系统是装有Visual Studios2010的LifeCam 7。
有谁有什么想法吗?
发布于 2012-06-08 18:12:55
30 FPS是通过捕获压缩视频(最有可能是JPEG)实现的。我可能碰巧OpenCV正在切换到捕获原始视频,例如RGB,在这种情况下,有效的FPS受到U盘带宽的限制。4 FPS大约是USB在1920x2080 24位RGB (25 MB/s)中可以推送的数据量。
解决方案是确保捕获格式( DirectShow术语中的媒体类型)是压缩视频,并在软件中进行解压后处理。
发布于 2015-01-02 04:48:25
正如罗曼指出的那样,大多数网络摄像头的默认模式是MJPEG压缩,以降低需要通过USB连接(可能还有USB集线器等)的数据速率。和/或最大化可用的帧速率/分辨率。
对于计算机视觉来说,这通常是不可取的,因为我们宁愿拥有较低的帧率,但没有压缩伪影。实际上,通常可以以与例如改变分辨率几乎相同的方式来改变流格式(例如,改变为未压缩的YUV)。这对你来说是否真的可行取决于
不幸的是,后者的答案是简单的none。OpenCV有18个(!)不同的捕获后端(针对不同的平台,例如手机、OS X、Windows和Linux,通常是针对不同版本的底层框架的几个捕获后端),虽然似乎有一个用于更改流格式的API 1,但似乎没有任何后端实现它。:-(
如果您或其他任何人想要解决此问题,您可能需要检查我打开的关于此问题的OpenCV问题:http://code.opencv.org/issues/3007
在我的案例中,我对一些罗技网络摄像头进行了调查,它们甚至具有Windows和Linux低级驱动程序公开的不同功能。在Linux下,我无意中使用了OpenCV的GStreamer后端,这意味着另一个层次的间接性-在底层,它总是归结为V4L (video for Linux)内核API。使用libv4l后端改进了一些事情,因为这具有默认为某些YUV流格式的良好属性(尽管可能处于较低的帧率,这在其他情况下可能是不可取的)。(甚至有用于直接访问v4l内核API或通过libv4l的different, diverging backends。)
1参见接口文档中的CV_CAP_PROP_FORMAT:http://opencv.willowgarage.com/documentation/cpp/reading_and_writing_images_and_video.html
https://stackoverflow.com/questions/10946857
复制相似问题