opencv - OpenCV如何抓取实时帧而不是下一帧?
问题描述
我意识到,当我使用 OpenCV 在 rtsp url 中抓取视频 (cv2.VideoCapture('rtsp://...')) 时,实际上我得到的是流的每一帧,而不是实时帧。
示例:如果视频有 30fps 和 10 秒长,如果我获得第一帧并等待 1 秒再获得下一帧,我会得到第 2 帧而不是实时帧(它应该是第 30 帧或第 31 帧)。
我担心这些,因为如果我的代码需要更长的时间来进行视频处理(深度学习卷积),结果总是会稍后而不是实时传递。
当我从 rtsp 捕获时,有什么想法可以设法始终获取当前帧吗?
谢谢!
解决方案
这与代码无关。许多 IP 摄像机为您提供编码输出(H.265/H.264)。
使用时VideoCapture()
,相机的输出数据由CPU解码。正如您所提到的,例如在 1 秒到 2 秒之间出现延迟是正常的。
可以做些什么来使它更快:
如果您有 GPU 硬件,则可以通过它对数据进行解码。这将为您提供非常好的结果(根据使用最新版本的 NVIDIA gpus 的经验:您将获得近 25 毫秒的延迟)要在您的代码上实现这一点,您需要:
- CUDA 安装
- CUDA 启用 OpenCV 安装
- OpenCV 的VideoReader 类
您可以使用
VideoCapture()
FFMPEG 标志,FFMPEG 具有解码编码数据的高级方法,这可能会为您提供使用 CPU 可以获得的最快输出。但这不会减少太多时间。
推荐阅读
- javascript - 如何使用方法更改复选框的状态?
- javascript - 在Javascript中设置下拉值
- python - Python请求库无助于获取正确的网页
- php - AWS Laravel 单元测试 - 请求中包含的安全令牌无效
- logging - 如何在运行时更改apache flink的日志级别
- botframework - bot 在 Microsoft Teams 中发送自适应卡时更改通知文本?
- python - 从作为字符串的输入计算平均值
- list - 当我更改模型值时,所有模型值都会更改吗?
- azure-active-directory - 启用 MFA 时如何以非交互方式连接到 azuread 模块?
- excel - VBA 错误显示对象变量或未设置块变量错误