网上有很多博文介绍了SFM的过程,但是每个人说的都是自己的理解,想自己真正搞明白还是要自己弄懂每一步。必须要自己把过程写出来才是真的懂了。
注意,由于每幅图像会匹配到不同的其他图像,最后匹配的图像总数是平方级的。
这两个图片并不是两个不同物体,而是拍同一个物体的不同角度!!!
由于误差的存在,每个关键点会匹配多个关键点。所以还需要一个去除重复特征点匹配对的算法去解决这种一对多的情况。
首先介绍下用到的基本概念:
(1)对极几何
对极几何关系的含义是:在一个物体的两幅图像中,匹配点对(不同图像中来自同一个空间点在两幅图像中的投影点对 x,x’ 成为匹配点对)的相对位置受两个图像平面空间几何关系的约束,这种约束关系在计算机视觉中就成为对极几何关系,它可以用基础矩阵F准确地表达。
(2)极线约束
对一副图像上的任意一点x,在与其对应的另外一副图像中必然存在着一条对应的极线;而在第二幅图像上,与x匹配的点x’必然落在极线上——此约束称为极线约束。
(3)基础矩阵F
基本矩阵体现了两视图几何(对极几何,epipolar geometry)的内在射影几何(projective geometry)关系,基本矩阵只依赖于摄像机的内参K和外参R,t。
基础矩阵的计算:This enables a closed form solution via SVD(八点法). ——Lowe2005.
对极几何基本模型如图:
在图像一(左图)中的x点与图像二(右图)中的x’点是匹配点对,而极线约束的意思就是:如果两个点XL,XR匹配(对应空间中同一点X),那么在图像二中与点XL匹配的点XR必然在图像二中的极线eR-XR上——从而把点XL约束在eR-XR线段上(而不是整个图像二)。而此约束,就是我们心心念念的极线约束!
总之,就是把一幅图像中的点x对应的点x’约束在另一幅图像的一条直线l’上。
极线约束公式表示:
我们费这么大劲儿得到这个极线约束之后怎么用呢?
我们利用极线约束把那些虽然匹配成点对,但是不满足极线约束的点x’(即不在极线l’上的点)给剔除掉!只留下在极线上的匹配点对。
基于匹配点对估算两视图的基础矩阵,唯一的已知条件就是匹配的点对坐标。在实践中,点对的匹配肯定是存在误差的,主要有两种类型的误差:
(1)不精确的测量点位置引起的系统误差,通常服从高斯分布
(2)错误匹配引起的误差,这些不匹配的点被称为外点,通常不服从高斯分布
对于基础矩阵的估算,不匹配的点能够造成很大的误差,即使是只有一对错误的匹配都能使估算值极大的偏离真实值。因此,需要找到一种方法,从包含错误点(外点)的匹配点对集合中,筛选出正确的匹配点(内点)。(We use RANSAC to robustly estimate F and hence find a set of inliers that have consistent epipolar geometry.——Lowe2005.)
终于可以祭出这个图了
Lowe2005_图1. 使用SIFT和RANSAC查找一致的匹配集。从所有输入图像中提取SIFT特征,并且每个特征与k = 4个最近邻居匹配。在使用RANSAC查找与基本矩阵一致的最终内点集合之前,首先通过对不正确匹配的距离(第(2.1)节)进行阈值处理来拒绝异常值。对于这对1024×768输入图像,图像1中有365个SIFT特征,图像2中有379个。在初始特征匹配中,特征空间异常值拒绝后仍有133个匹配,使用后最终解决方案中有103个匹配RANSAC。
最后,如果两个图片之间的特征点匹配数不少于20个即为匹配成功。
首先选择合适的初始化图像对,这十分重要,一旦错误的初始化,将会陷入局部最优而使得之后的BA陷入死循环,无法正确求解得到全局最优。
具体有两点要求:
第一,要有足够多的匹配点;
第二,要有足够远的相机中心。
特别的,在这里用到两个图像变换之间的单应性模型来找初始化图像对。采用RANSC算法四点法计算单应矩阵。满足单应矩阵的匹配点称为内点,不满足单应矩阵的称为外点, 根据单应矩阵公式可知当T越小时,内点占比越高,也就是低视差现象越明显,详情可见:http://blog.csdn.net/heyijia0327/article/details/53782094。
因此找到一个内点占比最小的像对就是初始化像对,当然它前提必须满足可重建,这个可以通过匹配点个数(可以设为100)保证。
初始化图像对得到后,就可以开始进行第一次bundle adjustment了。在这里用的是稀疏光束平差法sparse bundle adjustment(SBA)。Bundle Adjustment是一个迭代的过程,在一次迭代过后,将所有三维点反向投影到各自相片的像素坐标并分别与初始坐标比对,如果大于某个阈值,则应将其从图像队列中去掉,如果队列已经小于2个了,则整个队列也去掉,一直优化到没有点可去为止。
最后,不断添加新的摄像机和3D点进行BA。这个过程直到剩下的摄像机观察到的点不超过20为止,说明剩下的摄像机没有足够的点可以添加,BA结束。得到相机估计参数和场景几何信息,即稀疏的3D点云。
截止到现在,经历了两周半的时间,算是把SFM中最重要的概念看懂了。最开始是看Lowe经典论文,但是有的地方实在是看不懂;也看了很多相关的引用论文,还是看不懂;又看了CSDN上的好多博文,无奈我的理解力实在是差了点,还是看不懂;最后没有办法,只能硬啃《计算机视觉中的多视图几何》,把里面的基础知识过了一遍。再回头看CSDN,懂了;回头再去看CSDN,懂了;回头再去看论文,懂了。
而里面的bundle adjustment我最近是没有时间再研究了。但是对最后如何形成点云图还是不明白。无奈时间真的不够了,细节无法再去了解了。以后有时间再看吧。
SFM相关博文:
1.https://blog.csdn.net/wanggcong/article/details/43449867
2.https://blog.csdn.net/AIchipmunk/article/details/48132109
3.https://blog.csdn.net/AIchipmunk/article/details/48157369
4.https://blog.csdn.net/qq_20791919/article/details/74936438
5.https://blog.csdn.net/qingcaichongchong/article/details/62424661
6.https://blog.csdn.net/qq_33826977/article/details/79834735
7.https://blog.csdn.net/wanggcong/article/details/43449867