三维重建——Structure from motion

来源:互联网 发布:怎样走网络群众路线 编辑:程序博客网 时间:2024/06/05 18:33

1. 概念

Structure from motion 指的是由图像生成3维点云以及相机姿态,即:
- 输入:一系列图像,拍摄同一场景
- 输出: 每一张图像对应的相机位置和朝向, 场景中的3D点云


2. 算法流程

  1. 获取相机内参矩阵
    对输入图像利用其内部的编码信息获取相机的焦距,计算内参矩阵
  2. 对相邻图像两两计算匹配特征点
    对于3D重建而言, 一般是首先用两张图像作为初始化建出来一个初始的点云,之后不断添加后续的图像进入,并添加入点云。 那么具体添加那一张图像可以采用的方法是:看已有的图像中哪一个与已有点云中的点匹配最多就先选哪张。
  3. 计算两图像之间的内参矩阵F
    关于fundamental matrix的推导可以使用Multiview geometry 242页 9.2.1中的几何推导以及9.2.2中的算术推导,算术推导证明如果两张图像的拍摄是纯相机平移的话,fundamental matrix是计算失败的。计算内参矩阵可以使用8点算法。具体内容参看Multiview geometry 282页 Algorithm 11.1,值得注意的是,在进行8点算法之前,需要使用RANSAC算法对特征点进行提纯(RANSAC算法中的模型使用计算基础矩阵的8点算法,参见Multiview geometry 121页 Algorithm 4.5),同时在输入计算基础矩阵之前,需要对所有的特征点进行normalize,这里是必须要做的,原因参见Multiview geometry 108页,具体做法使用109页 Algorithm 4.2.
  4. 计算相机的essential matrix
    使用公式 E=KTFK 其中KKT分别对应于两个视角的内参矩阵
  5. 利用essential matrix计算两个相机之间的外参,即[R|t]矩阵
    这里参见Multiview geometry 258页 9.6.2. 但是由于符号的关系,会输出出来4中可能的[R|t]矩阵,这个时候我们将所有2D的点利用这四种[R|t]映射到3D空间中去,看哪一种[R|t]对应的3D点的z深度方向全部是正向的。因为准确的[R|t]场景点都在相机朝向的正前方。
  6. 利用 bundle adjustment 来merge不同的3D点云
    目前我们已经知道两两图像之间的[R|t],比如1 2之间的, 2 3之间的,如何将1,2,3放入同一个参考坐标系,需要使用BA——数学上是最小化投影误差,让所有得出的[R|t]与3D点估计输出的2D点与实际观测点位置最小化

几个概念的区分

  1. fundamental matrix与homography的区别
    fundamental matrix描述的是对极几何的关系,3D场景点在两个视角图像的投影点之间满足的关系,与3D场景无关。具体的,已知基础矩阵F以及3D场景点在一张图像上的映射点x,那么在另外一张图上的映射点的位置应该在基线l=Fx 上寻找。因此,fundamental matrix表征的是一种点与极线一一对应的关系。以外,fundamental matrix的秩为2,homography也可以称作是fundamental matrix的一种特殊情况, 这一点可以参见基础矩阵的几何意义(Multiview geometry 242页 9.2.1)。 Homograohy是指点与点之间的一一对应的关系,其为满秩3, 而且使用场景限于描述平面与平面之间的映射关系
    参考链接: https://www.quora.com/Computer-Vision-What-is-the-relationship-of-homography-and-the-fundamental-matrix