SLAM--PL-SLAM中基于线特征的初始化方法(LSD算法,LBD描述子,计算R和t)

2023-05-16

SLAM中基于线特征的初始化方法

  • 线特征的初始化
    • 直线段检测算法---LSD:a Line Segment Detector
    • 描述子---LBD:Line detection and description
    • 计算旋转矩阵
    • 三焦点张量计算t

线特征的初始化

ORB_SLAM2的东西差不多讲完了,接下来就讲讲其他开源代码的一些有趣的地方。最近看了以ORB为基础的点线特征的开源代码PL-SLAM( 翻译后论文),其中他利用线特征进行初始化,并在误差构建和PNP上做出了改动,PNP选用了EPNPL。其中为了让我的系统初始化更加鲁棒,我可能会用到线特征的初始化,所以去详细研究了一下具体的算法。具体的算法步骤如下:
1.通过LSD算法提取线特征
2.通过LBD算法获取线的描述子进行匹配
3.通过三帧之间的匹配关系来计算R
4.通过三焦点张量法来计算t
下面我们来一步一步看。
https://blog.csdn.net/u013341645/article/details/78668316

直线段检测算法—LSD:a Line Segment Detector

首先先来看看如何提取线特征。在直线检测上,其实之前有提到过一种算法----霍夫变换。但他的时间复杂度太高了,这里用的是LSD算法,据说可以在O(n)的时间复杂度能提取到亚像素极的直线。

我们知道,检测图像中的直线其实就是寻找图像中梯度变化较大的像素。LSD的目标在于检测图像中局部的直的轮廓,这也是我们称之为直线分割的原因。轮廓是图像中的某些特殊区域,在这些区域,图像的灰度从黑到白或者从白到黑的剧烈变化。因此,梯度和level-line是两个重要的概念,如下图所示:
在这里插入图片描述
算法首先计算每个像素的level-line angle以构成一个level-line 场。该场被分割为连通的若干个部分,它们方向近似相同并且在容忍度τ内,这样可以得到一系列regions,这些 regions被称为 line support regions(支持域)。如下图所示:
在这里插入图片描述
每一个line support region其实就是一组像素,它也是直线段(line segment)的候选。同时,对于这个line support region,我们可以观察它的最小外接矩形。直观上来讲,当一组像素构成的区域,特别细长时,那么这组像素更加可能是直线段。line support region的一个主惯性轴作为矩形的主方向,矩形的大小选择为覆盖整个区域。
在这里插入图片描述
矩形中的像素的level-line angle与最小外接矩形的主方向的角度差在容忍(tolerance)τ内的话,那么这个点被称作"aligned point"(同性点)。通过统计最小外接矩形内的所有像素数n和其内的alinedg points个数k,用来判定这个line support region是否是一个直线段。判定的准则使用的是a contrario approach and the Helmholtz principle。
在这里插入图片描述
算法的具体流程:
输入:灰度图

输出:一系列的直线分割结果。

1.以 s=0.8的尺度对输入图像进行高斯核采样。

2.计算每一个点的梯度值以及梯度方向(level-line orientation),其中gx和gy分别为水平和垂直方向梯度。

3.根据梯度值对所有点进行伪排序(pseudo-ordered),建立状态列表,所有点设置为UNUSED。

设置图像梯度强度范围到[0, 1023]大于1023的梯度强度,强制设置为1023,创建1024个链表,遍历整个梯度图,根据梯度强度,相同梯度值像素坐标放入同一张链表中,将1024个链表,按从大到小顺序,合成一张大链表(首部为1023链表,尾部为0)

4.将梯度值小于ρ的点状态表中相应位置设置为USED。

5.取出链表头部存储图像坐标位置,作为种子像素,

