视觉里程计

最近要开始做一个在视频中添加软广告的项目,虽然第一感觉肯定是要用GAN或者VAE这种生成模型去搞,但是老师说先用硬方法试一下,学学FFmpeg……???
简单思考了一下,感觉这个问题要用硬方法解决的话不是很简单……首先至少要能够估计出来相机镜头的变化,有点类似于SLAM前端干的事情,并且当场景中目标添加物也发生变化时,两者的运动就要同时考虑。并且如果还要考虑直接将贴图进行适配的话,就还需要一定的场景识别。

关于估计相机移动轨迹,基本上就是SLAM前端视觉里程计(VO)在实现的目标,就是通过相邻图像的信息来对相机的运动进行估计。根据是否需要特征点分为两大类方法,采用特征点往往会更加稳定,对光照以及动态物体不敏感,相对比较稳定。

在正式讲视觉里程计之前,先铺垫一下相关内容:

针孔相机模型

  • 小孔成像模型

    Z为物体距离针孔的距离,K为相机的内参,涉及到焦距以及相机内部的偏移,相机的位姿R,t又称为相机的外参,即待估计的目标。
    其中称为世界坐标,称为像素坐标,称为相机坐标。

  • 畸变
    由透镜引起的畸变称为径向畸变,越靠近边缘现象越明显,主要分为桶形畸变和枕形畸变。
    在相机组装过程中由于不能使透镜和成像面严格平行也会引入切向畸变。

视觉里程计

特征点

在经典SLAM模型中,会选取有代表性的点来作为“路标”,对应视觉SLAM中的特征点。类似角点,边缘,区块都可以作为特征点,好的特征点应该具有:

  • 可重复性
  • 可区别性
  • 高效率
  • 本地性

特征点包括关键点和描述子。描述子可以认为是进一步描述特征点的信息,往往是一个向量。

  • FAST关键点
    一种主要检测灰度变化的角点,速度很快。还可以进一步加速(FAST-12算法)。大致操作就是对像素逐个分析周围像素亮度的变化,如果大于设定阈值,则认为是特征点,但是这样容易造成FAST角点”扎堆“,所以在过完一遍之后还要对角点集中的区域挑出极大值保留(非极大值抑制)。

  • ORB特征
    “Oriented FAST“,所以其实是一种改进的FAST的角点。FAST虽然很快,但是数量很大并且不确定,并且由于灰度采样时采用的原型不具有方向性和尺度,故ORB进一步在FAST角点上计算Harris响应值,然后选取前N大响应值对应的角点,对于方向性和尺度,ORB通过构建图像金字塔,在每一层上进行特征点检测,并且通过灰度质心法来实现特征的旋转(通过连接灰度质心和几何质心的向量来表示方向)。
    在得到特征点之后对每个点计算BRIEF特征描述,大致是通过关键点周围一些像素点阵的关系来得到一个描述向量。可以结合前面得到的方向信息计算旋转之后的”Steer BRIEF”来对旋转有一个很好的鲁棒性。

  • 特征匹配
    • 暴力匹配,通过比较和所有变化后特征点的相似程度,挑选最相似的(往往用欧氏距离或汉明距离)
    • 快速近似近邻(FLANN)

2D-2D:对极几何

  • 对极约束

SLAM

整个SLAM大概可以分为前端和后端,前端相当于VO(视觉里程计),研究帧与帧之间变换关系。首先提取每帧图像特征点,利用相邻帧图像,进行特征点匹配,然后利用RANSAC去除大噪声,然后进行匹配,得到一个pose信息(位置和姿态),同时可以利用IMU(Inertial measurement unit惯性测量单元)提供的姿态信息进行滤波融合

后端则主要是对前端出结果进行优化,利用滤波理论(EKF、UKF、PF)、或者优化理论TORO、G2O进行树或者图的优化。最终得到最优的位姿估计。

后端这边难点比较多,涉及到的数学知识也比较多,总的来说大家已经慢慢抛弃传统的滤波理论走向图优化去了。

因为基于滤波的理论,滤波器稳度增长太快,这对于需要频繁求逆的EKF(扩展卡尔曼滤波器),PF压力很大。而基于图的SLAM,通常以keyframe(关键帧)为基础,建立多个节点和节点之间的相对变换关系,比如仿射变换矩阵,并不断地进行关键节点的维护,保证图的容量,在保证精度的同时,降低了计算量。

列举几个目前比较有名的SLAM算法:PTAM,MonoSLAM, ORB-SLAM,RGBD-SLAM,RTAB-SLAM,LSD-SLAM。


Reference

《视觉SLAM十四讲》Chapter 7 视觉里程计 1

相机标定

d