面经问题集:
https://blog.csdn.net/weixin_43795395/article/details/89762278
基础矩阵F、本质矩阵E、单应矩阵H的理解和推导:(至关重要)
https://www.zhihu.com/question/27581884/answer/105606049
单目相机,F和H矩阵有何不同,E和F矩阵有何不同
E:本质矩阵 F:基本矩阵 H:单应矩阵
E=t*R E具有五个自由度 用8点法来求解
F和E之间相差一个相机内参 即:F=K(E)K-1
单应矩阵H描述两个平面的映射关系
若特征点在同一平面上,或者相机纯旋转,基础矩阵F的自由度下降(也即退化),如果继续用八点法求解F,多出来的自由度主要由噪声决定
BA
BA的本质是一个优化模型,其目的是最小化重投影/光度误差,用于优化相机位姿和世界点。局部BA用于优化局部的相机位姿,提高跟踪的精确度;全局BA用于全局过程中的相机位姿,使相机经过长时间、长距离的移动之后,相机位姿还比较准确。BA是一个图优化模型,一般选择LM(Levenberg-Marquardt)算法并在此基础上利用BA模型的稀疏性进行计算;可以直接计算,也可以使用g2o或者Ceres等优化库进行计算。
也就是根据相机的投影模型构造构造代价函数,利用非线性优化(比如高斯牛顿或列文伯格马夸而尔特)来求最优解,利用雅克比矩阵的稀疏性解增量方程,得到相机位姿和特征点3D位置的最优解。
PnP
一种由3D-2D的位姿求解方式,即需要已知匹配的3D点和图像2D点。目前遇到的场景主要有两个,其一是求解相机相对于某2维图像/3维物体的位姿;其二就是SLAM算法中估计相机位姿时通常需要PnP给出相机初始位姿。
在场景1中,我们通常输入的是物体在世界坐标系下的3D点以及这些3D点在图像上投影的2D点,因此求得的是相机坐标系相对于世界坐标系(Twc)的位姿
在场景2中,通常输入的是上一帧中的3D点(在上一帧的相机坐标系下表示的点)和这些3D点在当前帧中的投影得到的2D点,所以它求得的是当前帧相对于上一帧的位姿变换,如图所示:
两种情况本质上是相同的,都是基于已知3D点和对应的图像2D点求解相机运动的过程。
描述下GN、LM方法
(1) GN:改进:线搜索,增加一个α
也即先固定搜索方向 然后在该方向上寻找步长 例如最速下降法和高斯牛顿法
将f(x)进行一节泰勒展开,最后求解
线性方程H△x=b;
用JT*J近似H矩阵,省略H复杂的计算
过程;
稳定性差,可能不收敛;
(2) LM:信赖区域;
也即先固定搜索区域,然后考虑该区域内的最优点
求解线性方程(H+λI)△x=b; (I也可以转为DTD)
提供更稳定,更准确的增量 收敛速度慢一点 主要运用的就是这个LM方法
用p来判断泰勒近似是否足够好
比起高斯牛顿法 多了一项lamdaDtD,其中,D为增量的限定范围,实际中通常用JTJ的对角元素平方根
当lamda较小的时候 H占主导地位 接近于高斯牛顿
lamda较大的时候 lamda*I占主导地位 接近于一阶梯度下降
普通牛顿法:增量方程需要计算目标函数的H矩阵(二阶导数)计算量大
高斯牛顿:用JtJ作为牛顿法中二阶的H矩阵的近似,省略了这一计算过程
但此时 JtJ可能只是半正定的 从而增量稳定性差 可能不收敛
如何处理关键帧
关键帧选取的指标主要有:
(1)跟踪质量(主要根据跟踪过程中搜索到的点数和搜索的点数比例)/共视特征点
(2)距离最近关键帧的距离是否足够远(空间)/运动
(3)距离上一关键帧的帧数是否足够多(时间)
为什么要引入李群李代数
旋转矩阵自身是带有约束的,正交且行列式为1,他们作为优化变量时,会引入额外的约束,使优化变的困难,通过李群李代数的转换关系,把位姿估计变成无约束的优化问题。
极线约束
所谓极线约束就是说同一个点在两幅图像上的映射,已知左图映射点p1,那么右图映射点p2一定在相对于p1的极线上,这样可以减少待匹配的点数量。(画图解释)
单目视觉slam中尺寸漂移是怎么产生的
单目相机根据一张图片无法得出一张图片中物体的实际大小,同理也就无法得出运动的尺度大小,这是产生尺度漂移的根源。而在优化过程中,单目相机使用对极几何中的三角测量原理,而三角测量中,极小的角度误差在累积之后深度不确定都会变得很大,从而无法保证尺度一致性。
逆深度表示我觉得原因有两个: 1. 实际场景中,遇到点的深度可能很远甚至无穷远,遇到的点的深度非常近的较少,采用高斯分布假设,初始值难以覆盖深度很远的点。 这时候用深度的倒数,在数值分布上更符合高斯分布的假设; 2. 实际上应用中,逆深度具有更好的数值稳定性,为啥? 因为倒数的连续性较好啊, 你想5和10直线差了5,而1/5和1/10之间差的就小多了, 而且仿真发现逆深度的表示更有效
H矩阵求逆加速:
GPU硬件加速 利用稀疏性进行边缘化 SVD分解等数值方法
如何对匹配好的点做进一步的处理,更好保证匹配效果?或如何滤除外点
a) 确定匹配的最大距离:先求出所有匹配点最小距离min_dist(Hamming距离吗?),小于2倍的最小距离的点,认为是内点,即30<匹配点距离<=2*min_dist,30是经验值,有些点会特别小。
b) 基于KNN匹配算法:令k=2,即取最近邻与次近邻距离(.distance(),该距离类似于欧式距离,用于表征匹配质量,距离越小,匹配效果越好)的比值,比值小于一定阈值(如<0.8)则认为是内点;
c) RANSAC方法。
相比VSLAM,加入IMU后,哪些状态可观?
a) 单目SLAM7个自由度不可观:6个自由度+尺度;
b) 单目+IMU4个自由度不可观:偏航角(yaw)+3自由度不可观;翻滚角(roll)、俯仰角(pitch)由于重力存在而可观,尺度因子由于加速度计的存在而可观;
等距变换 = 刚体变换 :
相似变换是等距变换与均匀缩放的复合:
仿射变换:
对A进行SVD分解
射影变换:
视差与深度的关系。在相机完成校正后,则有d/b=f/z,其中d表示视差,b表示基线,f是焦距,z是深度
重投影误差(Reprojection Error)和对称转移误差(Symmetric transfer error)
重投影误差:
重投影误差是指投影的点(理论值)与图像上的测量点的误差。例如在标定的时候我们经常用到重投影误差作为最终标定效果的评价标准,我们认为标定板上的物理点是理论值,它经过投影变换后会得到理论的像素点a,而测量的点经过畸变矫正后的像素点为a′,它们的欧氏距离|a−a′|2即表示重投影误差。
对称转移误差:
左右图像上某一对测量的得到的匹配点,各自经过单应变换得到各自的理论匹配点,对称转移误差是指这一对测量得到的匹配点与另一张图像变换过来的理论匹配点的欧式距离
这里重投影误差 应该是建立在畸变矫正的意义上 也就是说 对于x 经过畸变矫正后得到的估计点x三角 以及x三角经过H变换后的x三角一撇
归一化平面、成像平面:
我们从头开始一步一步理一下:
1、首先从相机坐标系开始吧,物点在相机坐标系下所在的平面叫做物平面(当然还有世界坐标系,但是那个就涉及外参了,本文暂不讨论那个);
2、物平面的点通过小孔成像后,投到成像平面(相机光心之后),虽然此时的面是真正的成像平面,但是此时得到的坐标是负的,很麻烦的;
3、为了方便计算我们把该成像平面放到相机之前,并且以后都这么算,然后把此平面叫做成像平面,注意此时推到过程是:将X和Y坐标乘以f(焦距)除以Z(z坐标),因为此过程会将3D转化成2D,所以Z肯定要被消去,这样理解可能更直观,本质还是三角形相似;又因为平行光成像都成在焦平面嘛,所以乘以f是理所应当的;
4、由于此时单位依旧是米,我们最终得到的可是像素坐标,单位是像素,所以还需要一个米与像素之间的缩放。公式里是α和β,当然我们还需要把整个点挪到像素原点去,像素图像的原点在左上角,图形的原点在中心,此时有一个cx,cy的平移,但是面的位置没有改变,但是性质变了,已经成为像素平面了,单位是pixel。
现在回头看,我们需要做的是:
① 把第2步省去,因为加负号不是我们想要的,所以我们的脑海里将不再有相机之后的平面了;
② 推导出归一化平面,把第3步分开,先除Z,此时物平面就转到了相机前单位距离处,这时归一化平面就有了。之后再乘以f,让归一化平面挪到成像平面;
③ 把乘f,米与像素的缩放(α、β),平移(cx,cy)整合成内参矩阵K。
所以最终的过程就是从物平面除以Z变成归一化平面,乘以f变成成像平面,缩放平移变成像素平面,也可以乘以内参由归一化平面变成像素平面。我们平时用归一化平面多一些,毕竟齐次嘛,可以忽略物点深度的影响。这样看来,由近及远以此是:相机平面,归一化平面(1),成像平面(f),像素平面(f)