CL关于ORB_SLAM的那些事(ORBmatcher)

OpenCV中ORB特征点检测和匹配简单用法 ORB特征点检测和匹配 阅读详情

ORBmatcher部分的学习

昨天读了关键点提取的每一行代码,今天当然是读匹配方面的代码了,开始今天的学习,现在是北京时间2019年08月09日上午7点49分。

按照规矩,先来看一下,该类中维护的变量和方法。
这里面就只有一个ORBmatcher的类,今天注意了一下该头文件内所包含的其他头文件,有MapPoint、KeyFrame和Frame,哪里会用到呢?接着往下看…

  1. 自己提供的匹配构造函数,参数列表是默认参数,0.6和true
  2. 计算描述子之间的汉明距离
  3. 寻找MapPoint和当前帧内关键点的匹配关系,在track中会用到
  4. 与3相同的函数名,但是参数列表不一样(函数重载),用于重定位,当传感器丢了之后,会将关键帧观测到的MapPoint投影到当前帧中,寻找匹配关系
  5. 通过词袋寻找当前帧与关键帧之间的匹配关系,这个函数用于重定位,用的类似暴力匹配
  6. 通过词袋寻找关键帧之间的匹配关系,主要是用在回环检测方面
  7. 单目初始化时关键点匹配的函数
  8. 匹配用于三角化MapPoint,这边主要是用到了极线约束
  9. 寻找匹配关系,用于计算sim3,MapPoint必须是在两帧关键帧中都能被观测到
  10. 将MapPoint投影到关键帧中,寻找重复出现的MapPoint
  11. 对10进行了重载,用计算得到的sim3将MapPoint投影到关键帧中,寻找重复出现的MapPoint
    ###########我是一条分割线,分割线以下的是protected的函数方法############
  12. check点到极线距离,参数列表:两个kp,基础矩阵和一帧关键帧
  13. 观测视角余弦值半径
  14. 计算计算三个最大值????这是啥???

维护的变量有

  1. low阈值
  2. high阈值
  3. histo的长度
    ###########我是一条分割线,分割线以下的是protected的变量############
  4. float mfNNratio 暂时不知是啥含义
  5. bool型的check角度

开始今天的重点了,function by function
首先是给三个静态变量赋值,high阈值是100,low阈值是50,histo长度为30。

ORBmatcher()
构造函数,参数列表默认参数,并对protected的两个变量进行赋值,没有具体的实现函数体。

SearchByProjection()
参数列表:当前图象帧、MapPoint指针类型的vector、常float阈值
匹配数目初始化为0
循环遍历MapPoint,一方面,判断该MapPoint是否在视野中用于跟踪;另一方面,判断这个MapPoint是否是坏点(这边对于坏点的定义等看到MapPoint之后再解释,这边先知道有这么个判断依据)。只有排除这两种情况,该MapPoint才有资格被考核。函数往下执行就是获取该MapPoint跟踪的尺度层,调用RadiusByViewingCos()计算观测窗口的半径。最后得到的观测窗口的半径需要根据th与1的关系,来决定是否要与th相乘,得到最终的半径。
调用Frame中的GetFeaturesInArea()函数,获取以该MapPoint投影位置为中心,r范围内的特征点,其实这些点都是与该点匹配的候选点。
获取该MapPoint的描述子,对候选点进行遍历,找出最匹配的第二匹配的点。具体的算法是:

  1. 记录该关键点的index
  2. 判断这个关键点是否被三角化成MapPoint,如果是被三角化之后,继续判断其被观测过几次。如果被多次观测到,就说明这个关键点与某一个关键点已经是较好的匹配了,那么这个点不可能与现在这个MapPoint有匹配关系,直接continue。
  3. 判断该点在右图中的值,如果在右图中的值大于0,继续判断该点在右图中的投影位置,计算投影位置x方向与右图上本身的值的差值,将这个值与观察窗口尺寸r作比较,如果大于的话,就说明在该MapPoint的视角中就不会观测到这个关键点,直接continue
  4. 通过重重考核,现在获取该关键点的描述子,然后调用DescriptorDistance()函数,计算这个描述子之间的汉明距离,距离越小,就表明这两个点越相似。
  5. 比较获得最匹配和次匹配,最匹配的会记录下它的index
  6. 如果最匹配的距离小于等于high阈值,就会判断最匹配和次匹配的点所在的金字塔层数是否相同以及最匹配的距离是否大于mfNNratio因子下的次匹配距离,这个MapPoint没找到匹配,继续循环下一个MapPoint寻找匹配
  7. 通过所有考核的MapPoint将被放入该关键点索引index处的mvpMapPoints内,然后匹配点数量自增1。
  8. 最后返回匹配上的关键点数量

