【问题标题】:OpenCV-Python: How to get latest frame from the live video stream or skip old onesOpenCV-Python:如何从实时视频流中获取最新帧或跳过旧帧
【发布时间】:2017-12-31 19:37:50
【问题描述】:

我已在 Python 中将 IP 摄像头与 OpenCV 集成,以便从实时流中逐帧完成视频处理。我已将相机 FPS 配置为 1 秒,这样我就可以在缓冲区中每秒获得 1 帧来处理,但我的算法需要 4 秒来处理每一帧,导致缓冲区中未处理的帧停滞不前,随着时间的推移不断增长 &造成指数级延迟。为了解决这个问题,我又创建了一个线程,我正在调用 cv2.grab() API 来清理缓冲区,它将指针移动到每次调用中的最新帧。在主线程中,我调用了retrieve() 方法,它为我提供了第一个线程抓取的最后一帧。通过这种设计,帧停滞问题得到了解决,指数延迟也被消除了,但仍然无法消除 12-13 秒的恒定延迟。我怀疑当 cv2.retrieve() 被调用时,它没有得到最新的帧,而是最新帧的第 4 帧或第 5 帧。 OpenCV 中是否有任何 API 或任何其他设计模式来解决此问题,以便我可以获取最新的帧来处理。

【问题讨论】:

标签: python opencv video-streaming video-processing ip-camera


【解决方案1】:

如果您不介意牺牲速度。 你可以创建一个 python 生成器来打开相机并返回帧。

def ReadCamera(Camera):
    while True:
        cap = cv2.VideoCapture(Camera)
        (grabbed, frame) = cap.read()
        if grabbed == True:
            yield frame

现在当你想处理帧时。

for frame in ReadCamera(Camera):
      .....

这工作得很好。除了打开和关闭相机会加起来。

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 2016-07-15
    • 2020-02-06
    • 2018-02-16
    • 2016-02-13
    • 1970-01-01
    • 2018-03-09
    相关资源
    最近更新 更多