首页 > 解决方案 > OpenCV如何抓取实时帧而不是下一帧?

问题描述

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

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

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

当我从 rtsp 捕获时,有什么想法可以设法始终获取当前帧吗?

谢谢!

标签: opencvreal-timertsp

解决方案


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

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

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

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

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


推荐阅读