python - 如何使用 python 和 opencv 在实时流中获取当前帧?
问题描述
我正在做一些实时的计算机视觉工作,比如实时流检测。
检测部分耗时约0.3s/帧。但视频 FPS 更高,可能 15 或 30 FPS。
所以,在我现在的工作中,我使用
cap = cv2.VideoCapture("rtsp url")
ret, frame = cap.read()
获取第一帧,然后在检测过程之后,我将获取新帧并进行检测。
但检测过程耗时约0.3s,
那么在完成检测(0.3s)后如何获取当前帧?
不是我刚刚检测到的帧。
解决方案
您好先生,据我了解,您的问题可以解释如下。
- 打开视频链接(有 15 FPS 或 30 FPS)
- 读取最后一帧 (X) 并保存到当前帧
- 将当前帧 (X) 发送到检测过程
- 继续阅读,使当前帧变为 (X + t) (t > 1)
- 当检测过程完成后,发送当前帧(X + t)
我认为您的问题是,目前,检测过程正在阻止您的主进程。这使得当前帧不是 (X + t) 而是 (X + 1) 。
所以你在这里有两个选择:
- 将您的视频捕获过程和检测过程分开,以便每个过程都可以运行而不会相互阻塞。这个非常难
不要将视频捕获过程和检测过程分开。而是设置下一个阅读框的位置。这很容易。视频文件位于:https ://docs.opencv.org/3.1.0/d8/dfe/classcv_1_1VideoCapture.html#a8c6d8c2d37505b5ca61ffd4bb54e9a7c
计算下一帧位置
t = ....
设置框架位置
cap.set(cv2.CAP_PROP_POS_FRAMES, t)
- 然后阅读
ret, frame = cap.read()
希望有所帮助
推荐阅读
- delphi - 我正在尝试替换加载到 TChromium 的 PDF 文件中的工具提示占位符 $i18n{tooltipZoomOut}
- typescript - Typescript - 基于参数可选属性的条件返回类型
- c++ - 重载函数模板
- c++ - c ++互斥锁不会从内部阻止代码,但允许从外部阻止它
- azure-log-analytics - Azure Sentinel - 如何将 ESET 日志获取到 eset_CL
- python - 使用 Django 在页面加载之间保持文件内容
- c++ - 访问向量内、另一个对象内、超出范围的对象成员
- javascript - 无法通过 https 读取未定义的属性“getusermedia”
- java - JTextArea 参数和用户输入问题
- python - 在 FastAPI 中只初始化一次繁重服务的最佳方法