delay - 抓取新网络摄像头图像时的 OpenCV VideoCapture/V4L2 延迟

标签 delay webcam video-capture latency v4l2

对于我正在从事的计算机视觉项目,我需要使用 Logitech C920 网络摄像头抓取图像。我正在使用 OpenCV 的 VideoCapture 来做到这一点,但我面临的问题是我在某个时刻拍摄的图像没有显示相机看到的最新内容。也就是说,如果我在时间戳 t 处拍摄图像,它会显示相机在时间戳 (t - delta) 处看到的内容。

我通过编写一个程序来增加计数器并将其显示在屏幕上。我将相机对准屏幕并让它记录。当计数器达到某个值(例如 10000)时,它会抓取图像并以文件名“counter_value.png”(例如 10000.png)保存。这样我就可以将计数器的当前值与相机看到的当前值进行比较。我注意到大多数时候延迟在4-5帧左右,但这不是一个固定值。

我看到了有关此问题的类似帖子,但没有一个真正有帮助。有些人建议将帧抓取例程放入单独的线程中并更新“current_frame”Mat 变量。我尝试过,但由于某种原因问题仍然存在。其他人提到相机在 Windows 上运行良好(但我需要使用 Linux)。我尝试在 Windows 上运行相同的代码,确实延迟只有大约 1 帧(这也可能是相机没有看到计数器,因为屏幕更新得不够快)。

然后,我决定运行一个仅基于 V4L2 代码的简单网络摄像头查看器,认为问题可能来自 OpenCV。我再次经历了相同的延迟,这让我相信驱动程序正在使用某种缓冲区来缓存图像。

我是V4L2的新手,我确实需要尽快解决这个问题,所以我向你们提出的问题是:

  1. 有人找到了使用 V4L2(也许还有 OpenCV)获取最新图像的解决方案吗?
  2. 如果使用 V4L2 无法解决这个问题,有谁知道在 Linux 上解决此问题的另一种方法吗?

问候,

米海

最佳答案

看起来在 VideoCapture::grab() 调用和实际拍摄帧之间总会有延迟。这是因为帧缓冲是在硬件/SO 级别完成的,您无法避免这一点。

OpenCV 提供了 VideoCapture::get( CV_CAP_PROP_POS_MEC) ) 方法来为您提供捕获帧的准确时间,但这只有在相机支持的情况下才有可能。

最近在V4L OpenCV实现中发现了一个问题: http://answers.opencv.org/question/61099/is-it-possible-to-get-frame-timestamps-for-live-streaming-video-frames-on-linux/

几天前,修复已被撤回: https://github.com/Itseez/opencv/pull/3998

最后,如果您有正确的设置,您可以知道拍摄一帧的时间(从而进行补偿)。

关于delay - 抓取新网络摄像头图像时的 OpenCV VideoCapture/V4L2 延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27290666/

相关文章:

php - 网络连接在 php 录像机中连接失败

c# - 在 UWP 应用程序中访问网络摄像头被拒绝

c++ - 将 CMSampleBufferRef 转换为 cv::Mat

c# - 是否有可能 "spoof"网络摄像头提要?

java - Red5通信延迟

objective-c - iOS -> setNavigationBarHidden 延迟

Android Sleep/Wait/Delay 函数

c++ - 虚拟机上的opencv视频捕获和摄像头访问

macos - 打开内置的Macbook Pro相机时出错

c++ - 依赖溢出有危险吗?