我在C++(Visual studio)中开发我的一个程序时遇到了一点问题-现在我正在努力连接多个网络摄像头(通过usb电缆连接),为每个摄像头创建单独的线程来捕获帧,并为处理图像创建单独的帧。
我使用OpenCV来处理帧,但问题是我没有获得网络摄像头的最高可能性(它支持25帧/秒,我只有18帧)。有没有一些库可以用来获取帧,而不是用OpenCV处理它们,这样可以更快地捕捉帧?
我做了一些研究,最流行的方法是使用directshow来获取框架,并使用OpenCV来处理它们。
你同意吗?或者你有其他解决方案吗?我不会被一些链接冒犯:)
-
只有当您使用CV_CAP_DSHOW标志,如:
VideoCapture capture( CV_CAP_DSHOW + 0 ); // 0,1,2, your cam id there
(没有它,它默认为vfw)
-
捕获已经在一个单独的线程中运行,所以用更多的线程包装它不会给您带来任何好处。
-
多个摄像头的另一个障碍是usb带宽,所以如果你在背面有端口&在你的机器前面,不要把所有的摄像头都插入同一个端口/控制器,否则你只会让饱和
OpenCV使用DirectShow。直接使用DirectShow(Windows中的主要视频捕获API)显然会获得同等或更好的性能(如果OpenCV设置为使用Windows视频,则更可能如此)。USB摄像头通常会达到USB带宽,从而达到帧速率限制,使用DirectShow以压缩格式或具有较少位/像素的格式进行捕获是在相同USB带宽限制内达到更高帧速率的方法。
造成低帧速率的另一个典型问题是延迟捕获的缓慢同步处理。您通常通过将琐碎的处理放入相同的捕获循环中,并看到与启用处理的操作相比更高的FPS来识别这一点。