• 「宫商角徵羽:请教一下,这里第1192行,在已经给当前层的金字塔赋值了之后,为什么还要给temp加边框?」
    - - - - - - - - - - - - - - -
    刘国庆:我觉得加框是为了计算描述子用的,Brief描述子计算前需要先对图像进行模糊平滑处理,ORB-SLAM中用的是高斯模糊,不拓展边界的话……图像边界上特征点的描述子就没法计算了EDGE_THRESHOLD就是这个高斯模糊的范围。不过这段程序确实有些问题,后面使用的目测还是未扩充边界的图像,我也没有仔细研究过,这两天我也看看
    石成玉:原版的代码是从opencv拷贝过来的,opencv里要加mask所以进行padding,此处加padding没有必要,可以省略
    「宫商角徵羽:还有那个EDGE_THRESHOLD取19是有什么含义的吗,为什么后面计算特征点的时候还要-3,我直接取到16不好吗?」
    - - - - - - - - - - - - - - -
    刘国庆:如果我们按照ORB-SLAM2是基于“边界扩充图像”提取特征的话,-3是因为计算FAST角点需要半径3的区域,这张图也许更直观一些:
    刘国庆:类似的在计算FAST角点的那段代码里面还有很多神奇的数字可以探索一番是咋来的
    「草千田土山石:大家好,请问:在Sim3Solver.cpp中的iterate里面,迭代次数有两个,一次当前迭代次数,还有一个总的迭代次数。我理解前者是与每个Keyframe比较时的迭代次数上限,那么总的迭代次数是限制什么的?」
    - - - - - - - - - - - - - - -
    刘国庆:好问题,看得很仔细呀~搞清楚这个需要结合LoopClosing.cc中的LoopClosing::ComputeSim3()函数,建议大概看一下[https://github.com/raulmur/ORB_SLAM2/blob/master/src/LoopClosing.cc#L286]这个while循环中做的事情,大意是遍历对于每一个候选闭环帧,计算每一个候选闭环帧和当前关键帧的Sim3,迭代次数设置为5。这里的5就是Sim3Solver.cc中函数Sim3Solver::iterate()的局部变量nCurrentIterations不能够超过的值,它规定了在调用函数Sim3Solver::iterate()的时候RANSAC迭代的最大次数。ORB-SLAM2中的闭环判定条件比较严格,经过一轮遍历可能还没有候选帧能够通过这个检测标准,咋整呢,再来一轮;反正一轮中每一个帧就迭代5次,速度相对比较快。但是这样一轮一轮,什么时候才能结束呢,在Sim3Solver对象构造的时候,会指定总迭代次数,就是成员变量mnIterations;如果对于某帧的总迭代次数超过了mnIterations,那么说明这个候选闭环帧烂泥扶不上墙,咱们就不管了,反映在LoopClosing::ComputeSim3()中就是vbDiscarded[i]=true和nCandidates--,对应在代码的这个位置:[https://github.com/raulmur/ORB_SLAM2/blob/master/src/LoopClosing.cc#L304]
    不知道我有没有说明白