转载:http://blog.csdn.net/u010128736/ ORB-SLAM2详解(三)自动地图初始化
2017-08-03 21:47
567 查看
ORB-SLAM2详解(三)自动地图初始化
本人邮箱:sylvester0510@163.com,欢迎交流讨论,欢迎转载,转载请注明网址http://blog.csdn.net/u010128736/
系统的第一步是初始化,ORB_SLAM使用的是一种自动初始化方法。这里同时计算两个模型:用于平面场景的单应性矩阵H和用于非平面场景的基础矩阵F,然后通过一个评分规则来选择合适的模型,恢复相机的旋转矩阵R和平移向量t。
一、找到初始对应点
在当前帧Fc中提取ORB特征点,与参考帧Fr进行匹配。如果匹配点对数过少,就重置参考帧。这一步骤在Tracking.cc中的Tracking::MonocularInitialization函数中。int nmatches = matcher.SearchForInitialization(mInitialFrame,mCurrentFrame,mvbPrevMatched,mvIniMatches,100);1
1
[/code]
nmatches表示匹配到的对应点对数。
二、同时计算两个模型
在找到对应点之后,开始调用Initializer.cc中的Initializer::Initialized函数进行初始化工作。为了计算R和t,ORB_SLAM为了针对平面和非平面场景选择最合适的模型,同时开启了两个线程,分别计算单应性矩阵Hcr。如下所示:thread threadH(&Initializer::FindHomography,this,ref(vbMatchesInliersH), ref(SH), ref(H)); thread threadF(&Initializer::FindFundamental,this,ref(vbMatchesInliersF), ref(SF), ref(F));1
2
1
2
[/code]
这里的H和F分别满足下列关系:
xc=HcrxrxTcFcrxr=0
x_c = H_{cr} x_r \\
x_c^T F_{cr} x_r = 0
线程threadH调用Initializer::FindHomography函数,计算单应性矩阵H,采用归一化的直接线性变换(normalized DLT)。线程threadF调用Initializer::FindFundamental函数计算基础矩阵F,使用归一化8点法。为了评估哪个模型更合适,文中使用SH:
SM=∑i(ρM(d2cr(xic,xir,M)+ρM(d2rc(xic,xir,M))ρM(d2)={τ−d2 if d2<TM0 if d2≥TM{τ−d2 if d2<TM0 if d2≥TM
S_M = \sum_i(\rho_M(d^2_{cr}(x^i_c , x^i_r,M) + \rho_M(d^2_{rc}(x^i_c , x^i_r,M)) \\
\rho_M(d^2) =
其中,d2cr表示对称的转换误差,分别是从当前帧到参考帧的变换误差和参考帧到当前帧的变换误差。这里:
TH=5.99, TF=3.84τ=TH
T_H = 5.99, \ \ \
T_F = 3.84 \\
\tau = T_H
三、模型选择
文中认为,当场景是一个平面、或近似为一个平面、或者视差较小的时候,可以使用单应性矩阵H,而使用基础矩阵F恢复运动,需要场景是一个非平面、视差大的场景。这个时候,文中使用下面所示的一个机制,来估计两个模型的优劣:RH=SHSH+SF
R_H = \frac{S_H}{S_H+S_F}
当RH大于0.45时,选择从单应性变换矩阵还原运动。不过ORB_SLAM2源代码中使用的是0.4作为阈值,如下:
// Compute ratio of scores float RH = SH/(SH+SF); // Try to reconstruct from homography or fundamental depending on the ratio (0.40-0.45) if(RH>0.40) return ReconstructH(vbMatchesInliersH,H,mK,R21,t21,vP3D,vbTriangulated,1.0,50); else //if(pF_HF>0.6) return ReconstructF(vbMatchesInliersF,F,mK,R21,t21,vP3D,vbTriangulated,1.0,50);1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
[/code]
四、运动恢复(sfm)
选择好模型后,就可以恢复运动。(1)从单应性变换矩阵H中恢复
在求得单应性变化H后,本文使用FAUGERAS的论文[1]的方法,提取8种运动假设。这个方法通过可视化约束来测试选择合理的解。但是如果在低视差的情况下,点云会跑到相机的前面或后面,测试就会出现错误从而选择一个错误的解。文中使用的是直接三角化8种方案,检查两个相机前面具有较少的重投影误差情况下,在视图低视差情况下是否大部分云点都可以看到。如果没有一个解很合适,就不执行初始化,重新从第一步开始。这种方法在低视差和两个交叉的视图情况下,初始化程序更具鲁棒性。程序中调用Initializer::ReconstructH函数恢复运动。
(2)从基础矩阵F中恢复
在得到基础矩阵F,并且一直摄像机内参K的情况下,可以计算得到本质矩阵E,然后使用[2]中的方法,恢复出4个运动假设的解。这一部分的理论推导在之前博客做过介绍。其中基础矩阵F得到本质矩阵E的公式如下所示:
Erc=KTFrcK
E_{rc} = K^TF_{rc}K
同样的,这4个解中只有一个是合理的,可以使用可视化约束来选择,本文使用与单应性矩阵做sfm一样的方法,即将4种解都进行三角化,然后从中选择出最合适的解。这里使用的是Initializer::ReconstructF函数。
五、集束调整
最后使用一个全局集束调整(BA),优化初始化结果。这一部分是在Tracking.cc中的CreateInitialMapMonocular()函数中,使用了如下语句:Optimizer::GlobalBundleAdjustemnt(mpMap,20);1
1
[/code]
如下图所示,PTAM和LSD_SLAM在这个数据集中,会将所有点初始化在一个平面上,而ORB_SLAM会一直等到有足够的视差,才使用基础矩阵,得到最正确的初始化。由于ORB-SLAM对初始化的要求较高,因此初始化时可以选择一个特征丰富的场景,移动摄像机给它提供足够的视差。另外,由于坐标系会附着在初始化成功的那帧图像的位置,因此每次初始化不能保证在同一个位置。
引用
[1]. O.D.Faugeras and F.Lustman. “Motion and structure from motion in a piecewise planar environment.” International Journal of Pattern Recognation and Artificial Intelligence, vol.2, no.03,pp.485-508,1988.[2]. R.Hartley and A. Zisserman, Multiple View Geometry in Computer Vision, 2nd ed. Cambridge University Press,2004.
相关文章推荐
- 转载:http://blog.csdn.net/u010128736/ ORB-SLAM2详解(五)局部建图
- GDI+ for VCL基础 -- 颜色调整矩阵ColorMatrix详解(转载http://blog.csdn.net/maozefa)
- 转载:http://blog.csdn.net/u010128736/ orb-slam2源码解析
- GDI+ for VCL基础 -- 颜色调整矩阵ColorMatrix详解(转载http://blog.csdn.net/maozefa)
- ORB-SLAM2详解(三)自动地图初始化
- ORB-SLAM2详解(三)自动地图初始化
- http://blog.csdn.net/lzwglory/article/details/49473013 spring中设计模式详解
- 转载两篇文章之二(从程序员到CTO所要培养的六种能力)作者:阿蒙 原文:http://blog.csdn.net/harrymeng/archive/2007/02/07/1503931.aspx
- dataTables-使用详细说明整理 (转载http://blog.csdn.net/mickey_miki/article/details/8240477)
- 杂兵马里奥 (转载自cping1982)(地址:http://blog.csdn.net/cping1982/category/455610.aspx)
- GDI中的坐标映射问题 (转载自http://blog.csdn.net/huawdai/archive/2002/01/15/6169.aspx)
- Epoll模型详解(转载 http://blog.163.com/huchengsz@126/blog/static/73483745201181824629285/)
- (六十二)Activity的启动模式(转载自http://blog.csdn.net/android_tutor/article/details/6310015)
- 转载出去:http://blog.csdn.net/han_xiaoyang/article/details/11969497
- 转载 http://blog.csdn.net/dengta_snowwhite/article/details/6418384
- 关于三种主流WEB架构的思考 (转载来源:http://blog.csdn.net/haohappy2004)
- 转载 注解@PostConstruct与@PreDestroy讲解及实例 - 云淡风轻、仅此一抹 - 博客频道 - CSDN.NET http://blog.csdn.net/yaerfeng/art
- 学习UpdatePanel控件-看原文有图,本文只为个人备忘(转载:http://blog.csdn.net/ILOVEMSDN/archive/2007/11/11/1879343.aspx)
- 搜索引擎技术之概要预览(转载自http://blog.csdn.net/v_july_v/article/details/6827391)
- 转载http://blog.csdn.net/jojoaric/archive/2006/10/17/1338763.aspx