【发布时间】:2017-12-31 19:37:50
【问题描述】:
我已在 Python 中将 IP 摄像头与 OpenCV 集成,以便从实时流中逐帧完成视频处理。我已将相机 FPS 配置为 1 秒,这样我就可以在缓冲区中每秒获得 1 帧来处理,但我的算法需要 4 秒来处理每一帧,导致缓冲区中未处理的帧停滞不前,随着时间的推移不断增长 &造成指数级延迟。为了解决这个问题,我又创建了一个线程,我正在调用 cv2.grab() API 来清理缓冲区,它将指针移动到每次调用中的最新帧。在主线程中,我调用了retrieve() 方法,它为我提供了第一个线程抓取的最后一帧。通过这种设计,帧停滞问题得到了解决,指数延迟也被消除了,但仍然无法消除 12-13 秒的恒定延迟。我怀疑当 cv2.retrieve() 被调用时,它没有得到最新的帧,而是最新帧的第 4 帧或第 5 帧。 OpenCV 中是否有任何 API 或任何其他设计模式来解决此问题,以便我可以获取最新的帧来处理。
【问题讨论】:
-
当你的算法消耗的速度比信息产生的速度慢时,为什么你需要一个大的缓冲区。我的建议是使用只有两个图像插槽的缓冲区。从相机写入(写入缓冲区,仅一张图像)和其他读取以进行处理(读取缓冲区,仅一张图像)的一种。覆盖来自相机的新图像上的写入缓冲区。
-
@harshkn 你能告诉我如何减少缓冲区大小吗?我在 Ubuntu 16.04 的 Raspberry Pi 上尝试了“video.set(cv2.CAP_PROP_BUFFERSIZE, 1)”。结果显示一条消息“VIDEOIO ERROR: V4L2: setting property #38 is not supported True”
-
c++ - OpenCV VideoCapture lag due to the capture buffer - Stack Overflow 中有一些很好的答案和详细的解释(和解决方法); 然而答案在 C++ 中,您必须将其移植到 Python。
标签: python opencv video-streaming video-processing ip-camera