对于我正在进行的计算机视觉项目,我需要使用Logitech C920网络摄像头抓取图像。我使用OpenCV的视频捕获来实现这一点,但我面临的问题是,我在某个时刻拍摄的图像没有显示相机看到的最新情况。也就是说,如果我在时间戳t处拍摄一张图像,它显示了相机在时间戳(t-delta)处看到的东西,也就是说。
为此,我编写了一个程序,使计数器递增并在屏幕上显示。我把相机对准屏幕,让它录下来。当计数器达到某个值(比如10000)时,它会抓取一个图像并用文件名“counter_value.png”(例如10000.png)保存它。通过这种方式,我能够将计数器的当前值与相机看到的当前值进行比较。我注意到,大多数时间延迟约为4-5帧,但它不是一个固定值。
我看到了类似的关于这个问题的帖子,但没有一个真正有所帮助。有些人建议将帧抓取例程放入一个单独的线程中,并更新一个“current_frame”垫变量。我试过了,但出于某种原因,这个问题仍然存在。有人提到相机在视窗系统上运行良好(但我需要使用Linux)。我尝试在Windows上运行相同的代码,实际上延迟只有大约1帧(这也可能是因为屏幕更新不够快,所以相机没有看到计数器)。
然后,我决定只基于V4L2代码运行一个简单的网络摄像头查看器,认为问题可能来自OpenCV。我再次经历了同样的延迟,这让我相信驱动程序正在使用某种缓冲区来缓存图像。
我是V4L2新手,我真的需要尽快解决这个问题,所以我想问你们的问题是:
祝好
米哈伊
可能问题出在Linux的UVC驱动上,但我一直在Ubuntu 12.04和14.04机器上使用微软LifeCam Cinemas进行机器视觉,没有看到4-5帧延迟。不过,我在弱光条件下操作它们,在这种情况下,它们将帧率降低到7.5 fps。
另一个可能的罪魁祸首是网络摄像头的延迟,这取决于所使用的格式。C920似乎支持H.264(很少有网络摄像头支持),因此罗技可能已经尽了最大努力使其工作良好,但OpenCV似乎不支持Linux上的H.264;请参阅此答案,了解其支持的格式。同样的问题也有一个内核破解的答案(!)修复UVC驱动程序的问题。
PS:为了检查我的案例中实际使用的格式,我添加了
fprintf(stderr, ">>> palette: %d\n", capture->palette);
在OpenCV代码的这一行。
它看起来像是将始终有一个延迟之间的VideoCapture::抓取()
调用和实际采取的帧。这是因为帧缓冲是在硬件/SO级别完成的,您无法避免这种情况。
OpenCV提供了VideoCapture::get(CV\u CAP\u PROP\u POS\u 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
最后,如果您有正确的设置,您可以知道拍摄帧的时间(并因此进行补偿)。
问题内容: 如何连续从摄像头捕获图像? 我想尝试对象识别(也许使用Java Media Framework)。 我当时正在考虑创建两个线程 一个线程: 节点1:捕获实时图像 节点2:将图片另存为“ 1.jpg” 节点3:等待5秒 节点4:重复… 其他线程: 节点1:等到捕获图像 节点2:使用“ 1.jpg”获取每个像素的颜色 节点3:将数据保存在数组中 节点4:重复… 问题答案: 此JavaCV实
本文向大家介绍FFmpeg获取网络摄像头数据解码,包括了FFmpeg获取网络摄像头数据解码的使用技巧和注意事项,需要的朋友参考一下 对USB摄像头实时编码,在前面已经探讨过了。这次改变下思路,尝试去截取网络摄像头的H264码流,将其解码播放。 这里的测试代码,是在海康摄像头的基础上进行的。 解码的大致流程和以前的保持一致,只不过增加了部分函数。 FFmpeg打开媒体文件并查看媒体文件的信息,有三个
我一直在开发一些视频应用程序使用USB网络摄像头和v4l2 API。该API提供了大量的ioctl()调用来枚举综合能力、视频标准、像素颜色格式等。但是没有ioctl()来列举USB网络摄像头支持的所有可能的图像大小。 这样做的首选方式是什么? API留档表示您可以设置特定的图像大小,ioctl()将返回最接近的匹配。所以我想我可以尝试所有可能的图像大小,看看USB网络摄像头是否拒绝它。但是,当有
我目前正在做一个项目,从网络摄像头捕捉视频,并通过UDP发送编码流来做实时流。 有人说从cap.read得到的帧已经是解码帧,我不知道这是如何以及何时发生的。我想要的是编码的帧或流。我应该怎么做才能得到它?我应该再编码一次吗?
我的jfreeChart来自网络摄像头的帧。我通过这个框架,它生成一个图形的R,G和B颜色的这个框架。我想这个图表做自动更新,因为我通过帧。我什么都试过了,但都没用。 }
我正在开发一个web应用程序,它可以浏览和拍摄本地照片,我还想通过相机拍摄图像。我使用下面的代码,我可以捕捉设备摄像头。 现在,我想获得图像和onchangeevent,转换为base64,并希望在该页面中显示。 好心帮我伙计们!