这两天试着写了个Structure from Motion的实现,巩固一下对sfm细节的掌握,本来以为sfm应该挺简单的,但最后写完发现代码还是不少。最后在Kitti数据集上跑了一下,基本能够还原运动过程和特征点的位置,由于没有进行BA优化,所以总体的准确度还有一定的提升空间。


理论推导部分
Structure from Motion是单目视觉运动估计的一种常用方法,主要通过对极几何和求解PnP问题来恢复滑窗中的不同图像帧的相对位姿和特征点3D坐标,然而,纯单目视觉具有尺度不确定性,因此单目通常需要其他传感器如IMU、激光雷达等传感器进行辅助。
对极几何(这部分主要摘自《视觉slam14讲》)
对两个具有足够数量共视点的图像帧求解相对位姿常用的方法是对极几何。
设有两个图像帧,对应的相机参考系分别为 c 1 , c 2 c_1,c_2 c1,c2,假设在 c 1 c_1 c1坐标系下有一特征点的3D坐标为
P = [ X , Y , Z ] T \textbf P=[X,Y,Z]^T P=[X,Y,Z]T
记该点在 c 1 , c 2 c_1,c_2 c1,c2中的像素坐标为 p 1 , p 2 \textbf p_1,\textbf p_2 p1,p2,则它们与点 P \textbf P P有如下关系:
s 1 p 1 = KP s 2 p 2 = K(RP+t) = KTP s_1\textbf p_1=\textbf{KP} \\ s_2\textbf p_2=\textbf{K(RP+t)}=\textbf K\textbf T\textbf P s1p1=KPs2p2=K(RP+t)=KTP
K \textbf K K为相机内参矩阵, R , t \textbf R, \textbf t R,t为两个相机之间的相对运动,可以用一个 4 × 4 4\times4 4×4的矩阵 T \textbf T T表示,这里我更习惯于把 T \textbf T T称作投影矩阵,把 T \textbf T T的逆矩阵 T − 1 \textbf T^{-1} T