非同步同帧双目摄像头采集图像进行深度检测处理的一点想法


市面常见双目摄像头
    双目视觉算法可以很好运行的前提条件是左右两幅图像是同一时间采集的,即感光芯片曝光的时间段是相同的,目前市面上也有很多同步同帧的双目摄像头,一般价格都挺贵,之前用MYNTEYE 小觅摄像头测试得到的深度图像还凑合。但是事情并没有那么简单,遇到强光环境,普通的摄像头图像会因为光暗对比太大导致部分图像曝光不充分,尤其是在室外的环境,拍摄到的图像有可能会损失掉很多细节。
宽动态摄像头
    所以如果要用在室外光线复杂的环境下,普通的双目摄像头是达不到要求的。对于复杂的光线环境,需要动态范围更宽的摄像头。宽动态摄像头很多很普遍,双目摄像头也不少,但是问题在于,宽动态的同步同帧双目摄像头实在没有。宽动态双目摄像头的研发并不复杂,也是普通双目摄像头的那一套,只是换个感光芯片之类的。然而到目前为止,并没有出现宽动态范围的同步同帧的双目摄像头。
    因为正在做的项目是用双目摄像头在室外采集图像获取深度数据,而且工作环境光线复杂,因此必须使用宽动态摄像头。由于目前市面上买不到同步同帧的宽动态双目摄像头,所以也只能找两个宽动态摄像头拼一个双目了。

两个独立摄像头的同步问题
    当前用的是两路相同的宽动态摄像头,帧率 25 帧每秒 ,输出图像 640*480 ,usb2.0口。说是25帧每秒,其实都知道没那么绝对,有可能是24.95,有可能是25.5,这完全看时钟源和感光芯片的心情。在没有同步机制的情况下,两个摄像头在同一个十秒时间里采集的图像可能会相差好几帧。相差几帧的后果很可怕,说明左右图像的采集间隔是不固定的,这给之后的图像处理带来很大难度。

时空间的误差

    假定我正在使用的这对双目摄像头前面有一只鸟飞的非常快,我想获取它相对于摄像头的距离,左边摄像头刚巧拍到这只鸟,但是我还需要右边的图像才能进行深度检测,也许过了十毫秒,也许过了三十毫秒,右边的图像采集到了,然而图像中却找不到小鸟。这种情况还怎么检测深度数据,根本无法检测。所以不同步的双目摄像头的局限性很强,这与两个摄像头的性能没有太大关系,原因在于没有同步机制。
时间不同步的处理办法
    上面讲的小鸟的例子只是一个极端,实际上不可能在几十毫秒内景物完全消失,但是还是应该考虑在两幅图像的间隔时间内景物的移动对两幅图像特征点相对位置叠加的影响。有一种方法可以补偿这种由于时间不同步而产生的误差,就是利用视觉跟踪算法,锁定物块在视野中的位置和运动速度,根据速度和左右图像间隔时间,求得左右两幅图像因为间隔而被叠加的干扰量的估计值,然后将其抵消,求得相对正确的深度数据,这种方法实现有些繁琐,效果也不见得太好,所以暂不考虑。因此只能在采集和处理时着重处理在时间上最为接近的左右两幅图像。

图像凑对的原则
    我把不同步的左右两幅图像组成一对可以用于深度检测的图像的过程称为凑对。凑对的最简单原则是左右两幅图像的采集间隔应该尽量小,这样才能够保证时空间的尽量同步。如果两个摄像头的帧率绝对相同,也就是说左右摄像头采集图像的时间间隔是定值。比如考虑这样一个情况:
TIME:0.00ms LEFT   间隔时间:0.00ms
TIME:9.00ms RIGHT  间隔时间:9.00ms    凑对
TIME:40.00ms LEFT   间隔时间:31.00ms
TIME:49.00ms RIGHT  间隔时间:9.00ms    凑对
TIME:80.00ms LEFT   间隔时间:31.00ms
TIME:89.00ms RIGHT  间隔时间:9.00ms    凑对
TIME:120.00ms LEFT   间隔时间:31.00ms
TIME:129.00ms RIGHT  间隔时间:9.00ms    凑对
TIME:160.00ms LEFT   间隔时间:31.00ms
TIME:169.00ms RIGHT  间隔时间:9.00ms    凑对
TIME:200.00ms LEFT   间隔时间:31.00ms
TIME:209.00ms RIGHT  间隔时间:9.00ms    凑对
TIME:240.00ms LEFT   间隔时间:31.00ms
TIME:249.00ms RIGHT  间隔时间:9.00ms    凑对
TIME:280.00ms LEFT   间隔时间:31.00ms
TIME:289.00ms RIGHT  间隔时间:9.00ms    凑对
TIME:320.00ms LEFT   间隔时间:31.00ms
TIME:329.00ms RIGHT  间隔时间:9.00ms    凑对
TIME:360.00ms LEFT   间隔时间:31.00ms
TIME:369.00ms RIGHT  间隔时间:9.00ms    凑对
TIME:400.00ms LEFT   间隔时间:31.00ms
TIME:409.00ms RIGHT  间隔时间:9.00ms    凑对

    由上述的间隔最小原则,凑对的时机应该选在右摄像头。如果两个摄像头图像到达时间一直是固定的间隔,我大可以找出间隔时间最小的那个时间节点,在间隔时间小那个时间节点进行凑对。
    然而实际摄像头采集图像时,其帧率是存在一定波动的,导致左右摄像头图像到达时间不是定值,这里我们假设左摄像头帧间隔为41.5ms 右摄像头为39.5ms 编写模拟程序得到输出结果如下:
TIME:0.00ms LEFT   间隔时间:0.00ms
TIME:9.00ms RIGHT  间隔时间:9.00ms
TIME:41.50ms LEFT   间隔时间:32.50ms
TIME:48.50ms RIGHT  间隔时间:7.00ms    凑对
TIME:83.00ms LEFT   间隔时间:34.50ms
TIME:88.00ms RIGHT  间隔时间:5.00ms    凑对
TIME:124.50ms LEFT   间隔时间:36.50ms
TIME:127.50ms RIGHT  间隔时间:3.00ms    凑对
TIME:166.00ms LEFT   间隔时间:38.50ms
TIME:167.00ms RIGHT  间隔时间:1.00ms    凑对
TIME:206.50ms RIGHT  间隔时间:40.50ms
TIME:207.50ms LEFT   间隔时间:1.00ms    凑对
TIME:246.00ms RIGHT  间隔时间:38.50ms
TIME:249.00ms LEFT   间隔时间:3.00ms    凑对
TIME:285.50ms RIGHT  间隔时间:36.50ms
TIME:290.50ms LEFT   间隔时间:5.00ms    凑对
TIME:325.00ms RIGHT  间隔时间:34.50ms
TIME:332.00ms LEFT   间隔时间:7.00ms    凑对
TIME:364.50ms RIGHT  间隔时间:32.50ms
TIME:373.50ms LEFT   间隔时间:9.00ms    凑对
TIME:404.00ms RIGHT  间隔时间:30.50ms
TIME:415.00ms LEFT   间隔时间:11.00ms    凑对
TIME:443.50ms RIGHT  间隔时间:28.50ms
TIME:456.50ms LEFT   间隔时间:13.00ms    凑对
TIME:483.00ms RIGHT  间隔时间:26.50ms
TIME:498.00ms LEFT   间隔时间:15.00ms    凑对
TIME:522.50ms RIGHT  间隔时间:24.50ms
TIME:539.50ms LEFT   间隔时间:17.00ms    凑对
TIME:562.00ms RIGHT  间隔时间:22.50ms
TIME:581.00ms LEFT   间隔时间:19.00ms    凑对
TIME:601.50ms RIGHT  间隔时间:20.50ms
TIME:622.50ms LEFT   间隔时间:21.00ms
TIME:641.00ms RIGHT  间隔时间:18.50ms    凑对
TIME:664.00ms LEFT   间隔时间:23.00ms
TIME:680.50ms RIGHT  间隔时间:16.50ms    凑对
TIME:705.50ms LEFT   间隔时间:25.00ms

    我们发现在206.5ms处右摄像头连续采集了两幅图像,这是两个摄像头的帧率存在的细微差异多次积累造成的结果。在622.5ms处出现了空档期,这是左右摄像头“凑对权”交接的过程,因为从数据中明显可以看到空档期以前是右->左的间隔小于左->右的间隔,而空档期以后则是相反。这是在左右图像帧率有偏差时的两种情况,从以上数据得出,根据间隔最小原则编写的凑对判别算法对上述的两种情况都表现出可靠的判断,能够保证左右图像采集的间隔小于二分之一的帧间隔。是简单可行的判别方法。

问题
为什么不能采集一次凑对一次?比如
(1)左摄像头采集到了图像,那么直接和之前接收到的右图像凑对,运行一次深度检测算法;
(2)右摄像头此采集到了图像,再和(1)中获取的图像凑对

    这意味着每一次的图像更新都要运算一次深度,每一幅新的图像都能获取新的深度数据,这种想法只适合右->左的间隔约等于左->右的间隔的时候,当两者差距较大时,比如接近同步同帧时,这种方法显然会浪费大量运算量的同时降低数据的精度。
所以不是个好办法。