点击“计算机视觉life”关注,置顶更快接收消息!
本文经知乎作者fishmarch授权转载,二次转载请联系作者
原文:https://zhuanlan.zhihu.com/p/45573552
在视觉SLAM问题中,位姿的估计往往是一个递推的过程,即由上一帧位姿解算当前帧位姿,因此其中的误差便这样一帧一帧的传递下去,也就是我们所说的累积误差。
如下图所示,我们的位姿约束都是与上一帧建立的,第五帧的位姿误差中便已经积累了前面四个约束中的误差。
但此时,如果我们发现第五帧位姿不一定要由第四帧推出来,还可以由第二帧推算出来,那显然这样计算误差更小呀,因为只有两个约束的误差了嘛。像这样与之前的某一帧建立位姿约束关系就叫做回环。回环通过减少了约束数,起到了减小累积误差的作用。
那现在又有新的问题了,我们怎么知道可以由第二帧推算第五帧位姿呢?就像下图,可能第一帧、第三帧也可以呀。确实,我们之所以用前一帧递推下一帧位姿,因为这两帧足够近,肯定可以建立两帧的约束,但是距离较远的两帧就不一定可以建立这样的约束关系了。找出可以建立这种位姿约束的历史帧,就是回环检测。
那我们现在的重点就是回环检测了。其实我们完全可以把以前的所有帧都拿过来和当前帧做匹配,匹配足够好的就是回环嘛,但问题是计算量太大了,两帧匹配本来就慢,这样做的话还没有比较好的初值,需要匹配的数目又如此巨大,CPU和我们都会疯的。
但其实,任意两帧是否构成回环可以由更简单的方法做一个初步的筛选,就像一帧中有一个房子,另一帧中是一棵树,那这两帧明显关系不大嘛。通过这种方式,我们便可以对回环做出初步筛选。而这里说的房子、树就是词袋模型中的单词。也就是描述子的进一步抽象集合。
词袋模型
单词:差距较小的描述子的集合
字典:所有的单词
因此每一帧都可以用单词来描述,也就是这一帧中有哪些单词,这里只关心了有没有,而不必关心具体在哪里。只有两帧中单词种类相近才可能构成回环。
因此,现在利用词袋模型我们将回环检测大致分为了以下三个步骤:
构建字典(所有单词的集合)
确定一帧中具有哪些单词,用向量表示 (1表示具有该单词,0表示没有)
比较两帧描述向量的差异
字典结构
字典由单词组成,而单词来自于描述子。并不是说一个描述子就是一个单词,而是一个单词表示了一组多个描述子,同组内的描述子差异较小。例如,描述子由256位组成,则描述子的种类便有