do:
a.以seed为起点,根据梯度角方向相似(搜索周围UNUSED并且方向在阈值[ -τ, τ]范围内的点),进行区域扩散。(每扩散一个像素,将该像素坐标从链表中删除,并且做标记(状态改为USED),之后新的区域扩散,无法再扩散到在像素)。
b.将扩散区域进行矩形拟合,R。
c.判断同性点(aligned pt)密度是否满足阈值D,若不满足,截断(cut)R变为多个矩形框,直至满足。
d.计算NFA(拟合矩形精度误差)。
e.改变R使NFA的值更小直至NFA <= ε ,R加入输出列表;如果改变了还不满足或者矩形区域太小,舍去。

6.继续回到第5步,从链表中,找到下一个种子点,从剩下图像进行区域扩散,至到遍历完全图,得到所有检测到的直线。

具体每一步的意义和步骤大家可以参考这篇文章.,讲的非常详细。

描述子—LBD:Line detection and description

提取到了直线,现在如何来做匹配呢?那就需要给与直线一个ID,通过ID来进行匹配,ORB中用的是brief描述子,那这里用的就是LBD描述子。
1.尺度空间中提取线段
为了克服在线检测碎片问题和提高大尺度变化的性能,我们的检测框架采用由对原始图像进行高斯下采样( with a set of 尺度因子and 高斯模糊 )的尺度空间金字塔组成(N层图像)。我们首先用Edline算法每层的尺度空间产生一组线。每条直线都有一个方向,它是由从直线左侧到右侧的大部分边缘像素点的梯度构成的。然后通过在尺度空间中找到对应的直线来组织它们。在尺度空间中所有的线,他们被分配一个唯一的ID,如果在图像中他们相关相同的事件,将其存储在一个称为LineVecs的向量中(即图像的同一区域具有相同的方向)。线检测方法 不同于Wang et al.[5] ,通过重新组织从尺度空间提取的所有的线段形成LineVecs,从而降低了图匹配问题的维数。最终提取的结果是一组LineVecs如下图:
在这里插入图片描述
如图1所示,每个Linevec可能包括尺度空间的多条线。为描述一个LineVec局部外观,对于其中的每条线,我们会在被提取的线段的每层图中产生一种线描述符。

2.条带(Band)来表示线的支持域
在octave image给出了线段,描述符将从线段支持域(LSR)计算。该支持区域被划分为一组条带{B1;B2;…;Bm},每个条带都是LSR的子区域并且他们之间的平行的,条代数m的和每个条带的宽度w,条带的长度等于线段的长度,如下图当m =5 ,w=3的LSR例子。
在这里插入图片描述
类似于 MSLD[11],引入两个方向构成a local 2D coordinate frame(局部二维坐标系),用于区分具有相反梯度方向的平行线并使描述符旋转不变。根据dl线的方向为 ,正交方向(垂直方向)dT 被定义为顺时针垂直的方向。该线的中点被选为这个局部坐标系的原点。LSR中的每个像素的梯度投影到这个局部框架:在这里插入图片描述

