前言:2019年6月27日,我进行了网易伏羲实验室虚拟人方向的电话面试。在电话中,我支支吾吾连自己的项目都讲不清楚。不管最后面试结果如何,自己做过的东西起码自己要懂。
基础知识
内积
$$ \bf{a} \cdot \bf{b}=\bf{a}^T\bf{b}=\sum_{i=1}^3a_ib_i=|\bf{a}||\bf{b}|cos<\bf{a,b}> $$
外积
$$ \bf{a} \times \bf{b} = \left[ \begin{array}{ccc} {\bf{i}} & {\bf{j}} & {\bf{k}}\ {a_1} & {a_2} & {a_3}\{b_1} & {b_2} & {b_3} \end{array} \right] = \left[ \begin{array}{c} {a_2b_3-a_3b_2}\ {a_3b_1-a_1b_3}\ {a_1b_2-a_2b_1} \end{array} \right] =\left[ \begin{array}{ccc} {0} & {-a_3} & {a_2}\ {a_3} & {0} & {-a_1}\ {-a_2} & {a_1} & {0} \end{array} \right] \bf{b} \triangleq \bf{a} ^\wedge \bf{b} $$
相应的,有 $$ \boldsymbol{a}=[a_1\boldsymbol{i},a_2\boldsymbol{j},a_3\boldsymbol{k}] $$
$$ \boldsymbol{a}^{\wedge}=\boldsymbol{A}=\left[\begin{matrix}0&-a_3&a_2\a_3&0&-a_1\-a_2&a_1&0\\end{matrix}\right] $$
$$ \boldsymbol{A}^{\vee}=\boldsymbol{a} $$
特殊正交群 $SO(3)$
$$ SO(3)={R\in\mathbb{R}^{3\times3}|RR^T=I,\det(R)=1} $$
(det为行列式)
特殊欧式群$SE(3)$
$$ SE(3)={T=\left[ \begin{matrix} R&t\ 0^T&1\ \end{matrix} \right]\in\mathbb{R}^{4\times4}|R\in SO(3),t\in \mathbb{R}^3} $$
李代数$\mathfrak{so}(3)$
在对$RR^T=I$进行求导及整理之后,可以得到$R(t)^{'}R(t)^T$是一个反对称矩阵,那么就用一个$\phi(t)\in\mathbb{R}^3$与之对应。有:
$$ R(t)^{'}R(t)^T=\phi(t)^{\wedge} $$
之后求解微分方程,可以得到:
$$ R(t)=exp(\phi^{\wedge}t) $$
实际求解时利用到指数映射和对数映射。
双目系统
左右相机只有在 x 轴上有位移,因此 P 的像也只在 x 轴(对应图像的 u 轴)上有差异。
$$ \frac{z-f}{z}=\frac{b-(u_{L}+u_{R})}{b} $$
整理得:
$$ z=\frac{f b}{d}, \quad d=u_{L}-u_{R} $$
对极几何
两帧图像$I_{1},I_{2}$,两个相机中心分别为 $O_{1},O_{2}$。$p_{1},p_{2}$为互相匹配的特征点。
极平面:连线$\overrightarrow{O_{1} p_{1}}$和连线$\overrightarrow{O_{2} p_{2}}$在三维空间中会相交于点 P。这时候点$O_{1}, O_{2}, P$三个点可以确定一个平面,该平面称极平面。
极点:$O_{1} O_{2}$连线与像平面$I_{1},I_{2}$的交点被称为极点。
基线:$O_{1},O_{2}$的连线。
极线:极平面与两个像平面$I_{1},I_{2}$之间的相交线$l_{1},l_{2}$。
用途:双目匹配中,给定左图一个点,能将右图中对应的点的搜索空间缩减到一条线。
条件:需要八个或八个以上的点对
推导:设在第一帧的坐标系下,P坐标为:$\boldsymbol{P}=[X, Y, Z]^{T}$,两像素点 $p_{1},p_{2}$ **(齐次化坐标)**的像素位置为:
$$ s_{1} \boldsymbol{p}{1}=\boldsymbol{K} \boldsymbol{P}, \quad s{2} \boldsymbol{p}_{2}=\boldsymbol{K}(\boldsymbol{R} \boldsymbol{P}+\boldsymbol{t}) $$
因为是齐次坐标,所以认为等式任意一边乘以非零常数,等式仍然成立。即:
$$ \boldsymbol{p}{1}=\boldsymbol{K} \boldsymbol{P}, \quad \boldsymbol{p}{2}=\boldsymbol{K}(\boldsymbol{R} \boldsymbol{P}+\boldsymbol{t}) $$
取$\boldsymbol{x}{1}, \boldsymbol{x}{2}$是两个像素点的归一化平面上的坐标:
$$ \boldsymbol{x}{1}=\boldsymbol{K}^{-1} \boldsymbol{p}{1}, \quad \boldsymbol{x}{2}=\boldsymbol{K}^{-1} \boldsymbol{p}{2} $$
有:
$$ \boldsymbol{x}{2}=\boldsymbol{R} \boldsymbol{x}{1}+\boldsymbol{t} $$
同时左乘$t^{\wedge}$,相当于同时与$t$做外积。
$$ \boldsymbol{t}^{\wedge} \boldsymbol{x}{2}=\boldsymbol{t}^{\wedge} \boldsymbol{R} \boldsymbol{x}{1} $$
同时左乘$\boldsymbol{x}_{2}^{T}$
$$ \boldsymbol{x}{2}^{T} \boldsymbol{t}^{\wedge} \boldsymbol{x}{2}=\boldsymbol{x}{2}^{T} \boldsymbol{t}^{\wedge} \boldsymbol{R} \boldsymbol{x}{1} $$
因$t^{\wedge} x_{2}$垂直于$\boldsymbol{x}_{2}^{T}$或$t$,因此左侧为0。极线约束即:
$$ \boldsymbol{x}{2}^{T} \boldsymbol{t}^{\wedge} \boldsymbol{R} \boldsymbol{x}{1}=0 $$
将$\boldsymbol{x}{1}=\boldsymbol{K}^{-1} \boldsymbol{p}{1}, \quad \boldsymbol{x}{2}=\boldsymbol{K}^{-1} \boldsymbol{p}{2}$代回,可得极线约束的另一种形式:
$$ \boldsymbol{p}{2}^{T} \boldsymbol{K}^{-T} \boldsymbol{t}^{\wedge} \boldsymbol{R} \boldsymbol{K}^{-1} \boldsymbol{p}{1}=0 $$
意义:
$O_{1}, P, O_{2}$三点共面,$\boldsymbol{t}^{\wedge} \boldsymbol{R} \boldsymbol{x}{1}$表示极线,且极线一定通过$\boldsymbol{x}{2}$。
本质矩阵
本质矩阵为:
$$ \boldsymbol{E}=\boldsymbol{t}^{\wedge} \boldsymbol{R} $$
特点:
- 秩为2
- 仅依赖于外参
- 采用摄像机坐标系
基本矩阵
基本矩阵为:
$$ \boldsymbol{F}=\boldsymbol{K}^{-T} \boldsymbol{E} \boldsymbol{K}^{-1} $$
特点:
- 秩为2
- 仅依赖于外参和内参
- 采用像素坐标系
- F是从左图到右图,有方向,从右图到左图就是F的转置
- 7个自由度。($3\times3$矩阵本有9个自由度,因行列式值为零,相差常数因子,即$kF,k\neq 0$,也是基本矩阵,减去两个自由度。)
单应矩阵
单应矩阵是齐次矩阵,有8个未知数,需要四个对应点。
张正友标定法
A Flexible New Technique for Camera Calibration
摘要:张正友标定法只需要相机观察几个(至少两个)不同方向上显示的平面图案。相机或平面图案都可以自由移动。且相机或标定板的运动不需要知道。张正友标定法对径向透镜畸变进行了建模。该方法由一个封闭形式的解组成,然后根据最大似然准则进行非线性改进。
数学推导
针孔相机模型三维点到二维点投影矩阵
符号 | 含义 |
---|---|
$m=[u,v]^T$ | 二维点 |
$M=[X,Y,Z]^T$ | 三维点 |
$\widetilde{m}=[u,v,1]^T$ | 二维点齐次坐标 |
$\widetilde{M}=[X,Y,Z,1]^T$ | 三维点齐次坐标 |
s | 随机尺度因子 |
$\bf{(R,t)}$ | 外参,即将世界坐标系和相机坐标系联系起来的旋转矩阵和位移向量 |
$\bf{A}$ | 相机内参矩阵 |
$\alpha,\beta$ | 分别为图像u轴和v轴的尺度因子 |
$u_0,v_0$ | 光心的图像坐标系坐标 |
$\gamma$ | 描述图像轴u,v之间的倾斜 |
$$ s \widetilde{\bf{m}} = \bf{A[R\quad t]\widetilde{M}} $$
其中,
$$ A = \left[ \begin{array}{ccc} {\alpha} & {\gamma} & {u_0}\ {0} & {\beta} & {v_0}\ {0} & {0} & {1}\end{array}\right] $$
标定板平面与图像之间的单应性矩阵
这里假设标定板所在的平面为空间坐标系下的$Z=0$。
符号 | 含义 |
---|---|
$\bf{r_i}$ | 旋转矩阵$\bf{R}$的第i列 |
$$ s\left[\begin{array}{c}{u}\{v}\{1}\end{array}\right]=\bf{A}[\begin{array}{cccc}{\bf{r_1}}&{\bf{r_2}}&{\bf{r_3}}&{\bf{t}}\end{array}]\left[\begin{array}{c}{X}\{Y}\{0}\{1}\end{array}\right]=A[\begin{array}{ccc}{\bf{r_1}}&{\bf{r_2}}&{\bf{t}}\end{array}]\left[\begin{array}{c}{X}\{Y}\{1}\end{array}\right] $$
即:
$$ s\widetilde{\bf{m}}=\bf{H\widetilde{M}} $$
其中,$\bf{H}$为单应矩阵,$\bf{H=A[\begin{array}{ccc}{\bf{r_1}}&{\bf{r_2}}&{\bf{t}}\end{array}]}$。
内参约束
假设$\bf{H}=\left[\begin{array}{ccc}{\bf{h_1}}&{\bf{h_2}}&{\bf{h_3}}\end{array}\right]$,根据单应关系有:
$$ \left[\begin{array}{ccc}{\bf{h_1}}&{\bf{h_2}}&{\bf{h_3}}\end{array}\right]=\lambda \bf{A}[\begin{array}{ccc}{\bf{r_1}}&{\bf{r_2}}&{\bf{t}}\end{array}] $$
可推出 $$ \mathbf{r}{1}=\lambda \mathbf{A}^{-1} \mathbf{h}{1} $$
$$ \mathbf{r}{2}=\lambda \mathbf{A}^{-1} \mathbf{h}{2} $$
$$ \mathbf{r}{3}=\mathbf{r}{1} \times \mathbf{r}_{2} $$
$$ \mathbf{t}=\lambda \mathbf{A}^{-1} \mathbf{h}_{3} $$
$$ \lambda=\frac{1}{\left|\mathbf{A}^{-1} \mathbf{h}{1}\right|}=\frac{1}{\left|\mathbf{A}^{-1} \mathbf{h}{2}\right|} $$
根据$\bf{r_1}$和$\bf{r_2}$正交,根据
- 正交
- 模相等
有: $$ h_1^TA^{-T}A^{-1}h_2=0 $$
$$ h_1^TA^{-T}A^{-1}h_1= h_2^TA^{-T}A^{-1}h_2 $$
几何解释
需要大于等于三张图像才能确定唯一解。
SfM
三角化
设 $x_1 ,x_2$ 为两个特征点的归一化坐标,那么它们满足: $$ s_{1} \boldsymbol{x}{1}=s{2} \boldsymbol{R} \boldsymbol{x}{2}+\boldsymbol{t} $$ 现在我们已经知道了$\boldsymbol{R}, \boldsymbol{t}$,想要求解的是两个特征点的深度 $s{1}, s_{2}$。
可以左侧使用$x_1$进行叉乘,使左侧为0,即可求得$s_2$: $$ s_{1} \boldsymbol{x}{1}^{\wedge} \boldsymbol{x}{1}=0=s_{2} \boldsymbol{x}{1}^{\wedge} \boldsymbol{R} \boldsymbol{x}{2}+\boldsymbol{x}_{1}^{\wedge} \boldsymbol{t} $$ 求$s_1$时同理。
PnP
求解 3D 到 2D 点对运动的问题。特征点的 3D 位置可以由三角化,或者由 RGB-D 相机的深度图确定。在单目视觉里程计中,必须先进行初始化,然后才能使用 PnP。
SLAM
ORB_SLAM流程
-
System类生成一个对象slam,初始化slam对象,设置三个线程:Tracking ,LocalMapping ,LoopClosing
-
订阅 GrabImage() ——> TrackMonocular()——>GrabImageMonocular()——>Track()
三个线程作用
Tracking:
- Extract ORB,提取关键点和描述子
- Initialize pose:在Track() 中初始化位姿 pose , 第一帧 :mInitialFrame 当前帧:mCurrentFrame ,从这两帧得到 (R,t)。并且,这两帧转为KeyFrame,凡是关键帧KeyFrame都要插入地图 mpMap(mpMap->AddMapPoint(pMP);),根据关键帧与当前帧公共3D点的个数 更新关键帧间的连接关系。
MapPoint类表示 路标点,Map类用Hash表管理 路标点和关键帧。
-
track local map:
-
更新局部地图,包括局部关键帧和关键点
-
对局部MapPoints进行投影匹配
-
根据匹配对估计当前帧的姿态
-
根据姿态剔除误匹配
-
-
keyFrame decision
Local Mapping:
LocalMapping线程处理的关键帧都是Tracking线程发过来的
- 插入关键帧,
- 去除冗余的MapPoints;
- Local BA;
- 去除冗余的关键帧 : 检测并剔除当前帧相邻的关键帧中和关键帧,剔除的标准是:该关键帧的90%的MapPoints可以被其它关键帧观测到。将当前帧加入到闭环检测队列中。
Loop Closing
- 回环检测Loop decision:计算闭环候选帧,在候选帧中检测具有连续性的候选帧;
- 计算相似变换阵sim3,求 [ sR | t ];
- Loop Correction:
A. 通过求解的Sim3以及相对姿态关系,调整与当前帧相连的关键帧位姿以及这些关键帧观测到的MapPoints的位置; B. 将闭环帧以及 与闭环帧相连的关键帧的MapPoints和与当前帧相连的关键帧的点进行匹配; C. 通过MapPoints的匹配关系更新这些帧之间的连接关系,即更新covisibility graph D. 对Essential Graph(Pose Graph)进行优化,MapPoints的位置则根据优化后的位姿做相对应的调整 E. 创建线程进行全局Bundle Adjustment
main->构造SLAM对象,在构造函数中设置线程。
读取图像,循环调用trackMonocular,在其中先检查状态是否改变,再调用
1
GrabImageMonocular
构造了CurrentFrame,最后进行Track