2013-02-10 128 views
3

我在C++(Visual Studio)开发我的一个程序时遇到了一点问题 - 现在我正在努力与多个网络摄像头连接(通过USB线连接),为每个它们将线程分开以捕获帧,并分离用于处理图像的帧。我使用OpenCV来处理帧,但问题是,我没有得到一个网络摄像头的可能性的高峰(它支持25帧,我只得到18)有一些库,我可以用来获取帧,比处理它们使用OpenCV可以更快地捕获帧?从网络摄像头获取帧的最快方法

我正在研究一下,最流行的方法是使用directshow来获取帧和OpenCV来处理它们。

你同意吗?或者你有另一种解决方案? 我不会被一些链接冒犯:)

回答

3

OpenCV使用DirectShow。直接使用DirectShow(Windows中的主要视频捕获API)显然会使您获得同等或更好的性能(如果OpenCV设置为使用Windows视频,则更有可能)。 USB摄像头通常会达到USB带宽,因此会限制帧速率,使用DirectShow以压缩格式或较少比特/像素的格式进行采集是在相同USB带宽限制内达到更高帧速率的方法。

导致低帧率的另一个典型问题是延迟捕获的慢同步处理。您通常通过将平凡的处理放入同一个捕获循环并与处理启用的操作相比看到更高的FPS来识别这一点。

+0

非常感谢您提供的信息,我不想挑剔,但是您能否向我提供使用Directshow捕获帧的示例代码,而在C++中没有任何不必要的过滤器? – user2058851 2013-02-12 17:30:02

+0

最简单的(不是最好的,但仍然是最简单的!)就是制作一个这样的链:'Capture Filter' - >'Sample Grabber Filter' - >'Null Renderer Filter'。所有这三个都是标准的,并且有很多示例代码。第一个对应于一个摄像头,你设置捕获格式,第二个是你设置你的回调接收单个帧的位置。所有这一切都会让你的代码从相机的每一帧中调用。 – 2013-02-12 19:35:21

+0

你可以看看VideoCapture.lib的src,这是opencv在这里使用的:[https://github.com/ofTheo/videoInput/tree/master/videoInputSrcAndDemos/libs/videoInput] – berak 2013-02-12 19:39:03

5
  1. DirectShow是仅使用,如果您使用 CV_CAP_DSHOW标志来打开你的捕捉,如:

    VideoCapture capture(CV_CAP_DSHOW + 0); // 0,1,2, your cam id there 
    

    (如果没有它,则默认为VFW)

  2. 捕获已经运行在一个单独的线程中,用更多的线程来包装它并不会带来任何好处。

  3. 有多个摄像头的另一个障碍是USB的带宽,所以如果你的背&机器的前面有口,不要所有的摄像头插入到相同的端口/控制器,否则你只是饱和,它

+0

谢谢你的信息,但我不打算创建不必要的线程,只修改现有的线程,所以我可以得到最快的可能的解决方案。 – user2058851 2013-02-12 17:22:59

+0

但是关于USB带宽的信息确实非常有用 – user2058851 2013-02-12 17:23:43