【问题标题】:How to maintain constant FPS when grabbing frames with opencv and python?使用opencv和python抓取帧时如何保持恒定的FPS?
【发布时间】:2019-11-07 15:08:31
【问题描述】:

我正在使用 OpenCV4 和 python 3 打开一个网络摄像头,抓取帧并将它们显示在一个窗口中,就像提供的第一个代码教程 here 一样。但是,抓取不同的帧需要不同的时间:有时抓取需要 0.01 秒,有时需要 0.33 秒,这会在窗口中显示帧时产生延迟。

有没有办法在抓取帧时强制固定时间,这样我就可以看到视频没有延迟?我认为 OpenCV 会发生这种情况,因为当我使用默认的 windows 相机查看器来查看时它正常显示的视频。

我已经尝试过使用time.sleep() 等待一段时间,然后再次抓取帧。但这无济于事。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

【问题讨论】:

  • 我认为没有任何方法可以完成您所描述的内容。你能录制视频然后处理吗?
  • 很遗憾,我无法录制视频。我需要用户实时看到网络摄像头的视频。

标签: python opencv webcam video-capture webcam-capture


【解决方案1】:

一种可能的方法是在循环中设置时间戳并跟踪显示最后一帧的时间。例如,只有经过一定时间后,您才会显示框架。同时,您不断读取帧以保持缓冲区为空,以确保您拥有最新的帧。您不想使用time.sleep(),因为它会冻结程序并且不会保持缓冲区为空。一旦时间戳命中,您将显示帧并重置时间戳。

import cv2
import time

cap = cv2.VideoCapture(0)

# Timeout to display frames in seconds
# FPS = 1/TIMEOUT 
# So 1/.025 = 40 FPS
TIMEOUT = .025
old_timestamp = time.time()

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    if (time.time() - old_timestamp) > TIMEOUT:
        # Display the resulting frame
        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        old_timestamp = time.time()

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

【讨论】:

    【解决方案2】:

    我最近偶然发现了这个问题。我没有使用 OpenCV 的帧捕获,而是设置了一个单独的进程 - 使用 ffmpeg 捕获并将它们写入 ramdisk。

    Python 的看门狗使我能够收到更新通知并启动 OCR 进程。

    事实证明,在控制捕获方面具有很多粒度,速度更快、效率更高。

    【讨论】:

    • 您能详细解释一下您提出的解决方案吗?你有 Python 看门狗的示例代码吗?谢谢
    【解决方案3】:

    当正常工作时,此应用程序将在 read() 调用时暂停,直到来自流式网络摄像头的下一帧可用。流畅的显示取决于能够在不到 1/FPS 秒内执行您添加到循环中的任何内容。它还取决于相机是否符合 UVC,并且可能取决于 MJPEG 的编码算法,这是大多数网络摄像头的情况。然而,您看到延迟高达 1/3 秒的事实很奇怪,因为这是 mpeg 或其他帧间编码器的典型 GOP 周期。

    如果以上都不适用于您的情况,那么我怀疑问题与平台有关,而不是 OCV 问题。您是否尝试在另一个系统上复制该问题?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-08
      • 2021-12-23
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      相关资源
      最近更新 更多