使用 OpenCV 的 VideoCapture 从网络摄像头捕获 mjpeg 视频流可能会导致明显的延迟,如果捕获线程读取帧的速率低于网络摄像头输入的帧速率。这是由于捕获缓冲区中的帧累积直至缓冲区被刷新所致。
要手动刷新捕获缓冲区,可以设置 VideoCapture 对象的 CV_CAP_PROP_BUFFERSIZE 属性。这将限制内部缓冲区中存储的帧数。但是,此选项仅支持某些后端硬件。
如果设置缓冲区大小无法解决问题,您可以使用 hackaround 技术。它涉及重复查询帧,直到检索帧所花费的时间超过特定阈值。如果检索时间异常低,则表明该帧是从缓冲区获取的,应该被丢弃。
另一个 hackaround 解决方案是创建一个单独的线程来连续抓取帧以高速保持捕获缓冲区为空。该线程应使用 cv::VideoCapture.grab() 函数以避免抓取帧时的开销。您可以使用同步技术来确保工作线程以受控方式从缓冲区读取帧。
以上是如何解决 OpenCV 中捕获缓冲区已满导致的视频捕获滞后问题?的详细内容。更多信息请关注PHP中文网其他相关文章!