RadiusByViewingCos()
根据观测的角度的余弦值来给定r的大小
如果接近零度时,r为2.5
不然,r为4.0

CheckDistEpipolarLine()
check极线距离,参数列表为两个关键点,基础矩阵和关键帧
将kp1通过基础矩阵映射到kp2图像中的极限方程
利用点到直线的距离公式,就按kp2到kp1极线的距离,程序里是计算了距离的平方。如果距离小于一定的阈值,就返回true,不然就是不符合极线约束,返回false。

SearchByBoW()
参数列表:关键帧、当前帧和MapPoint类指针的容器

  1. 从关键帧中获取其包含的MaPoint的匹配关系
  2. 定义了MapPoint匹配的容器,初始化为NULL
  3. 获取该关键帧的词汇特征
  4. 定义了matches匹配点对数
  5. 定义了rotHist的数组容器,看这个变量的命名,应该是用于生成直方图的
  6. 定义了因子,HISTO的长度的倒数
  7. 定义关键帧和当前帧词袋方面的迭代器,从begin到end
  8. 循环遍历关键帧和当前帧中各个词袋信息。

这里面暂时还没了解到词袋方面的知识,所以这边暂时是从代码的角度进行理解,带有一种猜的感觉。所以…
在循环中,它先判断词袋里的first的状态,分了三种情况,两者相等、关键帧的比当前帧小、其他
在两者相等的情况下,获取second的内容,通过second来找到关键帧中的MapPoint的index,这对后面描述子的获取很重要。对MapPoint的判断和上文的寻找匹配类似,然后循环计算描述子之间的距离,下面的过程与上文类似,不同的是这边还要进行角度的核对,计算匹配上的点角度之差。根据角度差生成一张直方图,bin从0到30,nmatches++
在关键帧的first小于当前帧的first时,将KFit = vFeatVecKF.lower_bound(Fit->first);
其他情况就正好反过来。
最后调用ComputeThreeMaxima()计算得到三个索引值,剔除一些误匹配。
最后返回匹配上的点对数。

SearchByProjection()
虽然这个函数和上文的函数名一样,但是这边的函数参数列表为:关键帧、sim3(带尺度信息的Se3)、MaPPoint、点对的匹配关系和一个阈值,这个函数主要是用在loop closure上的。具体的算法过程:

  1. 取关键帧的内参
  2. 从sim3中分解出带尺度的旋转矩阵、尺度、去尺度的旋转矩阵、去尺度的平移矩阵和传感器中心的世界坐标
  3. set内存放匹配上的MapPoint
  4. 初始化nmatches为0
  5. 取出该关键帧中已经找到的MapPoint,后面如果发现已经有了的话就不用考虑了。
  6. 获取该MapPoint的世界坐标并将其转换到传感器坐标系中
  7. 判断该点的深度值是否为负
  8. 将该点进行投影获取它的图像坐标
  9. 判断该点是否还在图像内
  10. 计算该点的距离尺度不变区域
  11. 判断这个点是否在该区域内
  12. 观测角度也必须小于60度
  13. 根据距离,计算该点在该关键帧下的层数
  14. 根据层数获取其尺度因子,计算其有可能的匹配区域
  15. 获取该区域内的特征点,判断该点是否已经有匹配关系,判断该点所在的金字塔层数,计算描述子之间的距离,找出组匹配的index
  16. 最后确定是否能匹配的上,还需要最匹配的距离小于规定的阈值
  17. 最后返回匹配上的点对数量

