Structure From Motion(SFM)入门讲解

您所在的位置:网站首页 sfm是什么的缩写 Structure From Motion(SFM)入门讲解

Structure From Motion(SFM)入门讲解

2024-07-16 03:48| 来源: 网络整理| 查看: 265

概念:

Structure From Motion(SFM) 是从一系列包含视觉运动信息的多幅二维图像序列中估计三维结构的技术。

SFM和立体视觉的区别

在立体视觉中,两个相机之间的相对位姿是通过标定靶精确标定出来的,在重建时直接使用三角法进行计算;而在SFM中该相对位姿是需要在重建之前先计算的。

关键的公式

\huge x'Ex=0

式中:x′为右相机坐标系中的三维点坐标,x为左相机坐标系中的三维点坐标,E为本征矩阵。

式中:???为右相机内参矩阵的转置,??为左相机内参矩阵,?为基础矩阵。

式中:???为右相机图像坐标的转置,??为左相机图像坐标。

基础矩阵F将左右相机的图像坐标联系起来,该矩阵不仅包含了左右相机的相对位姿信息,也包含了左右相机的内参信息。

算法流程

1)相机标定,获取相机内参;(我在大部分的博客中都没有有要求这一步,但是我感觉这一步应该有,因为本征矩阵和基础矩阵中都没有包含畸变信息,所以我认为在计算F之前,图像应该去畸变,但是使用了几个牛逼的sfm软件后,发现人家只需要把图片导入即可重建出三维点云,那么可想而知,应该是不需要进行标定了(也有一种可能是导入图片时使用特征点进行标定过了));

2)使用标定好的相机从多个角度拍摄同一场景图片,并按序号进行保存;

3)对相邻图像两两计算匹配特征点;一般首先使用两张图像进行重建,计算出一个初始的点云,之后不断添加后续的图像,具体添加哪一张图像的方法是:检查已有的图像中哪一个与已有点云中的点匹配最多,就选哪一张;

4)使用3)中计算好的对应点对计算基础矩阵F;

关于基础矩阵的推导可以参考multiview geometry 242页9.2.1;

5)通过基础矩阵计算本征矩阵;

6)通过本征矩阵计算两个视角之间的运动,即R,T;

这里参考Multiview geometry 258页9.6.2,但是由于符号的关系,会解出四种可能的[R|T]矩阵,因此,我们需要将所有的2D的点使用这四种映射分别映射到3D空间中去,看哪一种映射对应的3D点的z深度方向全部是正确的,因此,准确的[R|T]会使得所有的场景点都在相机朝向的正前方。

7)在计算出[R|T]矩阵后,就可以使用光学三角法对所有的特征点重建了。

 

案例

为了使该案例便于实现,本文使用了自己的小米手机来作为实验道具。

1)相机标定:使用opencv自带的相机标定api即可非常容易地对相机进行标定,抽时间我会提供相机标定的程序,以下为我采集的标定图像;

2)本次例程使用surf特征点来进行关键点的选取,因此使用opencv中SurfFeatureDetectordetector()函数分别检测相邻两幅图像中的关键点(实际使用中也可以使用其他的特征点提取方法);

SurfFeatureDetector detector; vector key_pnt1,key_pnt2; detector.detect(img1,key_pnt1); detector.detect(img2,key_pnt2);

3)使用SurfDescriptorExtractor类计算关键点描述子;

SurfDescriptorExtractor extractor; Mat descriptors1,descriptors2; extractor.compute(img1,key_pnt1,descriptors1); extractor.compute(img2,key_pnt2,descriptors2);

4)使用暴力匹配方法计算对应的匹配点;

BruteForceMatcher matcher; vector matches; matcher.match(descriptors1,descriptors2,matches);

5)使用步骤4)计算好的匹配点计算基础矩阵F和本征矩阵;

Mat mask; Mat F = findFundamentalMat(right_pnts1, right_pnts2, FM_RANSAC, 0.1, 0.99, mask); Mat E = camera_param.t()*F*camera_param; Mat R1, R2, T; decomposeEssentialMat(E, R1, R2, T);

6)对本征矩阵进行奇异值分解计算相邻相机之间的相对位姿R、T,一共有四种:[R1,T],[R1,-T],[R2,T],[R2,-T];

但是只有一个是正确的,筛选的方法是:正确的R、T会使得最终计算出来的所有场景点的z坐标都是正的;

7)使用三角测量法计算特征点的三维坐标,或者使用立体视觉的方法计算视差图并进行场景重建.

 

大家好,我主要的研究方向有: **1)主流的结构光三维测量方法,包括:线扫,格雷码,相移,散斑等; 2)摄像机标定和投影仪标定; 3)点云处理; 4)图像处理; 5)Halcon应用; 6)机器视觉相机选型。** 对以上研究方向感兴趣的朋友可以关注我的微信公众号:  



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3