sfm流程概述

来源:互联网 发布:微信是什么软件 编辑:程序博客网 时间:2024/06/07 22:40

经过一段时间的刻苦钻研,终于摸到SFM的门了,在此把流程稍微捋一下,后续学到新的慢慢丰富吧

1)第一步是特征提取,一般采用SIFT算子,因其具有尺度和旋转不变性

2)第二步是匹配和建立track,图像对两两匹配,一般采用欧式距离.有两种方法:

  •  粗暴匹配,对所有特征点都穷举计算距离
  • 邻近搜索,建立KD树,缩小搜索范围,能提高效率,但也有可能不是最优,所以邻域取值是关键,越大越准确,越大计算量越大

当距离小于一定阈值的时候就认为匹配成功,但是误匹配也比较多,需要采取多种手段剔除:

  • 如果最近距离与次近距离的比值大于某个阈值,应该剔除
  • 对匹配点采用采样一致性算法RANSC八点法计算基础矩阵,剔除不满足基础矩阵的匹配对
当匹配关系建立后,需要生成track列表,指同名点的相片集合,比如第一幅图的13号点和第二幅的14号点及第五幅的115号点是同名点,则(1,13)、(2,14)、(5,115)是属于一个track,据此可以生成一个track集合,同时生成track的时候也需要剔除无用匹配:

  • 如果一个track包含同一幅图多次,则应该剔除,这是因为同一幅图的多个特征点都匹配了同一个点,则匹配关系肯定是错误的
  • 如果track太少,应该剔除,一般取2,是指只有两幅图有同一个点,三维重建的信息过少,容易产生误差

3)第三步找初始化像对,目的是找到相机基线最大的像对,采用RANSC算法四点法计算单应矩阵,满足单应矩阵的匹配点称为内点,不满足单应矩阵的称为外点, 根据单应矩阵公式可知当T越小时,内点占比越高,也就是低视差现象越明显,详情可见:http://blog.csdn.net/heyijia0327/article/details/53782094

因此找到一个内点占比最小的像对就是初始化像对,当然它前提必须满足可重建,这个可以通过匹配点个数保证

4)第四步是初始化像对的相对定向,根据RANSC八点法计算本征矩阵,可通过对本征矩阵SVD分解得到第二个图像的R、T,在这一步需要进行畸变校正,然后根据R、T和矫正后的像点坐标三角计算出三维点,这里用到的方法是直接线性变换DLT,可以理解为测绘中的前方交会

5)第五步是加入更多图像,以第三副图为例,根据第四步生成的三维点和第三副图与前两图的track关系,可以反算第三副图的R、T,然后继续三角化计算出更多的三维点,采用的同样是DLT,这样反复重复第5步,最后就会把所有像片的POSE(R、T)和三维点,这就是稀疏重建SFM的成果了

6)从第四步开始需要进行光束法平差Bundle Adjustment,是一个非线性优化的过程,目的是使重建误差降低到最小,通过调整POSE和三维点使反向投影差最小,如果相机没有标定,还应该将焦距也参与平差。

Bundle Adjustment是一个迭代的过程,在一次迭代过后,将所有三维点反向投影到各自相片的像素坐标并分别与初始坐标比对,如果大于某个阈值,则应将其从track中去掉,如果track中已经小于2个了,则整个track也去掉,一直优化到没有点可去为止


目前,sfm开源库主要有:

* OpenMVG http://openmvg.readthedocs.io/en/latest/#
 * libMV https://developer.blender.org/tag/libmv/
 * VisualSFM http://ccwu.me/vsfm/
 * Bundler http://www.cs.cornell.edu/~snavely/bundler/

不过,还有个小型库非常适合学习,用opencv实现的,地址是:

https://github.com/royshil/SfM-Toy-Library


0 0
原创粉丝点击