开放式CV视频捕获.检索()使用DSHOW和MJPEG(增加延迟)将fps限制为30秒如何避开它?

2024-09-29 23:21:10 发布

您现在位置:Python中文网/ 问答频道 /正文

基础知识

尝试从Logitech Brio相机(1080p时可支持60fps——在VLC中测试)捕获视频,但我似乎无法通过使用OpenCV VideoCapture获得高于30 fps的视频。在

我的系统设置

关于我拥有和工作的信息:

  • 罗技:Brio Camera
  • 语言:python
  • opencv版本:4.0
  • 带有powershell的Windows10(这是必需的,因为我的主程序与其他基于Windows的应用程序交互)

编解码器相关设置:

  • Fourcc=MJPEG(因为某些原因,其他的不支持我相机所需的分辨率)
  • 以下代码用于打开相机:cv2.VideoCapture(cv2.CAP_DSHOW + 1)

一些背景和代码

我使用了线程方法,如这里所建议的:OpenCV VideoCapture lag due to the capture buffer

基本上,我当前的代码有2个线程:1个用于grab()函数,1个用于retrieve()函数,并将检索到的图像保存为avi。在

运行grab()函数的线程如下所示:

def __frame_grab_worker(self, cap, cameraNumber):
    try:
        while(cap.isOpened()):
            # sync with retrieve
            acquired = self._retrievingLock[cameraNumber].acquire()
            try:
                cap.grab()
            finally:
                self._retrievingLock[cameraNumber].release()
            if(self.interrupt == True):
                break
    finally:
        self._cleanupLock.release()

检索并保存图像的线程如下所示:

^{pr2}$

我试过的东西

我分析了我的代码。一般来说,while look In __record的每个循环之间有大约0.03秒的延迟,相当于每秒30帧。这在cap.retrieve()write和{}函数之间平分。在

我注意到,如果我注释掉对检索到的图像进行任何处理的代码部分(即out.write(frame)cv2.imshow(...)),则{}函数所花费的时间将增加到0.03(从之前的0.15左右)。在

因此,我假设问题是与MJPEG的DSHOW不允许超过30fps有关,或者与底层opencv代码有关。在

我进一步查看了opencv代码库(特别是videoio/src/cap)_显示.cpp&视频/src(amp;V)/上限cpp)找不到任何有用的东西。。。我可能错过了什么。在

如果任何人有一个解决方案或知道任何可以帮助我将不胜感激 提前感谢:)


Tags: 函数代码图像self视频线程cv2opencv

热门问题