opencv USB相机采集同步问题浅析

相机作为一个非独立的传感器与别的设备协同时我们关心从相机获取的图片的系统时间和图像采集的时间之间的关系,就产生了同步的问题。文中讨论的相机,是通用的UVC接口的相机。专用的工业相机通常拥有独立的SDK方便开发者调用,如果图片带有准确的曝光时间的时间戳,同步不存问题。

OPENCV获取相机的图片

获取图像通常是我们做图像处理的第一步,利用OPENCV提供的videocapture获取图片通常有两种做法:

利用read()接口获取

采集过程中大家最习惯的都是read()接口,读出一个Mat格式的图像,这种方法,是获取采集编码后的视频流的一帧图像。会产生一定的延时。

使用grap()

videocapture提供的官方文档中介绍了这种接口。这个接口官方的解释是:grap()是一个比较快的动作,而VideoCapture::retrieve()是负责对图像解码的比较慢的动作。这样在多个相机协同时,逐个相机调用read()接口就会有一个解码的时间差,导致相机间无法同步。先分别调用grap()接口,再调用retrieve(),同步性就大大改善。在双目相机中,这样的方法比较常见。

单帧延时问题:

grab-retrieve方法只能解决几个USB相机之间的时间差问题。但在实际的相机使用中,视频流到达之前,要经过曝光,视频流编码,usb传输。曝光时间还与光照有关。所以你拿到图像的时间点
t延时=t曝光时间+编码时间+buffer缓存帧*帧间隔-------------公式1
所以用上述两种接口我们还是会有一个肉眼可见的延时。我们其实是无法消除这个延时的。但是我们可以减少这个延时。

减小延时的方法:

videocapture有一个get接口,可以读取很多相机相关的参数:参数文档
其中有一个值得注意的是相机的帧率(CAP_PROP_FPS),这个是真实的相机传感器CCD或CMOS产生图像的速度。
我们每次从VideoCapture中获取图像的时间,我们也可以打印一下时间。这时就要看一下是否获取图片的时间间隔大于图片产生的时间间隔(1/fps单位:秒)。如果答案是肯定的,那么会有一部分帧被缓存在buffer中。由上面的公式得知这会增加延时。
通常非专用的高速相机的帧率也就15-30fps,这就意味着多存一帧就延时几十毫秒。
解决的方法也很简单,提高你的读取帧率,保证不小于相机产生图像的帧率。养成把采集线程和处理线程分开的好习惯。

如果有同学对相机延时问题感兴趣欢迎留言讨论,稍后我也会吧分开采集线程和处理线程的代码框架开源到github上。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值