Opencv 从网络摄像头获取帧的最快方法 我有一个小问题,我的一个程序在C++(Visual Studio)中开发——现在我正忙于与多个网络连接(通过USB电缆连接),为每个线程创建单独的线程来捕获帧,并为处理图像分离帧。

Opencv 从网络摄像头获取帧的最快方法 我有一个小问题,我的一个程序在C++(Visual Studio)中开发——现在我正忙于与多个网络连接(通过USB电缆连接),为每个线程创建单独的线程来捕获帧,并为处理图像分离帧。,opencv,webcam,Opencv,Webcam,我使用OpenCV来处理帧,但问题是我没有达到网络摄像头的峰值(它支持25 fps,我只有18 fps)是否有一些库可以用来获取帧,而不是使用OpenCV来处理帧,这样可以更快地捕获帧 我做了一些研究,最流行的方法是使用directshow获取帧,并使用OpenCV处理它们 你同意吗?或者你有别的解决办法吗? 我不会被一些链接冒犯:)OpenCV使用DirectShow。直接使用DirectShow(Windows中的初级视频捕获API)将直接获得更好的性能(甚至更可能的是,如果OpenCV被设

我使用OpenCV来处理帧,但问题是我没有达到网络摄像头的峰值(它支持25 fps,我只有18 fps)是否有一些库可以用来获取帧,而不是使用OpenCV来处理帧,这样可以更快地捕获帧

我做了一些研究,最流行的方法是使用directshow获取帧,并使用OpenCV处理它们

你同意吗?或者你有别的解决办法吗?
我不会被一些链接冒犯:)

OpenCV使用DirectShow。直接使用DirectShow(Windows中的初级视频捕获API)将直接获得更好的性能(甚至更可能的是,如果OpenCV被设置为使用Windows的视频)。USB摄像头通常会达到USB带宽,因此会达到帧速率限制,使用DirectShow以压缩格式或更少位/像素的格式进行捕获是在相同USB带宽限制内达到更高帧速率的方法

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

  • 仅当使用打开捕获时才使用DirectShow CV_CAP_DSHOW标志,如:

    VideoCapture capture( CV_CAP_DSHOW + 0 );  // 0,1,2, your cam id there
    
    (没有它,默认为vfw)

  • 捕获已经在一个单独的线程中运行,因此用更多的线程包装它不会给您带来任何好处

  • 多个摄像头的另一个障碍是usb带宽,因此,如果您的机器背面和正面都有端口,请不要将所有摄像头都插入同一端口/控制器,否则会使其饱和


  • 谢谢你提供的信息,但我不打算创建不必要的线程,只修改现有的线程,这样我就可以得到最快的解决方案。但是关于USB带宽的信息将非常有用。感谢这么多的信息,我不想挑剔,但是你能提供我用DirectShow来捕获帧的代码吗?在C++中没有任何不必要的过滤器?最简单的(不是最好的,但还是最简单的)是这样做一个链:<代码>捕获过滤器< /C> > >代码>采样抓取过滤器> /COD> > >代码>空渲染器过滤器< /代码>。这三个都是标准的,并且有很多示例代码。第一个对应于一个相机,您可以在其上设置捕获格式,第二个是设置回调以接收单个帧。所有这一切都将使您的代码在摄像机的每一帧都被调用。您可以查看VideoCapture.lib的src,这就是opencv在这里使用的内容:[