SearchForInitialization()
这个函数是用在单目初始化的特征点匹配
参数列表:两帧Frame、之前的匹配点、1到2的匹配关系和窗口的大小
初始化nmatches为0
初始化1到2的匹配关系为-1
定义 rotHist直方图信息数组
初始化匹配距离和2到1的匹配关系
找出之前匹配的在F2中的区域,取得该区域内的所有特征点,计算两个描述子之间的距离,获得最匹配和次匹配。
两个距离阈值判断,判断2到1是否有匹配,如果没有就直接添加匹配关系;如果有,就将原来1到2的匹配剔除。反正就是挑距离最小的匹配点。
进行角度的check,这边也是调用了ComputeThreeMaxima()函数,进行了index的计算,具体计算过程等看到这个函数再了解。这边也相当于是对匹配关系进行剔除。
最后更新之前匹配的点
返回匹配上的点对数

SearchByBoW()
参数列表:两帧关键帧和1到2的匹配关系
整个函数与上文的同名函数相比,除了参数列表之外,其中的算法过程是一模一样的,所以参考上文的同名函数就可以了。

SearchForTriangulation()
该函数的参数列表:两帧关键帧、两帧之间的基础矩阵、匹配点对和只是双目的标志位。

  1. 取两帧的特征向量
  2. 取第一帧世界坐标系下的传感器中心坐标
  3. 取第二帧传感器的旋转和平移矩阵,计算第二帧传感器的中心坐标,通过投影矩阵得到图像中心的坐标吗????不了解额
  4. 准备开始各种匹配的参数
  5. 匹配过程和用词袋的差不多,也是分了三种情况,主要是first相同的情况,如果右图有值,就将bStereo1标记为true,如果传入的参数bOnlyStereo为true,但是bStereo1为false,那么这个MapPoint将不会被匹配
  6. 取那个MapPoint对应的关键点和关键点的描述子
  7. 取第二帧内的MapPoint、对应的关键点和关键点的描述子,如果该MapPoint已经有了匹配点或者是单独MapPoint,这个MapPoint将会被忽略
  8. 如果该点在右图中有值,就将bStereo2标记为true,如果传入的参数bOnlyStereo为true,但是bStereo2为false,那么这个MapPoint将不会被匹配
  9. 取那个MapPoint对应的关键点和关键点的描述子
  10. 计算两个MapPoint之间的相似度,先剔除一些相似度很小的点
  11. 当相似度满足一定的阈值要求之后,继续进行细致地考量: 这边的有一个if语句,只有当bOnlyStereo为false时,且这两帧图像在右图上都没有像素值时,才会执行。它要保证被匹配的那个关键点离图像中心的距离大于100倍的尺度因子。
  12. 检查极线距离,满足要求的就记录下匹配上的关键点索引和距离值
  13. 和上面的匹配函数类似,用直方图进行误匹配的剔除。
  14. 最后记录匹配信息,返回匹配的点对数

Fuse()
函数的参数列表:一帧关键帧、MapPoint和常阈值

  1. 获取当前关键帧的旋转矩阵和平移矩阵
  2. 取其传感器参数的内参
  3. 取该关键帧的传感器中心坐标(世界坐标系下)
  4. 初始化nFused为0
  5. 查看现有MapPoint的数量
  6. 循环遍历现有的所有MapPoint,判断一下点是否在关键帧中。
  7. 获取该点在世界坐标系下的坐标,计算转换后的坐标,该点的深度值必须是大于0
  8. 将其投影到图像坐标系下,判断其是否在图像中,换算到右图的u坐标,获取尺度不变的距离范围。
  9. 获取该点与传感器中心的矢量坐标,计算得到距离
  10. 观测该点的传感器视角必须是小于60度
  11. 根据距离信息和关键帧信息猜测该点所在的金字塔层数
  12. 再根据层数来大概猜测观测区域的尺寸,获取该观测区域的所有的特征点
  13. 获取当前匹配点的描述子,循环遍历那些待匹配的关键点,先是判断两者是否处于同一层的金字塔,再看一下该待匹配点在右图中的值是否大于等于0
  14. 如果满足条件,在考虑距离时加入右图值;如果不满足条件,就直接是像素坐标的距离。阈值比较时,要考虑尺度因子,如果不满足阈值要求,那么这个点就不是匹配点。
  15. 计算描述子之间的汉明距离,选出相似度最高的匹配点
  16. 对最匹配的距离值与low阈值作比较,如果小于等于该阈值,那么取出这个关键点的MapPoint,判断一下这个定是否是MapPoint,如果是且这个点是好点,另外观测的次数也比它多,就用这个MapPoint来代替原先的MapPoint,否则就反过来代替。如果这个关键点对应的没有MapPoint,那么该输入MapPoint也将被该关键帧观测并在该关键帧中添加这个MapPoint。nFused++

