首页 > 解决方案 > 如何使用 python 和 opencv 在实时流中获取当前帧?

问题描述

我正在做一些实时的计算机视觉工作,比如实时流检测。

检测部分耗时约0.3s/帧。但视频 FPS 更高,可能 15 或 30 FPS。

所以,在我现在的工作中,我使用

cap = cv2.VideoCapture("rtsp url")
ret, frame = cap.read()

获取第一帧,然后在检测过程之后,我将获取新帧并进行检测。

但检测过程耗时约0.3s,

那么在完成检测(0.3s)后如何获取当前帧?

不是我刚刚检测到的帧。

标签: pythonopencv

解决方案


您好先生,据我了解,您的问题可以解释如下。

  1. 打开视频链接(有 15 FPS 或 30 FPS)
  2. 读取最后一帧 (X) 并保存到当前帧
  3. 将当前帧 (X) 发送到检测过程
  4. 继续阅读,使当前帧变为 (X + t) (t > 1)
  5. 当检测过程完成后,发送当前帧(X + t)

我认为您的问题是,目前,检测过程正在阻止您的主进程。这使得当前帧不是 (X + t) 而是 (X + 1) 。

所以你在这里有两个选择:

  1. 将您的视频捕获过程和检测过程分开,以便每个过程都可以运行而不会相互阻塞。这个非常难
  2. 不要将视频捕获过程和检测过程分开。而是设置下一个阅读框的位置。这很容易。视频文件位于:https ://docs.opencv.org/3.1.0/d8/dfe/classcv_1_1VideoCapture.html#a8c6d8c2d37505b5ca61ffd4bb54e9a7c

    1. 计算下一帧位置

      t = ....

    2. 设置框架位置

    cap.set(cv2.CAP_PROP_POS_FRAMES, t)

    1. 然后阅读

    ret, frame = cap.read()

希望有所帮助


推荐阅读