【问题标题】:How do I choose what and how many frames I want to process?如何选择要处理的帧数和帧数?
【发布时间】:2021-04-21 03:42:15
【问题描述】:

我正在研究对象检测,但实时检测非常慢。因此,为了避免处理每一帧,我只想从每 30 帧中提取前 5 帧,然后使用这 5 帧来处理特定功能,然后再为我的对象检测模型拍摄 3 帧。我是 OpenCV 的新手,所以请告诉我如何实现这一目标?

【问题讨论】:

  • 您必须实现自己的数据流。例如。您可以使用 2 个线程,一个用所有图像填充缓冲区,第二个根据您的需要选择、处理和丢弃帧。

标签: opencv machine-learning deep-learning computer-vision


【解决方案1】:

由于您提到实时,我假设您是从相机捕捉。在这种情况下,您可以读取帧,以便将间歇性帧转储,如下例所示。请注意,这与实时保持一致,即使引入了延迟。因此,在这种情况下,您不必选择处理哪些帧,只需处理单个帧并返回视频源即可获得最新的帧。

如果您需要处理每一帧,请考虑@Micka 对您问题的评论。 Here is a good post 创建高效的帧队列。

import cv2
import time

cap = cv2.VideoCapture(0)

while(True):
    # Get frame: notice that you get the most recent frame
    # The frames you miss get dumped
    ret, frame = cap.read()

    # peform some slow operation
    time.sleep(1)

    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

【讨论】:

  • 抱歉,我是计算机视觉的菜鸟,所以我如何在开始执行函数 a 时从 30 帧中取出 5 帧,而对于函数 b 和 c,我将每秒取 3 帧。您能否专门编写代码以满足此要求?
  • 上述方法避免了跳过和抓取特定帧,但如果必须,则 cap.read() 进入队列数据结构,然后从中获取帧。队列将存储每一帧,因此如果您的处理操作较慢,您不会错过任何帧(但您不会是实时的)。
猜你喜欢
  • 1970-01-01
  • 2016-09-15
  • 2019-03-26
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2019-08-07
  • 2017-01-24
  • 1970-01-01
相关资源
最近更新 更多