【问题标题】:OpenCV how to grab the real time frame and not the next frame?OpenCV如何抓取实时帧而不是下一帧?
【发布时间】:2020-07-23 00:31:07
【问题描述】:

我意识到,当我使用 OpenCV 在 rtsp url 中抓取视频 (cv2.VideoCapture('rtsp://...')) 时,实际上我得到的是流的每一帧,而不是实时帧。

示例:如果视频具有 30fps 和 10 秒长,如果我获得第一帧并等待 1 秒以获取下一帧,我将获得第 2 帧而不是实时帧(它应该是第 30 帧或31).

我担心这些,因为如果我的代码需要更长的时间来进行视频处理(深度学习卷积),结果总是会延迟而不是实时传递。

当我从 rtsp 捕获时,我如何设法始终获取当前帧?

谢谢!

【问题讨论】:

  • 有可能使用抓取和接收功能,但这不适用于所有设备(不确定原因)。通常,最可靠的方法是在单独的线程中运行捕获,以尽可能快地捕获所有帧,并丢弃所有不会被处理的帧。
  • 您可以为此使用 Apache Kafka 或 RabbitMQ 等数据摄取工具

标签: opencv real-time rtsp


【解决方案1】:

这与代码无关。许多 IP 摄像机为您提供编码输出(H.265/H.264)。

当你使用VideoCapture()时,相机的输出数据由CPU解码。你提到的延迟,比如 1 秒到 2 秒之间是正常的。

可以做些什么来让它更快:

  1. 如果您有 GPU 硬件,则可以通过它对数据进行解码。这 会给你很好的结果(根据使用经验 最新版本的 NVIDIA gpus:您将获得近 25 毫秒 延迟)要在您的代码上实现这一点,您需要:

  2. 您可以将VideoCapture() 与 FFMPEG 标志一起使用,FFMPEG 具有解码编码数据的高级方法,这可能会为您提供使用 CPU 可以获得的最快输出。 但这不会减少太多时间。

【讨论】:

  • 感谢尤努斯的回答,但我并不担心速度。当我阅读它时,我担心获得实时帧而不是序列中的帧(捕获的最后一帧的下一帧)。我认为上面的 cmets 可能有助于解决(在单独的线程中阅读)。问候!
猜你喜欢
  • 1970-01-01
  • 2012-09-24
  • 2019-05-26
  • 2021-12-03
  • 2018-02-04
  • 2019-11-17
  • 2021-12-28
  • 2013-09-29
  • 1970-01-01
相关资源
最近更新 更多