在MATLAB中实现视觉大满贯
视觉同步定位和映射(vSLAM)指的是计算摄像机的位置和姿态的过程,对其周围环境,同时环境的映射。这个过程只使用视觉输入的相机。应用视觉大满贯包括增强现实、机器人、自动驾驶。对于一般的描述为什么摔上,以及它如何适用于不同的应用程序,看看大满贯是什么?
视觉SLAM算法大致分为两类,这取决于他们估计摄像机运动。间接的,基于功能的方法使用特征点的图像reprojection误差降到最低。直接的方法是使用图像的整体亮度光度误差降到最低。计算机视觉算法工具箱™提供函数来执行基于视觉大满贯。工作流由地图初始化、跟踪、本地映射,循环检测和漂移修正。
请注意
本文中描述的工作流程适用于由一个针孔摄像头拍摄的图像。使用视觉大满贯工作流与鱼眼相机拍摄的图像,鱼眼镜头转换为一个虚拟的针孔相机使用undistortFisheyeImage
函数。
术语用于视觉大满贯
视觉大满贯文献使用这些常用术语:
关键帧视频帧的一个子集,包含本地化和追踪线索。连续两个关键帧通常显示一个大的视觉变化由摄像机运动引起的。
地图点——3 d世界的列表点代表环境的地图从关键帧重建。
Covisibility图-图以关键帧为节点。两个关键帧的边缘连接如果他们共同映射点。的重量是共享地图点的数量的优势。
识别数据库,一个数据库存储的视觉word-to-image映射基于输入包功能。确定是否在过去已经访问过的地方通过搜索数据库的图像视觉相似查询的形象。
典型的基于视觉大满贯工作流
构建一个基于视觉大满贯管道的序列图像,遵循这些步骤:
初始化地图——初始化地图的三维点两个图像帧。计算三维点和相对相机的姿势用三角测量的基于二维特征对应关系。
跟踪特性,对于每一个新框架,估计摄像机构成当前帧的匹配特性特性在最后关键帧。
创建本地地图——如果你确定当前帧作为关键帧,创建一个新的3 d地图点。使用包调整完善相机姿势和3 d点。
为每个关键帧检测循环——检测循环通过比较当前帧使用bag-of-features之前的所有关键帧的方法。
正确的漂移,优化构成图正确的相机的漂移带来的所有关键帧。
图展示了一个典型的基于特征的视觉大满贯工作流。它还显示了数据存储的点或从管理的对象中检索数据。
关键帧和地图数据管理
使用视图设置,点集和管理关键帧和地图数据转换对象。
使用
imageviewset
测程法和关联对象来管理数据映射过程。对象包含数据作为一组视图和视图之间两两连接。对象也可以用来构建和更新构成图。每一个视图包括绝对相机构成和特征点提取的图像。每个视图,以其独特的标识符(视图ID),在视图设置形式构成的节点图。
每一个连接商店一个视图链接到另一个视图的信息。包括索引的连接之间的匹配特性的观点,连接视图之间的相对变换,计算测量的不确定性。每个连接形式构成图像的边缘。
使用一个
rigidtform3d
对象输入与imageviewset
存储的绝对相机姿态和相对相机姿态量距边缘。使用一个simtform3d
对象输入与imageviewset
存储的相对相机姿势loop-closure边缘。
使用
worldpointset
对象来存储3 d地图点和二维图像点之间的对应关系在相机视图。的
WorldPoints
的属性worldpointset
存储映射点的三维位置。的
对应
的属性worldpointset
商店视图id关键帧的观察地图点。
地图初始化
初始化映射,必须两个图像之间的匹配特性,估算相对相机的姿势,并满足最初的3 d世界。这个工作流通常使用“骗健壮的特性(冲浪)和面向快速旋转短暂(ORB)特征点的特性。地图初始化工作流程包括检测、提取、和匹配特性,然后找到一个相对相机的姿势估计,找到匹配特性的三维位置,和精炼初始地图。最后,存储生成的关键帧,在一个图像视图映射点集和一个点集世界,分别。
工作流 | 函数 | 描述 |
---|---|---|
1。检测 | detectSURFFeatures |
检测并返回一个冲浪功能SURFPoints 对象。 |
detectORBFeatures |
检测和返回一个ORB功能ORBPoints 对象。 |
|
detectSIFTFeatures |
并返回一个检测筛选功能SIFTPoints 对象。 |
|
2。提取 | extractFeatures |
提取特征向量及其对应的位置在一个二进制或强度图像。 |
3所示。匹配 | matchFeatures |
获得两个特征之间的匹配特性的指标集。 |
4所示。从匹配特征点估计相对相机的姿势 | estgeotform2d |
计算单应性从匹配点对。 |
estimateFundamentalMatrix |
估计基本矩阵的匹配点对。 | |
estrelpose |
计算相对相机的姿势,表示为rigidtform3d 对象,基于单应性或基本矩阵。的位置只能计算规模,所以两个摄像头之间的距离将1 。 |
|
5。找到匹配的特征点的三维位置 | 由三角形组成的 |
找到匹配的三维位置对无畸变的像点。 |
6。完善初始地图 | bundleAdjustment |
改进3 d地图分和相机的姿势reprojection错误最小化。 |
7所示。管理数据的初始地图和关键帧 | addView |
添加两种观点形成的特征点及其绝对对imageviewset 对象。 |
addConnection |
添加量距边缘连续之间的连接键定义的视图,由摄像机之间的相对姿态变换,形成的imageviewset 对象。 |
|
addWorldPoints |
添加初始点映射到worldpointset 对象。 |
|
addCorrespondences |
添加关键帧之间的三维到二维投影通讯和地图指向worldpointset 对象。 |
跟踪
跟踪工作流使用每一帧来确定何时插入一个新的关键帧。使用这些步骤和功能跟踪工作流。
工作流 | 函数 | 描述 |
---|---|---|
匹配提取特征 | matchFeatures |
匹配提取特征从当前帧特征在过去已知的三维位置的关键帧。 |
估计摄像机构成 | estworldpose |
估计当前相机姿势。 |
项目地图点 | world2img |
项目地图点观察到最后关键帧到当前帧。 |
搜索功能通讯 | matchFeaturesInRadius |
空间内搜索功能对应的约束。 |
完善相机带来 | bundleAdjustmentMotion |
细化相机对二维与三维通信通过执行motion-only束调整。 |
确定当地地图点 | 识别的观点和跟踪点对应点。 | |
寻找更多的功能对应 | matchFeaturesInRadius |
寻找更多的功能在当前帧对应,其中包含预计当地地图点。 |
完善相机带来 | bundleAdjustmentMotion |
细化相机对二维与三维通信通过执行motion-only束调整。 |
存储新的关键帧 | 如果你确定当前帧是一种新的关键帧,它和它连接添加到covisible关键帧imageviewset 。 |
特征匹配跟踪工作流的关键。使用matchFeaturesInRadius
函数返回时假定的匹配一个估计匹配特征点的位置。工作流中使用的两个匹配功能函数是:
matchFeatures
——返回匹配特性的指标在两个输入特性集。matchFeaturesInRadius
返回匹配特性的指标,满足空间约束,两个输入特性集。
对得到更多的匹配特性,增加的值MatchThreshhold
和MaxRatio
名称-值的参数matchFeatures
和matchFeaturesInRadius
功能。异常值对可以被丢弃后执行包调整本地映射步骤。
当地的地图
执行本地映射为每个关键帧。遵循以下步骤创建新的地图点。
工作流 | 函数 | 描述 |
---|---|---|
连接关键帧 | connectedViews |
找到covisible当前关键帧的关键帧。 |
搜索匹配连接的关键帧 | matchFeatures |
对于每一个无与伦比的特征点在当前关键帧,使用matchFeatures 函数与其他无与伦比的搜索匹配点在covisible关键帧。 |
计算新匹配位置 | 由三角形组成的 |
计算匹配的特征点的三维位置。 |
存储新地图点 | addWorldPoints |
添加新的映射指向worldpointset 对象。 |
三维二维通讯 | addCorrespondences |
添加新的三维到二维通讯worldpointset 对象。 |
更新量距连接 | updateConnection |
更新当前关键帧之间的联系及其与更多covisible帧特征匹配。 |
存储代表视图的三维点 | updateRepresentativeView |
更新代表视图ID和相应的特征指数。 |
商店距离限制和观看3 d点的方向 | updateLimitsAndDirection |
更新距离限制和意味着观看的方向。 |
完善构成 | bundleAdjustment |
完善当前关键帧的姿势,covisible关键帧的姿势,和所有的地图点观察到这些关键帧。为提高性能,只包括强连通,covisible细化过程中关键帧。 使用 |
删除离群值 | removeWorldPoints |
删除离群值映射点的大型reprojection错误worldpointset 对象。相关的三维二维通讯自动被删除。 |
这个表比较了相机的姿势,映射点,和相机的每个包的数量调整函数用于三维重建。
函数 | 相机的姿势 | 地图上点 | 数量的摄像头 |
---|---|---|---|
bundleAdjustment |
优化 | 优化 | 多个 |
bundleAdjustmentMotion |
优化 | 固定 | 一个 |
bundleAdjustmentStructure |
固定 | 优化 | 多个 |
循环检测
由于错误的积累,单独使用视觉里程计会导致漂移。这些错误可能导致严重的长距离不准确。使用基于大满贯有助于纠正漂移。要做到这一点,找到先前访问过的位置检测循环闭包。一个常见的方法是使用这个bag-of-features工作流:
工作流 | 函数 | 描述 |
---|---|---|
构建袋视觉单词 | bagOfFeatures |
构造一个袋的视觉词汇识别的地方。 |
创建识别数据库 | indexImages |
创建一个识别数据库,invertedImageIndex ,视觉词汇映射到图像。 |
确定循环关闭候选人 | retrieveImages |
搜索图片类似于当前的关键帧。识别连续图像作为循环关闭候选人如果他们类似于当前帧。否则,当前关键帧添加到识别数据库。 |
计算相对相机姿势循环闭合的候选人 | estgeotform3d |
计算候选关键帧之间的相对相机的姿势和当前关键帧,每个回路关闭候选人 |
闭环 | addConnection |
关闭循环通过添加循环闭合边缘相对相机的姿势imageviewset 对象。 |
漂移修正
的imageviewset
对象内部更新的姿势图视图和连接。尽量减少漂移,执行构成图优化利用optimizePoses
功能,一旦足够的循环闭包是补充道。的optimizePoses
函数返回一个imageviewset
对象与优化的绝对姿态转换为每个视图。
您可以使用createPoseGraph
作为一个MATLAB函数返回构成图®有向图
对象。您可以使用图形算法在MATLAB检查,查看或修改构成图。使用optimizePoseGraph
(导航工具箱)从导航工具箱™函数优化修改构成图,然后使用updateView
函数来更新相机视图中设置。
可视化
发展视觉大满贯系统,您可以使用下面的可视化功能。
函数 | 描述 |
---|---|
imshow |
显示一个图像 |
showMatchedFeatures |
在两张图片显示匹配的特征点 |
情节 |
绘制图像视图设置视图和连接 |
plotCamera |
画一个摄像机在三维坐标系 |
pcshow |
绘制三维点云 |
pcplayer |
可视化流三维点云数据 |
引用
[1]哈特利,理查德和安德鲁Zisserman。计算机视觉中的多视图几何。第二版》,剑桥:剑桥大学出版社,2003年。
[2]Fraundorfer、弗里德里希·大卫Scaramuzza。“视觉测程法:第二部分:匹配、健壮性、优化和应用。”IEEE机器人和自动化》杂志19日,没有。2(2012年6月):78 - 90。https://doi.org/10.1109/MRA.2012.2182810。
[3]Mur-Artal劳尔,j·m·m·蒙特埃尔和胡安·d·缓慢的。“ORB-SLAM:通用的和准确的单眼大满贯系统”。IEEE机器人31日。5(2015年10月):1147 - 63。https://doi.org/10.1109/TRO.2015.2463671。
[4]Kummerle、Rainer Giorgio Grisetti Hauke Strasdat,库尔特·Konolige, Wolfram Burgard。“G2o:图优化的总体框架。”In2011年IEEE机器人与自动化国际会议上2011)举行(“国际机器人与自动化会议”第四,上海,2011年5月,3607 - 13所示。纽约:电气和电子工程师学会。https://doi.org//10.1109/ICRA.2011.5979949。
另请参阅
功能
detectSURFFeatures
|detectSIFTFeatures
|detectORBFeatures
|extractFeatures
|matchFeatures
|matchFeaturesInRadius
|estgeotform2d
|estgeotform3d
|estimateFundamentalMatrix
|estrelpose
|estworldpose
|world2img
|由三角形组成的
|bundleAdjustment
|bundleAdjustmentMotion
|bundleAdjustmentStructure
|createPoseGraph
|optimizePoses