OpenCV-Python:如何从实时视频流中获取最新帧或跳过旧视频流.

Hem*_*sky 10 python opencv video-processing video-streaming ip-camera

我已经在Python中集成了一台带OpenCV的IP摄像头,以便从实时流中逐帧完成视频处理.我已经将相机FPS配置为1秒,这样我就可以在缓冲区中每秒获得1帧处理,但是我的算法需要4秒来处理每个帧,导致缓冲区中未处理帧的停滞,并且会随着时间的推移而不断增长导致指数延迟.为了解决这个问题,我创建了一个Thread,我在调用cv2.grab()API来清理缓冲区,它将指针移动到每个调用中的最新帧.在主线程中,我正在调用retrieve()方法,它给出了第一个Thread抓取的最后一帧.通过这种设计,帧停滞问题是固定的,并且指数延迟被消除,但仍然不能消除12-13秒的恒定延迟.我怀疑当cv2.retrieve()被调用时它没有获得最新的帧,而是来自最新帧的第4或第5帧.OpenCV中是否有任何API或任何其他设计模式来解决此问题,以便我可以获得最新的帧进行处理.

在此先感谢您的帮助.我真的很感激快速反应.

ami*_*r92 2

如果你不介意牺牲速度的话。你可以创建一个Python生成器来打开相机并返回帧。

def ReadCamera(Camera):
    while True:
        cap = cv2.VideoCapture(Camera)
        (grabbed, frame) = cap.read()
        if grabbed == True:
            yield frame
Run Code Online (Sandbox Code Playgroud)

现在当你想要处理帧时。

for frame in ReadCamera(Camera):
      .....
Run Code Online (Sandbox Code Playgroud)

这工作得很好。除了打开和关闭相机会累加时间。


归档时间:

查看次数:

1495 次

最近记录:

6 年,6 月 前