Structure From Motion(SFM)入门讲解

  • 概念

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<KeyPoint> 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<L2<float>> matcher;
vector<DMatch> 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)机器视觉相机选型。**
对以上研究方向感兴趣的朋友可以关注我的微信公众号:
 

地形数据测量是许多地貌研究应用程序的基本方面,尤其是那些包括地形监测和地形变化研究的应用程序。然而,大多数测量技术需要相对昂贵的技术或专门的用户监督。 MotionSfM)摄影测量技术的结构通过允许使用消费级数码相机和高度自动化的数据处理(可以免费使用)减少了这两个限制。因此,SfM摄影测量法提供了快速,自动化和低成本获取3D数据的可能性,这不可避免地引起了地貌界的极大兴趣。在此贡献中,介绍了SfM摄影测量的基本概念,同时也承认了其传统。举几个例子来说明SfM在地貌研究中的应用潜力。特别是,SfM摄影测量为地貌学家提供了一种工具,用于在一定范围内对3-D形式进行高分辨率表征,并用于变化检测。 SfM数据处理的高度自动化既创造了机遇,也带来了威胁,特别是因为用户控制倾向于将重点放在最终产品的可视化上,而不是固有的数据质量上。因此,这项贡献旨在指导潜在的新用户成功地将SfM应用于一系列地貌研究。 关键词:运动结构,近距离摄影测量,智能手机技术,测量系统,表面形态echnology reduces both these constraints by allowing the use of consumer grade digital cameras and highly automated data processing, which can be free to use. SfM photogrammetry therefore offers the possibility of fast, automated and low-cost acquisition of 3-D data, which has inevitably created great interest amongst the geomorphological community. In this contribution, the basic concepts of SfM photogrammetry are presented, whilst recognising its heritage. A few examples are employed to illustrate the potential of SfM applications for geomorphological research. In particular, SfM photogrammetry offers to geomorphologists a tool for high-resolution characterisation of 3-D forms at a range of scales and for change detection purposes. The high level of automation of SfM data processing creates both opportunities and threats, particularly because user control tends to focus upon visualisation of the final product rather than upon inherent data quality. Accordingly, this contribution seeks to guide potential new users in successfully applying SfM for a range of geomorphic studies.
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值