我在Python中集成了一个IP摄像机和OpenCV,以便从实时流中逐帧完成视频处理。我将摄像机FPS配置为1秒,以便我可以在缓冲区中每秒处理1帧,但我的算法需要4秒来处理每帧,导致缓冲区中未处理帧的停滞,随着时间的推移而不断增长,导致指数延迟。为了解决这个问题,我已经创建了一个线程,在那里我调用cv2.grab()API来清理缓冲区,它在每次调用中将指针移动到最新帧。在主线程中,我调用retrieve()方法,它给我第一个线程抓取的最后一帧。通过这种设计,帧停滞问题得到了解决,指数延迟被消除,但是仍然无法消除12-13秒的恒定延迟。我怀疑当cv2.retrieve()被调用时它没有得到最新的帧,但是从最新的帧的第4或第5帧。OpenCV中是否有任何API或任何其他设计模式来解决这个问题,以便我可以获得最新的帧,过程
2条答案
按热度按时间vecaoik11#
如果你不介意在速度上妥协,你可以创建一个python生成器来打开相机并返回frame。
现在,当你想处理帧。
这工作得很好。除了打开和关闭相机会增加时间。
qf9go6mv2#
实现这一点的最好方法是使用线程,下面是我的代码。