我已经在 Python 中将 IP 摄像机与 OpenCV 集成在一起,以便从实时流中逐帧完成视频处理。我已将相机 FPS 配置为 1 秒,以便我可以在缓冲区中每秒处理 1 帧,但我的算法需要 4 秒来处理每一帧,导致缓冲区中未处理帧的停滞,随着时间的推移不断增长 &造成指数延迟。为了解决这个问题,我又创建了一个线程,我在其中调用 cv2.grab() API 来清理缓冲区,它在每次调用中将指针移向最新帧。在主线程中,我正在调用 retrieve() 方法,它为我提供了第一个线程抓取的最后一帧。通过这种设计,帧停滞问题得到解决并消除了指数延迟,但仍然无法消除 12-13 秒的恒定延迟。我怀疑当调用 cv2.retrieve() 时它没有获取最新帧,而是从最新帧开始的第 4 或第 5 帧。 OpenCV 或任何其他设计模式中是否有任何 API 可以解决此问题,以便我可以获取最新的帧进行处理。
最佳答案
如果您不介意牺牲速度。 你可以创建一个 python 生成器来打开相机并返回帧。
def ReadCamera(Camera):
while True:
cap = cv2.VideoCapture(Camera)
(grabbed, frame) = cap.read()
if grabbed == True:
yield frame
现在您要处理帧。
for frame in ReadCamera(Camera):
.....
这工作得很好。除了打开和关闭相机会增加时间。
关于python - OpenCV-Python : How to get latest frame from the live video stream or skip old ones,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45310718/