穆莉莉, 李训杰, 杨洪涛, 史 程
(安徽理工大学机械工程学院,安徽 淮南 232001)
在相机运动的过程中,不同的相机帧数使得图像相邻帧像素发生不同程度的位移。当相机抖动过大时,帧数较少的相机所拍摄的相邻帧画面可能无任何重叠区域[1-3],即可能会出现不存在任何相关特征点的情况,此时视觉里程计中将会出现特征点追踪匹配失败的情况[4],从而导致视觉SLAM的位姿估计和局部建图出现严重偏差[5]。目前对图像消抖的方法主要分为两种:硬件消抖与软件消抖。硬件消抖主要是通过电子水平仪补偿相机抖动时所产生的位移。Zhou等[6]使用电子水平仪对双目模块进行稳定,从而从硬件层面上稳定画面,达到双目特征点匹配稳定的目的。软件消抖则是通过计算处理视频画面数据进行预测或补偿。Han等[7]针对相机拍摄过程中的突然抖动从而导致的视频质量下降的问题,提出一种基于惯性视觉状态跟踪的移动设备视频稳定方案,使用图像帧之间的运动结构来估计摄像机的平移。Pu等[8]引入运动熵来检测抖动噪声较大的视频,并提取纹理变化分数的稳定特征进行双重检测。为了解决视觉里程计工作时因数据帧的抖动所产生的特征点追踪匹配失败的问题,创新提出一种面向视觉里程计的光流消抖算法。以一段含有抖动帧的视频数据为研究对象,对比分析原数据与算法处理后的数据帧的平均光流,验证该算法的优越性,为视觉SLAM的软件消抖提供一种新思路。
目前的视觉里程计主要采用特征点法估计相机运动,如SIFT[9],SURF[10],ORB[11]等。其中ORB(oriented FAST and rotated BRIEF)特征基于FAST特征[12],具有良好的质量与性能,主要检测局部像素灰度变化明显的地方,其检测过程为:在图像中选取像素p,设其亮度为Ip;以该像素为中心,选取半径为3的圆上的16个像素点;设置一个阈值T,假如选取的圆上有连续的N个点的亮度大于Ip+T或Ip-T,那么该像素则为特征点。与FAST不同的是,ORB特征点提取添加尺度和旋转的描述。尺度不变性由构建图像金字塔并在金字塔的每一层上检测角点来实现。金字塔底层为原始图像,每往上一层,对图像进行固定倍率的缩放。在特征匹配算法中,匹配不同层的图像,从而实现尺度不变性。在旋转方面[13],计算特征点附近的图像灰度质心,定义图像块B中像素坐标为(x,y),则图像块的矩mpq为:
(1)
通过矩进一步找到图像块的质心C:
(2)
连接图像块到集合中心O与质心C,得到一个方向向量OC,于是特征点的方向可以定义为公式(3):
θ=arctan(m01/m10)
(3)
通过以上方法,ORB特征点实现了尺度和旋转不变性,在后续匹配过程中保证了匹配精度。调用OpenCV中已集成的“暴力匹配”方法对相邻帧的特征点进行匹配,解决视觉里程计中数据关联问题。
光流(Optical Flow)是一种描述像素随时间在图像之间运动的方法,随着时间量的增加,同一个像素会在图像中移动[14]。在视觉SLAM中,图像的变化来自于随时间变化的相机运动。即图像可视为时间的函数:I(t)。当t时刻时,位于(x,y)处的像素的灰度函数为I(x,y,t)。当t+ dt时刻时,该像素点运动到(x+ dx,y+ dy),则有公式(4):
I(x+dx,y+dy,t+dt)=I(x,y,t)
(4)
对(4)式左边进行泰勒展开,保留一阶项得公式(5):
I(x+dx,y+dy,t+dt)≈
(5)
假设同一个空间点的像素灰度值,在各个图像中是固定不变的,于是下一个时刻的灰度等于之前的灰度,化简得公式(6):
(6)
其中 dx/dt为像素在x轴上运动速度,而 dy/dt为y轴速度,分别记为u,v。同时∂I/∂x为图像在该点处x方向的梯度,另一项则是在y方向的梯度,分别记为Ix和Iy。把图像灰度对时间的变化量记为It,写成矩阵形式得:
(7)
在 LK 光流中,假设一个大小为w*w的窗口内的w2数量的像素具有同样的运动,则共有w2个方程(8):
(8)
记:
(9)
于是(8)式记为:
(10)
方程(10)为一个关于u,v的超定性方程,利用最小二乘解得:
(11)
此时就得到了像素在图像间的运动速度u和v。当t取离散的时刻时,可以估计某块像素在若干个图像中出现的位置。由于像素梯度仅在局部有效,一次迭代不够好的话,多次迭代此方程,便能更好的获得像素在若干个图像中出现的位置。
通过获取相邻两帧画面的全局光流,即获取全局特征点的运动速度u和v,设分辨率为m*n的相邻帧画面P1和P2的相隔时间为t,则此时的光流矩阵Flow为:
(12)
将Flow矩阵转化为m维矩阵Qm:
(13)
根据相邻帧P1和P2的Flow矩阵,即可预测出后续的Pn帧,预测帧公式为:
Pn=dstack-1(dstack(P2)+
(n-2)Qm),n=3,4,5,…
(14)
相邻两帧画面的全局特征点的平均光流一定程度上反映了相邻帧的像素点变化情况,计算公式(15)如下:
(15)
假设一组数据的帧数为g,当第h帧与第h+1帧的平均光流满足公式(16),则判断出第h+1帧为抖动帧,需要进行帧预测操作。
(16)
基于LK光流原理,计算全局相邻数据帧的平均光流判断抖动帧位置,相邻帧消抖过程框图如图1所示。考虑到视觉里程计中可能存在的ORB特征点误匹配的情况,设定一个特征点匹配数量的阈值K,当特征点匹配数量高于此阈值,则认定两帧画面为有效相邻帧,反之为无效相邻帧,可初步判断两帧画面是否为同一条件下拍摄的相邻帧;根据相邻帧的平均光流与全局平均光流的大小比较,得出此第h+1帧是否为抖动帧,若是,则由帧预测算法预测出新的h+1帧,并替换原有抖动帧,从而实现消抖处理。
图1 消抖流程图
算法对一组存在抖动的巷道行驶视频进行实验,设备硬件:GPU为GTX1650Ti,CPU为AMD R7 4800H,由单目摄像头拍摄的含有抖动帧的视频相关数据如表1所示。
表1 视频数据
对存在抖动的116-118位置帧进行消抖处理,实验结果如图2所示。
图2 116-118位置帧消抖
对算法处理前后相邻帧进行ORB特征点暴力匹配,ORB特征点匹配数如表2所示,以117-118位置帧为例,实验对比现象如图3所示。
表2 ORB特征点匹配
(a) 未消抖的117-118帧
从图3可以发现,未消抖处理的相邻帧的ORB特征点匹配存在着大量的误匹配,严重影响后续视觉SLAM中的位姿估计以及局部建图,而以所提算法处理后的相邻帧则保持着良好的匹配性能,有效降低抖动帧对视觉里程计工作的影响。
进一步对原始数据和消抖后数据的平均光流进行计算,并分别迭代算法3次、5次、7次和9次,如图4所示。抖动处平均光流减少幅度与耗时如表3所示。
(a) 迭代3次
表3 消抖分析
从四种迭代方式的图和表中可以发现:1)抖动处的视频帧的平均光流明显的高于其他非抖动帧的平均光流;2)本算法能够显著降低抖动帧的平均光流,最高达到36.80%;3)随着消抖算法迭代次数的增加,本算法能够逐渐降低抖动帧的平均光流,同时满足了视觉里程计工作的实时性要求。
视觉里程计工作时因抖动产生的特征点追踪匹配失败的情况,提出了一种面向视觉里程计的光流消抖算法。通过对比相邻帧的平均光流与全局平均光流,判断出抖动位置,并利用光流消抖算法对抖动帧进行重新预测。对一组存在抖动的视频帧数据进行消抖,抖动处平均光流最高下降36.80%,实验结果表明了该算法对于存在抖动的视频帧具有良好的消抖能力,并且在ORB特征点暴力匹配时展现了良好的性能,在视觉里程计领域具有一定的适用性。