Fuse()
该函数的参数列表:一帧关键帧、sim3矩阵、MapPoint的容器、阈值和要代替的MapPoint容器

  1. 取关键帧的传感器内参
  2. 分解sim3矩阵,获得旋转矩阵、尺度因子、去尺度因子的旋转矩阵和平移矩阵、最后是世界坐标系下的传感器中心坐标
  3. 获取现在关键帧中包含的MapPoint
  4. 初始化定义nFused为0
  5. 循环遍历传入参数中的MapPoint,抛弃坏的MapPoint,如果该MapPoint已经在关键帧中了,那这个MapPoint也将会被抛弃
  6. 下面的算法过程和上面的函数Fused()差不多

SearchBySim3()
该函数的参数列表:两帧关键帧、1到2的匹配MapPoint容器、1到2的尺度、1到2的旋转矩阵、1到2的平移矩阵和阈值

  1. 关键帧1的传感器内参、关键帧1和2的旋转平移矩阵
  2. 带尺度的1到2的旋转矩阵、带尺度的2到1的旋转矩阵和2到1的平移矩阵
  3. 获取关键帧1和2的MapPoint,初始化bool类型的已匹配容器1和2(false)
  4. 循环遍历传入参数中MapPoint。如果该点是MapPoint的话,这个点肯定是有匹配关系的。所以,当判断是MapPoint时,1匹配肯定是true,然后获取该点在关键帧2中的索引,判断其是否在2的MapPoint容器内,如果在,那么2匹配肯定也是true
  5. 初始定义int类型的容器,用于存放匹配的索引吧
  6. 寻找遍历1中还未匹配的好MapPoint,用于后续的匹配
  7. 计算得到世界、传感器1和传感2坐标系下的坐标,依旧是老几样要求,深度值大于等于0,将该点投影到关键帧2中的像素平面,保证其在像素平面内。后面又是尺度不变的距离范围。(前文多次提及到尺度不变的距离范围,个人的理解是因为成像的特征是随着物距的增加而改变,在特征点提取方面也用的是图像金字塔并且,记录了每一个关键点的尺度信息,所以距离的变化会带来尺度的变化,为了保证匹配的精度,需要将尺度的信息考虑进来,所以这里提出了尺度不变的距离范围。另外,我们也可以通过这样的距离反推出大致的尺度信息,两者相互支撑,保证了匹配的精度,看完了之后还是觉得很精髓的。)
  8. 再往下怎么寻找的匹配的方法与上面就很类似,就是在一定的范围寻找相似度最高的关键点,这不过这边的匹配做了两次,1到2、2到1
  9. 两个各匹配了一次之后,进行一致性矫正,记录那些1到2、2到1都能匹配上的点对
  10. 返回匹配上的点对数

