深蓝学院从零开始手写VIO(五)——视觉前端
声明:本专栏文章为深蓝学院《从零开始手写VIO》课程个人学习笔记,更多学习资源请咨询深蓝学院相关课程。
视觉前端算法
从大类上可以分为特征法和直接法两类,具体可参见《视觉SLAM十四讲》,课程这里给句几个简单的结论:
- 光流法最成熟,但缺点明显(受光照干扰,依赖角点)。
- Fast+光流是目前比较实用的快速算法,或者GFTT(Shi-Tomasi)+光流。
- 特征法性能从好到坏:SIFT/SURF、BRISK、ORB。
- 特征和光流都依赖于角点,但实际场景中角点并不明显。
- 直接法不依赖角点,但实现效果依赖于所选取的场景点数目。
特征+光流跟踪算法
特征提取常使用角点,因为角点附近图像的梯度变换具有较高的可辨别性,包括Harris、FAST、GTFF等。在提取出一帧图像中的特征点后,通过光流跟踪,可以进一步确定对应特征点在下一帧图像中的位置。
对于图像中存在视角变化的目标区域,需要添加warp function计算光流:
I(x,y,t)=I(W(x+dx,y+dy),t+dt)
其中W为仿射变换函数:
W(x+dx,y+dy)=[1+p1p2p31+p4p5p6]⎣⎡x+dxy+dy1⎦⎤
式中p1−p6为仿射变换参数。
而对于快速变化的图像,则可以采用金字塔光流提高光流的追踪距离。
关键帧与三角化
关键帧选取的由于主要有:1)为了后端的实时性考虑;2)避免相机出现停止,导致后端估计出现退化。关键帧的选择准则如下:
- 关键帧不能太近(避免退化)
- 关键帧不能太远(需要有足够的共视点)
- 在VIO中,为了保证ba和bg的不变,需要定期选取关键帧。
因此在不引起问题退化和计算量过度增加的情况下,应尽可能多的插入关键帧。
在关键帧之间,或者关键帧和普通帧之间,可以通过三角化构建新特征的空间坐标。