1.前言
1.1.参考博客
【泡泡机器人原创专栏】DBoW3 视觉词袋模型、视觉字典和图像数据库分析
浅谈回环检测中的词袋模型(bag of words)
开源词袋模型DBow3原理&源码(一)整体结构
2.头文件
class KeyFrame
{
public:
KeyFrame(Frame &F, Map* pMap, KeyFrameDatabase* pKFDB);
// Pose functions
void SetPose(const cv::Mat &Tcw);
cv::Mat GetPose();
cv::Mat GetPoseInverse();
cv::Mat GetCameraCenter();
cv::Mat GetStereoCenter();
cv::Mat GetRotation();
cv::Mat GetTranslation();
// Bag of Words Representation
//计算此关键帧的mBowVec,mFeatVec
void ComputeBoW();
// Covisibility graph functions
/**在共视图Covisibility graph中添加边,并调用UpdateBestCovisibles()更新essential graph
* @param pKF 具有共视关系的其他关键帧
* @param weight 和pKF共视的mappoint数量
*/
void AddConnection(KeyFrame* pKF, const int &weight);
void EraseConnection(KeyFrame* pKF);
//更新共视图Covisibility graph,essential graph和spanningtree,以及共视关系
void UpdateConnections();
//更新 mvpOrderedConnectedKeyFrames,mvOrderedWeights,也就是共视图covisibility
void UpdateBestCovisibles();
//返回此关键帧有共视关系的节点
std::set<KeyFrame *> GetConnectedKeyFrames();
//返回Covisibility graph中与此节点连接的节点(即关键帧)
std::vector<KeyFrame* > GetVectorCovisibleKeyFrames();
//返回Covisibility graph中与此节点连接的权值前N的节点
std::vector<KeyFrame*> GetBestCovisibilityKeyFrames(const int &N);
std::vector<KeyFrame*> GetCovisiblesByWeight(const int &w);
int GetWeight(KeyFrame* pKF);
// Spanning tree functions
//Spanning tree的节点为关键帧,共视程度最高的那个关键帧设置为节点在Spanning Tree中的父节点
void AddChild(KeyFrame* pKF);
void EraseChild(KeyFrame* pKF);
void ChangeParent(KeyFrame* pKF);
std::set<KeyFrame*> GetChilds();
KeyFrame* GetParent();
bool hasChild(KeyFrame* pKF);
// Loop Edges
//添加一个闭环检测帧
void AddLoopEdge(KeyFrame* pKF);
std::set<KeyFrame*> GetLoopEdges();
// MapPoint observation functions
/**向关键帧添加mappoint,让keyframe知道自己可以看到哪些mappoint
* @param pMP 添加的mappoint
* @param idx mappoint在此帧对应的特征点的序号
*/
void AddMapPoint(MapPoint* pMP, const size_t &idx);
void Er