SFM(structure-from-motion)算法是一种基于各种收集到的无序图片进行三维重建的离线算法。顾名思义是从运动中(不同时间拍摄的图片集)恢复物体的三维结构,这需要估计出图片的R,t,结合相机内参重建稀疏点云。其实现过程如下:

1.特征检测

对于特征检测这一步,使用的是具有尺度和旋转不变性的SIFT描述子,其鲁棒性较强,适合用来提取尺度变换和旋转角度的各种图片特征点信息,其准确性强。

2.特征匹配

匹配和建立track,图像对两两匹配,一般采用欧式距离。当距离小于一定阈值的时候就认为匹配成功,但是误匹配也比较多,需要采取多种手段剔除:

  • 如果最近距离与次近距离的比值大于某个阈值,应该剔除
  • 对匹配点采用采样一致性算法RANSAC八点法计算基础矩阵,剔除不满足基础矩阵的匹配对

3.已知多对匹配点对,求解相机之间的本质矩阵E。

4.R,t求解

本质矩阵分解为R和T(SVD分解),存在4种可能的解,寻找正确的解。

5.三角化

已经知道了两个相机之间的变换矩阵(R和T),还有每一对匹配点的坐标,通过这些已知信息还原匹配点在空间当中的坐标

6.计算第三个摄像机到到世界坐标系的变换矩阵(R和T)

问题1:如果沿用双目重建的方法,即在第三幅图像和第一幅图像之间提取特征点,那么加入第四幅、第五幅,乃至更多呢?随着图像数量的增加,新加入的图像与第一幅图像的差异可能越来越大,特征点的提取变得异常困难。

问题2:如果用新加入的图像和相邻图像进行特征匹配呢,比如第三幅与第二幅匹配,第四幅与第三幅匹配,然后间接求得与第一幅的变换。但通过这种方式,你只能求出相机三到相机一的旋转变换(旋转矩阵R),而他们之间的位移向量T,是无法求出的。这是因为上面两个函数求出的位移向量,都是单位向量,丢失了相机之间位移的比例关系

解决办法:首先,使用双目重建的方法,对头两幅图像进行重建,这样就得到了一些空间中的点,加入第三幅图像后,使其与第二幅图像进行特征匹配,这些匹配点中,肯定有一部分也是图像二与图像一之间的匹配点,也就是说,这些匹配点中有一部分的空间坐标是已知的,同时又知道这些点在第三幅图像中的像素坐标,就可以求解PnP了,然后就可以得到第三个相机的空间位置。由于空间点的坐标都是世界坐标系下的(即第一个相机的坐标系),所以由solvePnP求出的相机位置也是世界坐标系下的,即相机三到相机一的变换矩阵。

7.加入更多图像

通过上面的方法得到相机三的变换矩阵后,就可以对图像三和图像二之间的匹配点三角化,得到其空间坐标。为了使之后的图像仍能使用以上方法求解变换矩阵,我们还需要将新得到的空间点和之前的三维点云融合。已经存在的空间点,就没必要再添加了,只添加在图像二和三之间匹配,但在图像一和图像三中没有匹配的点。如此反复。

sfm三维重建 python sfm三维重建流程图_特征匹配