在通过描述符匹配得到的原始匹配中有大量的误匹配,结果是当前帧几乎和地图里面所有的帧都有匹配。后面通过匹配数量在地图中每帧的分布来筛除一部分错误匹配。这部分工作主要在下面函数中完成。
MatchingBasedLoopDetector::doCovisibilityFiltering
函数的一个重要入参是 loop_closure::IdToMatches<IdType>& id_to_matches_map
这个参数中已经按照所有match所属的地图中的哪一帧进行了group
computeRelevantIdsForFiltering(id_to_matches_map, &id_to_score_map);
这个函数对id_to_matches_map进行排序,根据每一帧有的match数,只排列前n个,n是配置参数。然后把这头n个match放入到id_to_score_map输出。
对于exploration_queue的循环,只要exploration_queue不为空,component_id就不会增加。也就是exploration_queue里面所有的match都归为一个component
最后一部能这么做有几个条件:
- 一个正确match对应的landmark所对应的其他帧应该也是很有可能被match上的。
- 如果在另外的帧上,对应的kp没有被match上。说明这个很有可能是错误匹配。
最后的筛选流程大概是:
- 只要这一帧有一个match被放入一个component,这一帧所有的match都归为这个component。
- 如果一个landmark链接的其他帧的kp都和当前帧有匹配,这些帧也加入到这个component。
- 反过来说就是:一个landmark在其他帧的kp如果没有同时被当前帧观察到。这个共视关系就断掉了。
- 进一步总结就是求,在所有和match有关的landmark可frame组成的共视关系中,最大的那个链接图。