SearchByProtection()
函数的参数列表:当前帧、前一帧、阈值和Mono模式的标志位

  1. 初始定义nmatches为0
  2. 定义直方图,计算各种转换之间旋转和平移矩阵
  3. 向前运动还是向后运动的确定,1)双目模型 2)基线距离(可能也不是基线距离)与平移矩阵的z值的比较结果 z值肯定是大于极限距离,只不过如果是正的大于,就说明是向前,反之就是后退。
  4. 循环遍历上一帧中的MapPoint,首先是MapPoint且不是外点,然后就是进行投影,是否在区域内的判断,获取该点的尺度信息,计算搜索区域。然后下边就要用到我们刚刚判断的向前运动还是向后运动了。如果是向前运动的话,寻找匹配点时的尺度范围[关键点本身的尺度,-1];如果是向后运动,寻找匹配点时的尺度范围[0,关键点本身的尺度];其他就是[关键点本身的尺度-1,关键点本身的尺度+1](看到这边有一个问题,当判断是向前时,寻找的匹配尺度范围就确定不可能找到待匹配的关键点,这样做是为什么呢????)
  5. 获取关键点的描述子
  6. 循环遍历刚刚区域内找到的关键点,判断他们是否在当前中被观测到,如果是,就说明这个点有很鲁棒的匹配关系,就不用进行这个点的匹配,另外要比较右图中的u坐标,应该是小于观测尺寸的,最后才是计算描述子的相似度
  7. 调用ComputeThreeMaxima()函数来剔除误匹配
  8. 返回匹配上的点对数

SearchByProtection()
函数的参数列表:当前帧、关键帧、set容器的MapPoint、阈值和ORB特征的距离

  1. 初始定义nmatches为0
  2. 获取当前帧的位姿信息,包括旋转、平移矩阵和传感器在世界坐标系下的坐标
  3. 建立直方图容器
  4. 获取关键帧中所用的MapPoint
  5. 循环遍历寻找匹配关系,过程类似,只不过最后最匹配点的相似度要与ORB距离阈值进行比较,只有小于等于这个阈值的点才有可能成为那个匹配点
  6. 用直方图,调用ComputeThreeMaxima()函数来剔除误匹配
  7. 返回匹配上的点对数目

终于等到你,看了上面的匹配过程,每次最后都会调用此函数来进行提出误匹配,这个函数到底是何方神圣,现在就让我们解开它的神秘面纱!
ComputeThreeMaxima()
此函数的参数列表:直方图、直方图的bin长度和三个索引值

  1. 定义了三个最大值,都是0
  2. 按bin值进行遍历,获取每个bin内存放数的数量(bin代表的角度信息、存放的是关键点的索引),找出存放数数量前三位的bin
  3. 如果第二大的远远小于(第一大的十分之一)第一大,索引2,3置-1
  4. 如果第三大的远远小于(第一大的十分之一)第一大,索引3置-1
    所以回到前面,我们理解一下它是怎么剔除误匹配的呢
    以刚刚讲解的SearchByProtection()函数为例,首先我们确认直方图具体存放的是什么,初匹配完之后,它会计算他们之间的角度差异,为了能保证bin的范围,所以这边计算得到的角度会和一个规定的因子相乘,然后将匹配的bestindex放到相应的bin中,往下就是怎么剔除了。经过调用ComputeThreeMaxima()函数,我们将得到三个索引值,然后进行判断,这边的判断,其实就是少数服从多数,角度的偏差应该大家应该是差不多的,那些差异与大多数不一样的点都可能存在误匹配,所以都要剔除。

最后一个函数计算描述子距离
DescriptorDistance()
函数的参数列表:两个Mat矩阵,其实也是两个行向量。
这边应该是一个32维的描述子,现将第一行的数进行位异或运算,由于在描述子计算没有进行深度的理解,所以感觉这边的理解只能就看看代码,就不阐述了,后面补充学习描述子了再来补充吧。

这篇博客写了整整两天,1700行不到的代码,每天都近900行的代码阅读量,还是挺有成就感的,差不多就这样,那就明天见喽!

时间:2019年08月10日
作者:hhuchen
机构:河海大学机电学院

SAP-ABAP:SAP创建CDS视图(SQL语句创建)实例详解 通过Eclipse和ADT创建CDS视图是SAP开发中的一项重要技能。CDS视图不仅简化了数据建模,还提供了高性能和灵活性。掌握CDS视图的开发和使用,可以帮助你更好地支持SAP S/4HANA和Fiori应用的开发。 阅读详情