其中的g:image frame中的像素梯度, g`:local frame中的像素梯度。

此方法描述子区域的优点:首先,它对dl方向的小的位置变化更有鲁棒性,因为在这种情况下,带内图像的大部分内容保持不变,只有带边界略有变化。注意,这个特性很重要,因为一般来说,由于线路端点不稳定,线的位置精度在方向中dl要比dT方向低。第二,它的计算效率更高,因为每个条带之间在dl方向没有重叠,高斯权重直接应用于每一行,而不是每个像素。

3.构造条带描述符
在这里插入图片描述
每条条带的描述子BDj:通过其最近的两相邻行的条带Bj-1 ; Bj+1来计算 。特别是,对于在顶部和底部的条带带B1和Bm,在计算B1和Bm的描述子时行在LSR之外不会被考虑在内。(所以下面n的取值会把j=1||m单独出来)

BDj的计算(其实就是描述的上下左右四个方向):
在这里插入图片描述
k:表示在条带Bj的第k行,我们累积的像素的梯度在这行;在这里插入图片描述
为高斯权重。

条带描述矩阵the band description matrix (BDM):
在这里插入图片描述
BDj由BDMj矩阵的均值向量Mj and标准方差 Sj 得到:
在这里插入图片描述
LBD的均值部分和标准方差部分由于其大小不同,分别进行规范化处理。此外,为减少非线性光照变化的影响,对LBD每个维度的进行抑制,使它小于一个阈值(经验:0.4的是一个很好的值)。最后,我们重新规范约束向量得到单元的LBD。

计算旋转矩阵

得到了匹配的线段之后就用论文中的方式来计算R和t了。
在这里插入图片描述
现在考虑上图的建立,其中由端点P, Q定义的线段投影到三个相机图像帧中。用{p1,q1},{p2,q2},{p3,q3}作为在每个视图中线段端点的投影点,用I1,I2,I3∈R3表示从投影的端点计算而来的直线参数。
假设连续两个相机位姿之间小的且连续的旋转,这样使得从第一个相机视图到第二个相机视图的旋转和从第二个相机视图到第三个相机视图的旋转相同。在这个假设之下,我们可以表示这三个相机旋转为:R1=RT,R2=I,R3=R,I是3×3的单位矩阵。
注意,线系数Ii,i={1,2,3}也代表了向量的参数,该向量垂直于由投影中心Oi和投影点pi,qi形成的平面。这样的两个向量Ii的叉乘将和直线P,Q平行,同时与第三个矢量正交,所有这些矢量经过适当的旋转并放入到公共参考系中。这个约束可以写为:
在这里插入图片描述

另外,对于小的旋转,我们近似 R为:
在这里插入图片描述
对于这个参数化,有三条匹配线,我们将会有三个含有三个未知数 r1,r2,r3的二次方程。最多可以得到8个解。

三焦点张量计算t

对每个可能的旋转矩阵,我们可以通过三焦张量方程来获得 t1,t3。假设 t2=0。我们评估8个可能解,然后获取使得约束方程最小的那个解。

在这里插入图片描述
如上图所示,图像中三条对应直线的反向投影必相交于空间的一条三维直线。记三条直线为l1,l2,l3,相机对应的位姿矩阵P=[I|0],P=[A|a1],P=[B|b4]。有如下关系:
在这里插入图片描述
由于三个平面相交于一个直线,三平面组成的矩阵,满足秩为2的约束。
在这里插入图片描述
展开该矩阵可得:
在这里插入图片描述
由秩为2,即可写成:
在这里插入图片描述
根据第二行可知:
在这里插入图片描述
其中k为尺度因子,将上式代入第一行:
在这里插入图片描述
从而l的第i个坐标可以写成:
在这里插入图片描述
记:
在这里插入图片描述
则对应直线有如下关系:
在这里插入图片描述
三个矩阵的集合{T1,T2,T3}组成三焦点张量的矩阵表示形式。三焦点张量由3个3x3的矩阵组成,由27个元素,消去尺度因子及射影坐标系的影响,三焦点张量只有18个自由的。

在论文中,作者说道:在使用三焦点张量方程求解平移分量时,获得足够的独立约束,我们需要两个额外的线对应关系,因此,我们算法所需的线特征匹配数量是5。

这就是线特征初始化的步骤。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SLAM--PL-SLAM中基于线特征的初始化方法(LSD算法,LBD描述子,计算R和t) 的相关文章

  • slam数学基础——最小二乘

    一 前言 1 最小二乘是一类特殊形式的最优化求解问题 相比于其他优化问题 求解方式比较简洁 2 最小二乘被广泛应用于各种实际问题的建模 在求解实际工程问题中有着广泛的应用 例如 slam 中随处可见最小二乘的声影 二 线性最小二乘法 1 预
  • ROS STAGE教程2(地图定义和GMAPPING建图)

    目前用在ROS Kinetic上的stage版本为4 1 官方教程http rtv github io Stage modules html 用户可以用stage或者gazebo来创建地图和机器人 传感器模型来进行仿真 并与自己的SLAM模
  • 基于深度相机的三维重建技术

    本文转载自http www bugevr com zblog id 14 原创作者bugeadmin 转载至我的博客 主要是为了备份 日后查找方便 谢谢原创作者的分享 三维重建 3D Reconstruction 技术一直是计算机图形学和计
  • 【SLAM】卡尔曼滤波(Kalman Filter)

    卡尔曼滤波 Kalman filter 一种利用线性系统状态方程 通过系统输入输出观测数据 对系统状态进行最优估计的算法 由于观测数据中包括系统中的噪声和干扰的影响 所以最优估计也可看作是滤波过程 卡尔曼滤波器的原理解释如下 首先 我们先要
  • 【SLAM】libQGLViewer:VS 2019 + Qt 5.14.2 + Win 10 配置

    libQGLViewer 2 7 2 VS 2019 Qt 5 14 2 Win 10 配置 注意 这次配置没有完全成功 编译25个成功 一个失败 失败的是 qglviewerplugin qglviewerplugin 是一个可选控件 不
  • vscode配置eigen3

    目录 1 头文件包含 2 c cpp properties json 3 CMakeList txt 4 完整代码 1 头文件包含 Eigen 核心部分 include
  • 激光SLAM7-基于已知位姿的构图算法

    1 通过覆盖栅格建图算法进行栅格地图的构建 1 1 Theory 1 2 code 这里没有判断idx和hitPtIndex是否有效 start of TODO 对对应的map的cell信息进行更新 1 2 3题内容 GridIndex h
  • 关于GPS、惯导、视觉里程计的几个定义

    1 首先写几个定义 惯性导航系统 Inertial Navigation System INS 全球定位卫星系统 Global Navigation Satellite System GNSS GNSS 包括全球定位系统 Global Po
  • 互转(经纬度、地心坐标、东北天坐标)

    Part1三种坐标系介绍 经纬度坐标 假设空间某点P 用经纬度表示的话 你们B代表纬度 L代表经度 H代表大地高 纬度B P点沿着地球法线方向与赤道面的夹角 向北为正称为北纬 0 90 向南为负称为南纬 0 90 实际表示可以用 90 90
  • IMU预积分的一些理解

    IMU预积分 算是比较简单的一个算法 无奈网上找到的资料都讲的晦涩难懂 看明白了也觉得不过如此 讲一下我的理解 整体流程 1 推导IMU离散运动方程 2 根据离散运动方程 进行预积分 并将预积分的误差项拆分出来 因为我们在定义误差的时候 有
  • Lego-LOAM IMU坐标系变换的详细记录

    Lego LOAM IMU坐标系变换的详细记录 0 基础知识 1 IMU 重力加速度消除 2 相机坐标系 camera 到初始坐标系 camera init 的转换 最近看了Lego LOAM 的IMU部分 没看懂IMU的坐标系变换 看其它
  • 无人车

    1 无人车四大核心技术 自动驾驶实际包含三个问题 一是我在哪 二是我要去哪 三是如何去 第一个问题是环境感知和精确定位 无人车需要的是厘米级定位 厘米级定位是无人驾驶的难点之一 不光是车辆本身的语义级定位 还有一个绝对坐标定位 第二个问题是
  • 二.全局定位--开源定位框架livox-relocalization实录数据集测试

    相关博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 基于固态雷达的全局
  • 【Pytorch论文相关代码】使用SOLD2预训练好的模型检测与匹配线段(自己的数据集)

    文章目录 前言 使用流程 检测与匹配结果 前言 论文链接 SOLD2 Self supervised Occlusion aware Line Description and Detection 论文源码 https github com
  • Ubuntu18.04安装pcl(过程/坑记录式教程)

    Ubuntu18 04安装pcl 1 下载pcl 2 安装依赖项 3 编译 4 安装 5 网上教程说要安装QT5和VTK 但按照本文的 本文记录了安装时出现的问题 出错的安装命令也记录了 建议浏览一遍再参考 不要错用了错误的指令 1 下载p
  • Object SLAM: An Object SLAM Framework for Association, Mapping, and High-Level Tasks 论文解读

    是一篇来自机器人顶刊T RO的文章 发表于2023 5 An Object SLAM Framework for Association Mapping and High Level Tasks 论文 An Object SLAM Fram
  • ORB-SLAM2:基于可识别特征的自主导航与地图构建

    ORB SLAM2 基于可识别特征的自主导航与地图构建 ORB SLAM Tracking and Mapping Recognizable Features 转自 http blog csdn net cicibabe article d
  • SLAM练习题(十一)—— G2O实战

    SLAM 学习笔记 写在前面的话 算是一点小小的感悟吧 估计位姿的方法有线性方法和非线性方法 线性方法就是特征点法中的2D 2D的对极约束 3D 2D的PnP问题 非线性方法有BA优化 它将位姿的估计问题转换成了一个误差关于优化量的最小二乘
  • ORB_SLAM2运行官方数据集/自己数据集

    官方数据集运行结果 WeChat 20230210194425 可以正常运行 自己数据集运行结果 自己的数据集 主要是用手机摄像头采集的实验室进行了一下简单的运行 可以成功运行 但是由于查看的相关程序的是死循环不能像运行官方数据集那样完整保
  • 什么是深度学习的无监督学习与有监督学习

    无监督学习 深度学习中的无监督学习方法是一种训练算法 它在没有标注输出的情况下从输入数据中学习模式和特征 这种方法的核心是探索和理解数据的内在结构和分布 而不是通过已知的输出来指导学习过程 无监督学习在深度学习领域有许多不同的形式和应用 以

随机推荐

  • FreeRTOS(三)启动流程

    启动流程 FreeRTOS的主要两种启动流程 在 main 函数中将硬件初始化 xff0c RTOS 系统初始化 xff0c 所有任务的创建这些都弄好 最后启动 RTOS 的调度器 xff0c 开始多任务的调度 xff08 先创建 xff0
  • echarts参数详细介绍

    文章目录 title xff1a 标题grid配置项 xff1a 图标离容器的距离tootip xff1a 提示xAxis xff1a x轴yAxis xff1a y轴legend xff1a 图表旁边的文字series xff1a dat
  • 微信云开发报错(Error: ResourceNotFound.FunctionName, FunctionName 指定的资源不存在。 (9f4aff33-7528-43e2-b0db-d273d)

    在微信小程序云开发时 xff0c 上传login的时候报错 Error ResourceNotFound FunctionName FunctionName 指定的资源不存在 9f4aff33 7528 43e2 b0db d273d0d6
  • 在阿里云搭建CENTOS7系统以及图形界面

    1 搭建CentOS7操作系统服务器 首先要购买服务器 xff0c 推荐学生认证可以获得好几个月的免费服务器 略去具体的过程 阿里云默认的系统不是CentOS7 xff0c 所以需要先将操作系统改成CentOS7 在实例的基本信息中 xff
  • VSCode 配置git 环境

    VSCode 配置git 环境 安装插件 查询Git 安装路径 配置json 文件 安装插件 git history 打开 git bash 下面展示一些 内联代码片 查询git 路径 where git where git 配置json
  • 模拟实现trim 方法,去除字符串两端的空格

    思路 从字符串的两端分别遍历 xff0c 找寻第一个非空字符记录非空字符的索引截取头部第一个非空字符到尾部第一个非空字符串之间的内容 span class token keyword function span span class tok
  • git token使用

    2021年8月13日 xff0c git不再支持密码方式验证 xff0c 而是建议使用token token生成 个人设置 gt Settings gt Personal access tokens gt Generate new toke
  • 网页实现无插件RTSP 摄像头在线播放

    网页无插件RTSP 摄像头在线播放 为什么要求无插件1 xff0c flv js实现2 xff0c flv js的利弊延迟吃资源对网络要求高流可复用对声音处理比较麻烦 3 xff0c webrtc的利弊网络相关的资料少延迟低不吃资源 总结项
  • 计算机嵌入式开发技术考试错题集

    选择题 xff08 以前写的 xff0c 现在翻到了发出来 xff09 1 UTF 16采用的是双字节可变长编码 2 ARM处理器的7种类型的异常中 xff1a 最高的是 复位 xff1b 最低的是 未定义指令UND 和 软件中断SWI x
  • ROS——TF介绍及应用

    TF 的简单介绍 TF xff08 transform xff09 是一个允许用户时刻跟踪多个坐标架构的包 xff0c 能及时地维持树结构中坐标帧之间的关系 xff0c 并允许用户在任何时间点变化任何两个坐标帧之间的点和变量等 目前 TF
  • 计算机保研复习专业课篇(408+数学+部分专业课)

    1 计组 1 xff09 总线是什么 1 xff09 总线是一组能功能部件之间分时共享的公共信息传送线路 分时 共享是它的两大特点 2 xff09 分时是指同一时刻只能有一个部件向总线上发出信息 3 xff09 总线分为三大类 xff1a
  • STM32 四轴无人机的设计——代码整体设计

    1 前言 从现在开始我们要接触一个完整的工程 xff0c 所以我们要对整个工程进行分析 xff0c 将硬件设计 软件设计模块化 xff0c 一个模块一个模块的完成 xff0c 最后将各个模块融合在一起 xff0c 就是我们整个工程 模块化设
  • STM32-串口通信详解

    目录 前言 一 通信接口背景知识 1 并行通信和串行通信 2 串行通信的分类 二 STM32的串口通信基础 1 串口通信接口 2 串口通信框图 3 串口通信相关寄存器 4 波特率计算方法 三 库函数配置 1 串口配置一般步骤 总结 前言 众
  • 嵌入式裸机按键和CPU的中断系统学习笔记

    准备工作 一 按键介绍与硬件连接 按键介绍 按键是常见的外部中断设备 xff0c 类似于我们电路中的开关 一般的按键都有4个引脚 xff0c 这4个引脚成2对 xff1a 其中一对是常开触点 xff08 不按则断开 xff0c 按下则闭合
  • web前端——CSS实现加载页面效果

    先上图 html代码 span class token tag span class token tag span class token punctuation lt span div span span class token attr
  • docker学习之如何删除docker中的镜像

    目录 查找需要删除的镜像 直接删除 查询所有docker容器 停掉所需要删除镜像的容器 删除镜像 镜像成功删除 注意事项 xff1a 在安装调试完毕docker之后 xff0c 想要删除一些已经下载的镜像 发现怎么都删除不掉 xff0c 看
  • 德鲁周记06--VSLAM从入门到入坟

    VSLAM入门 介绍基础知识三维空间的刚体运动欧式变换四元数欧拉角 李群与李代数线性拟合相机单目相机双目相机深度相机 基本框架视觉里程计特征匹配ORB直接法对比 后端优化EKFBA Bundle Adjustment 回环检测建图 因为研究
  • imgcat

    安装 https pypi org project imgcat pip span class token function install span imgcat 使用
  • 德鲁周记12--带有颜色追踪功能的turtlebot(ROS+反向投影+camshift)

    带有颜色追踪功能的turtlebot 主要技术和算法颜色识别和追踪模块反向投影算法camshift 控制板块 xff08 ROS xff09 代码算法模块控制模块 这个是我前段时间完成的基于turtlebot实现跟随特定颜色的物体实现自主移
  • SLAM--PL-SLAM中基于线特征的初始化方法(LSD算法,LBD描述子,计算R和t)

    SLAM中基于线特征的初始化方法 线特征的初始化直线段检测算法 LSD xff1a a Line Segment Detector描述子 LBD xff1a Line detection and description计算旋转矩阵三焦点张量