天天看点

视觉slam线匹配算法

线特征广泛存在于人为环境中,可以提供额外的约束。视觉SLAM中线特征的挑战是先特征的匹配问题。

SLAM线特征学习(1)——基本的线特征表示与优化推导

SLAM线特征学习(2)——线特征初始化和最小表示 - 知乎

LSD是一种局部提取直线的算法,速度比Hough要快。 LSD是一种直线检测分割算法,它能在线性的时间内得出亚像素级精度的检测结果。该算法被设计成自适应模式,无需手动调参。

opencv使用头文件及命令空间

#include <opencv2/line_descriptor/descriptor.hpp>
using namespace cv::line_descriptor;
           

LBD: line binary descriptor 线二进制描述符

  • opencv描述线特征的二进制描述子
Ptr<BinaryDescriptor> lbd = BinaryDescriptor::createBinaryDescriptor();
lbd->compute(img, keylines, mLdesc);   //mLdesc是矩阵格式
           

比较著名的点线特征融合的VSLAM方案:

  • PL-SLAM: a Stereo SLAM System through the Combination of Points and Line Segments(双目纯视觉)开源代码
  • PL-VIO: Tightly-Coupled Monocular Visual–Inertial Odometry Using Point and Line Features(单目视觉惯性)

    开源代码

PL-SLAM: a Stereo SLAM System through the Combination of Points and Line

This paper proposes PL-SLAM, a stereo visual SLAM system that combines both points and line segments to work robustly in a wider variety of scenarios, particularly in those where point features are scarce or not well-distributed in the image.

PL-SLAM leverages both points and line segments at all the instances of the process: visual odometry, keyframe selection, bundle adjustment, etc. We contribute also with a loop-closure procedure through a novel bag-of-words approach that exploits the combined descriptive power of the two kinds of features.

视觉slam线匹配算法

通过线特征的长度和方向的比较,通过剔除异常值来解决特定于线段的跟踪和匹配问题,而对于残差计算,我们用线段的端点坐标表示地图中的线段。因此,通过图像平面上这些端点的投影与与被观测线段相关的无穷多条直线之间的距离来计算被观测线段与其在地图中的对应直线之间的残差。这样,我们就可以构建一个一致的成本函数,无缝地包含点和线特性。这两种特征也被用于在相机导航期间鲁棒地检测循环闭合,这是一种新的单词包(BoW)方法,它结合了使用它们执行位置识别的优点。

B. 特征跟踪

从一系列立体图像帧中跟踪图像特征(点和段),并计算它们的三维位置及其由协方差矩阵表示的相关不确定性。然后将三维地标投影到新的摄像机姿态,并且最小化投影误差,以获得与该估计相关的摄像机姿势增量和协方差。这个过程在每一个新的帧中重复,只执行帧到帧的VO,直到一个新的KF被插入到映射中。

点特征:对于特征点的处理,由于其高效性和良好的性能,我们采用了ORB检测器和描述符。为了减少异常值的数量,我们只考虑互为最佳匹配的测量值,即左图像中的最佳匹配对应于右图像中的最佳匹配。为了保证对应关系足够有意义,还检查了描述空间中两个最近匹配之间的距离是否高于某个阈值,该阈值设置为最佳匹配距离的两倍。还使用bucketing方法确保在输入图像上公平分布点,该方法将图像分成16个桶,并尝试在每个桶中添加至少20个特征。

线特征:采用直线段检测器(LSD),具有较高的精度和重复性。然而,它耗时,这是它在实时应用方面的主要弱点。为了缓解这种情况,我们在两幅立体图像中以并行框架检测线段。对于立体匹配和帧到帧跟踪,我们首先计算每行的LBD描述符,然后根据它们的局部外观特征进行匹配。类似于点的情况,我们检查两个特征是否相互最佳匹配,以及最好的两个匹配在描述空间中是否充分分离。我们利用线段所提供的有用的几何信息来过滤掉那些方向和长度不同的直线匹配,以及那些在端点差异上有很大差异的直线匹配。

运动估计

一旦建立了两个立体帧之间的对应关系,就把关键点和线段从第一帧投影到下一帧。然后通过一个鲁棒的高斯-牛顿最小化线和关键点投影误差迭代估计摄像机的自我运动。为了处理异常值,使用了一个伪Huber损失函数并执行了两步最小化。

测试数据集:EuRoC or KITTI

PL-SLAM将点和线特征应用在slam全过程。通过线特征的长度和方向的比较,通过剔除异常值来解决特定于线段的跟踪和匹配问题,而对于残差计算,我们用线段的端点坐标表示地图中的线段。

PL-VIO: Tightly-Coupled Monocular Visual–Inertial Odometry Using Point and Line Features

将线特征和VIO结合在一起的文章,文中使用普吕克矩阵进行线特征的初始化,对于中值法预积分和线特征的最小表示有着相当详细的推导

SLAM中线特征的参数化和求导 - 知乎

整个代码基于vins-mono的基础上改动,主要表现在除了原有的feature_tracker节点外,独立新增了一个line_feature_tracker节点(用于提取和发布线特征);并充实了feature_manager(添加了linefeature)和后端对线特征的ceres优化类。

普吕克坐标表示用线特征方向向量和线特征与相机坐标系原点所构成的平面的法向量表示

PL-SVO: Semi-Direct Monocular Visual Odometry by Combining Points and Line Segments(2016)

文章下载

开源代码

线特征大神Ruben Gomez-Ojeda将线的约束添加在SVO中,因为SVO框架的特殊性,作者主要将线特征当做两个3D端点进行处理。VO是一个相当特别的框架,一个很重要的点在于它在track的过程(sparse image alignment)中并没有像其他框架一样需要知道特征点的关联关系,这些点的关联关系都是通过极线搜索后期绑定的,因此SVO代码一定程度上兼顾了“短期约束”(直接法)和“长期关联”(特征点法)的两个优势。

在PL-SVO的工作中,作者并没有使用普吕克坐标系表示直线,主要的原因笔者总结如下:

  1. 作者希望在track的过程中也使用线特征,image alignment的主要思路是把两个投影点的光度误差作为损失函数,如果使用普吕克坐标系,那我们只能知道3D线在2D图像中的方向,而无法得到具体的点;
  2. 通常使用普吕克坐标系的话我们会用LSD的线段检测方法进行图像中线段的提取,但是提取到的线的端点是not repetitive的,这个对于普吕克表示法的初始化没有影响,但是对于想用具体点的作者而言,这个方法是不能接受的;

继续阅读