相关推荐

Zemax操作41--公差分析(一)

zemax公差

lzy750750的博客 5973

ORB_SLAM2特征匹配

ORB_SLAM2特征匹配SearchByProjection使用于运动模型跟踪函数原型函数简介知识难点由两帧绝对位姿推出两帧相对位姿前进与后退对搜索范围的影响描述子的比较方向一致性检测 SearchByProjection 该方法总体思路是遍历参考帧中所有地图点,分别向当前帧进行投影,在当前帧中找到一个描述子距离最相近的特征点作为其匹配点 使用于运动模型跟踪 函数原型 @ brief 通过投影,...

weixin_43205582的博客 4174

Zephyr RTOS详解

Zephyr 是一个开源的实时操作系统(RTOS),专为资源受限的嵌入式设备设计,支持多种架构(如 ARM Cortex-M、RISC-V、x86 等)。

weixin_43484713的博客 4109

ORB-SLAM使用到的小细节

1、从两个关键帧的位姿计算它们之间的基本矩阵,根据对极约束剔除一些质量不高的点, x2‘Fx1=0,理论上x2特征点在Fx1构成的极线上,因为存在误差值,变成计算点到直线的距离 bool ORBmatcher::CheckDistEpipolarLine(const cv::KeyPoint &kp1,const cv::KeyPoint &kp2,const cv::Mat &F12,const KeyFrame* pKF2) { // Epipolar line i

weixin_38216573的博客 791

CRMEB开源电商系统 /api/products SQL注入漏洞复现(CVE-2024-36837)

2024年6月,CRMEB开源电商系统发布了新补丁,修复了一处SQL注入漏洞(CVE-2024-36837)。经分析,该漏洞可以通过请求api的路径接口来进行SQL注入,进而可能导致敏感信息泄露,该注入可暴露后台web绝对路径,深入利用可获取服务器权限,该漏洞无前置条件且利用简单,建议受影响的用户尽快修复漏洞。

0xSec 2883

cesium 气象云(体积云)

本文介绍了基于Cesium的气象云渲染技术方案,其核心是通过GPU加速的光线投射算法实现气象云的三维可视化。方案采用分层架构设计:GPU计算层由顶点着色器和片段着色器组成,负责光线投射计算、3D纹理采样和颜色映射;CPU控制层处理数据预处理、纹理创建和参数配置。关键技术包括:顶点着色器计算相机位置和光线方向,片段着色器实现光线步进采样、颜色映射和半透明混合。该方案高效解决了气象数据与地理场景的融合问题,支持云图、温度场等复杂三维气象数据的实时渲染,具有高真实感和良好性能。

God's asylum的博客 1204

ORB-SLAM2的ORBMATCHER代码阅读

首先给出泡泡机器人的ORB-SLAM2的源码详解链接:【泡泡机器人公开课】第三十六课:ORB-SLAM2源码详解 by 吴博这里主要介绍ORB MATCHER模块,ORBSLAM2对ORB MATCHER做了许多有意思的优化,比如加速的描述子距离计算,搜索范围的优化等等,这里简单介绍他的几个函数DescriptorDistance函数见Counting bits set, in parallel

mrhcat的博客 1574

SpringAI系列 - MCP篇(二) - MCP Server Boot Starter

此处需注意之前的。

罗小爬的技术宝书 1320

ORB特征匹配 投影匹配 极线搜索匹配 方向一致性过滤 尺度过滤

/** * This file is part of ORB-SLAM2. * ORB_ 匹配点 * * 该类负责 * 1特征点与特征点之间, * 2地图点与特征点之间通过投影关系 * 3词袋模型 DBow2进行匹配 * 4Sim3位姿匹配。 * * 用来辅助完成单目初始化,三角化恢复新的地图点,tracking,relocalization以及loop closing, * 因此比较重要。 *

万有文的博客 5526

【PINN物理信息网络】基于PINN物理信息网络求解瞬态薛定谔方程(python)

【PINN物理信息网络】基于PINN物理信息网络求解瞬态薛定谔方程(python)

k8291121的博客 2724

SAP UI5 用数据绑定导出:从 ExportTypeCSV 到 Spreadsheet 的完整实践与取舍

SAP UI5 数据绑定导出机制通过复用 Model、Binding Path 等配置,将控件视图转换为文件格式。早期方案使用 sap/ui/core/util/Export 生成 CSV,需自定义 ExportType 扩展格式;现代方案推荐 sap/ui/export/Spreadsheet 直接导出 XLSX,支持类型精度和智能表格集成。注意 CSV 方案已弃用但仍有业务价值,需根据项目需求选择合适方案。两种方式都基于数据绑定,避免重复定义列结构和格式化逻辑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 268

ORB-SLAM2 ----- LocalMapping::ComputeF12和ORBmatcher::CheckDistEpipolarLine

这两个函数在LocalMapping::CreateNewMapPoints()被调用,之所以单独拿出来讲,是因为这两个函都是计算的函数,而且这里是可以用来优化ORB-SLAM2代码的部分,我们完全可以在这部分不用词袋来匹配,直接使用对极约束来进行匹配,匹配效果更好。

uzi_ccc的博客 1195

【unity】【WebRTC】从0开始创建一个Unity远程媒体流app-构建可同步场景

本文介绍了如何利用Unity和WebRTC技术实现远程画面传输。通过配置Render Streaming组件、设置信令管理器和视频流发送器,构建了一个可同步的Unity场景。文中详细说明了从场景搭建到浏览器端测试的完整流程,并提供了常见问题排查方法。该方案适用于远程调试、云游戏、VR共享等场景,具有低延迟、高兼容性等特点。文章还包含项目源码下载链接,方便读者实践操作。最终实现了Unity端到浏览器端的实时画面传输,为后续实现双向互动奠定了基础。

每日出拳老爷子的博客 1843

地图点生成验证

由于有光泽,明亮、反光、纹理缺乏、材质的物体表面会导致缺失深度[1]。常见的深度相机给出的深度有效范围常在6m-8m内,真实世界中包含大量前景较深的区域,超出这个距离的深度值往往精度较低。这时为了提高跟踪的鲁棒性,就可以考虑生成地图点。 在单目SLAM系统中,我们常根据已有的特征匹配对利用对极约束进行位姿求解。这里假设我们已经得到不同图像之间的位姿关系,和一些包含离群点的匹配对。我们可以挑选一组合适的图像,通过他们之间位姿恢复出它们的基础...

a894943069的博客 356

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

传统目标检测实战:Sift/ORB+Match

传统目标检测实战:Sift/ORB+Match

Danger的博客 2433

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ORB-SLAM2 从理论到代码实现(五):ORBmatcher 程序详解

本文介绍了ORB-SLAM2中的6个关键特征匹配函数,主要功能包括: SearchByProjection:通过投影匹配当前帧与局部地图点,利用描述子距离筛选最优匹配; SearchByBoW:基于词袋模型加速关键帧间特征匹配,结合描述子距离和几何约束剔除误匹配; Fuse:将地图点投影到关键帧中融合重复点,优先保留观测数多的地图点; SearchBySim3:通过Sim3变换填补漏匹配,提升闭环检测时的特征对应关系; 三角化匹配:利用基础矩阵约束生成新的3D地图点; 前后帧投影匹配:结合运动模型跟踪上一帧

人无远虑,必有近忧 1844

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ORB-SLAM2 ---- ORBmatcher::ComputeThreeMaxima函数

ORB-SLAM2 ---- ORBmatcher::ComputeThreeMaxima函数解析

qq_41694024的博客 550

ORBSLAM理论与实战(10) 特征点匹配 ORBmatcher类

ORBmatcher ORBmatcher.h #ifndef ORBMATCHER_H #define ORBMATCHER_H #include<vector> #include<opencv2/core/core.hpp> #include<opencv2/features2d/features2d.hpp> #include"MapPoin...

算法攻城狮 1582

ORB-SLAM2代码(四)特征点匹配

orb-slam作为一款优秀的特征点slam方法,其特征点匹配好坏相当重要,直接关系到建图和定位的准确度。 1、特征点提取 orb特征点是对fast角点的改进,通过加入尺度和旋转的属性,使得orb特征点具备了尺度和旋转不变性. 1.1 特征点数目 每一金字塔层选取特征点理论总数目nfeatures,随着金字塔层数越高(分辨率越低),按照等比数列下降. 1.2 fast角点 在提取特征之前,先要获...

陋室逢雨 1万+

ORBSLAM2源码学习(6) ORBmatcher类

还是先上代码再放总结 #include "ORBmatcher.h" #include&lt;limits.h&gt; #include&lt;opencv2/core/core.hpp&gt; #include&lt;opencv2/features2d/features2d.hpp&gt; #include "Thirdparty/DBoW2/DBoW2/FeatureVector.h" ...

Fearless的博客 2770

【SLAM】ORB-SLAM2的源码阅读(八):ORBmatcher类

#ifndef ORBMATCHER_H #define ORBMATCHER_H #include&lt;vector&gt; #include&lt;opencv2/core/core.hpp&gt; #include&lt;opencv2/features2d/features2d.hpp&gt; #include"MapPoint.h" #include"KeyFrame.h" #in...

Felaim的博客 3480

认真的虎ORBSLAM2源码解读(九):ORBmartcher

目录1.前言2.头文件ORBmartcher.h3.源文件ORBmartcher.cc3.1.特征匹配时的方向匹配mbCheckOrientation 1.前言 2.头文件ORBmartcher.h 3.源文件ORBmartcher.cc 3.1.特征匹配时的方向匹配mbCheckOrientation ...

认真的虎的博客 1276

ORB-SLAM2从理论到代码实现(五):ORBmatcher.cc程序详解

本人邮箱 jinbo666888@qq.com,欢迎交流!转载请注明地址https://blog.youkuaiyun.com/qq_20123207/article/details/82502207 在上篇博客中,我主要写了多视图几何中的知识。本篇博客我们一起学习ORBmatcher.CC。 1.主要方法介绍 SearchByProjection(Frame &amp;F, const vector&...

qq_20123207的博客 5781

ORBmatcher类

这个类主要是利用投影和Bows寻找3D-2D,2D-2D的匹配。应用于跟踪局部建图回环检测。 SearchByProjection函数: 1:用于局部地图跟踪 在当前帧的局部地图中寻找更多的3D-2D匹配,这样可以增加位姿计算的精准度。 其中设置了各种约束条件,比如说右目误差要在范围之内,第二最佳距离要比最佳距离大到一定程度等等。 2:用于跟踪 在上一帧图像和当前帧图像中,通过投影找更多匹配 在其...

weixin_39373577的博客 1410

ORBSLAM中的特征匹配—ORBmatcher.cpp

ORBSLAM中对于特征点的匹配在不同情况下有不同的匹配方式。分为以下几种:1.&amp;amp;nbsp;按照投影进行匹配2.&amp;amp;nbsp;按照bow向量节点进行匹配3.&amp;amp;nbsp;针对初始化地图点的匹配4.&amp;amp;nbsp;针对单目三角化的匹配5.&amp;amp;nbsp;基于相似矩阵的匹配6.&amp;amp;nbsp;通过匹配来提出冗余地图点&amp;amp;nbsp;一、首先看按照投影进行的匹配按照投

weixin_41735501的博客 1111

ORB特征提取与匹配

ORB特征是目前最优秀的特征提取与匹配算法之一,下面具体讲解一下: 特征点的检测 图像的特征点可以简单的理解为图像中比较显著显著的点,如轮廓点,较暗区域中的亮点,较亮区域中的暗点等。ORB采用FAST(features from accelerated segment test)算法来检测特征点。这个定义基于特征点周围的图像灰度值,检测候选特征点周围一圈的像素值,如果候选点周围...

weixin_30567471的博客 2772
上一篇: CL关于ORB_SLAM的那些事(ORBextractor)
下一篇: CL关于ORB_SLAM的那些事(MapPoint)
EyeToTheWorld
博客等级 码龄10年 25粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值