对于我正在处理的计算机视觉项目,我需要使用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的新手,我真的需要尽快解决这个问题,所以我对你们的问题是:
有没有人找到使用V4L2(也许是OpenCV)获取最新图像的解决方案?
如果使用V4L2无法解决问题,有没有人知道在Linux上修复此问题的另一种方法?
问候,
米哈伊