从网络摄像头获取帧的最快方法

5
我有一个小问题需要在C++(Visual Studio)中开发我的程序 - 现在我正在努力连接多个网络摄像头(通过USB电缆连接),为每个摄像头创建单独的线程来捕获帧,并为处理图像创建单独的帧。
我使用OpenCV来处理帧,但问题是我无法达到摄像头的最高性能(它支持25 fps,但我只能得到18 fps),是否有一些库可以用来获取帧,然后使用OpenCV处理它们以更快地捕获帧?
我进行了一些研究,最流行的方法是使用DirectShow获取帧并使用OpenCV处理它们。
你同意吗?或者你有其他解决方案?如果有链接也不会冒犯。
2个回答

6
  1. DirectShow is only used, if you open your capture using the CV_CAP_DSHOW flag, like:

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

    (without it, it defaults to vfw )

  2. the capture already runs in a separate thread, so wrapping it with more threads won't give you any gain.

  3. another obstacle with multiple cams is the usb bandwidth, so if you got ports on the back & the front of your machine, dont plug all your cams into the same port/controller else you just saturate it


谢谢您提供的信息,但我并不打算创建不必要的线程,只是修改现有的线程,以便尽快获得解决方案。 - user2058851
但是关于USB带宽的信息确实非常有用。 - user2058851

4

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

另一个导致低帧率的典型问题是慢同步处理延迟捕获。您可以通过将微不足道的处理置于相同的捕获循环中,并与启用处理的操作进行比较,从而通常可以识别出这一点并看到更高的FPS。


非常感谢您提供的信息,我不想挑剔,但您能否为我提供在C++中使用Directshow捕获帧而不需要任何不必要过滤器的示例代码? - user2058851
最简单的(不是最好的,但仍然是最简单的!)方法是创建这样一个链:Capture Filter -> Sample Grabber Filter -> Null Renderer Filter。所有三个都是标准的,而且有很多示例代码可用。第一个对应于相机,您可以在其上设置捕获格式,第二个是您设置回调以接收单个帧的地方。所有这些都将使您的代码为来自相机的每个帧调用。 - Roman R.
你可以查看VideoCapture.lib的源代码,这是opencv在此处使用的内容:[https://github.com/ofTheo/videoInput/tree/master/videoInputSrcAndDemos/libs/videoInput] - berak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接