前言
在添加新連接之后就要重新對所有的共視關鍵幀和權重的那兩個列表重新進行降序排列,這樣非常容易知道列表的第一位就是最佳共視關鍵幀和權重。
總的來說就是只要權重發生了變化就要調用這個函數來修改mvpOrderedConnectedKeyFrames共視關鍵幀和mvOrderedWeights權重這兩個列表。
1.函數聲明
void KeyFrame::UpdateBestCovisibles()
2.函數定義
/*按照權重從大到小對連接(共視)的關鍵幀進行排序更新后的變量存儲在mvpOrderedConnectedKeyFrames和mvOrderedWeights中*/
void KeyFrame::UpdateBestCovisibles()
{// 互斥鎖,防止同時操作共享數據產生沖突unique_lock<mutex> lock(mMutexConnections);// http://stackoverflow.com/questions/3389648/difference-between-stdliststdpair-and-stdmap-in-c-stl (std::map 和 std::list<std::pair>的區別)vector<pair<int,KeyFrame*> > vPairs;vPairs.reserve(mConnectedKeyFrameWeights.size());// 取出所有連接的關鍵幀,mConnectedKeyFrameWeights的類型為std::map<KeyFrame*,int>,而vPairs變量將共視的地圖點數放在前面,利于排序for(map<KeyFrame*,int>::iterator mit=mConnectedKeyFrameWeights.begin(), mend=mConnectedKeyFrameWeights.end(); mit!=mend; mit++)vPairs.push_back(make_pair(mit->second,mit->first));// 按照權重進行排序(默認是從小到大)sort(vPairs.begin(),vPairs.end());// 為什么要用鏈表保存?因為插入和刪除操作方便,只需要修改上一節點位置,不需要移動其他元素list<KeyFrame*> lKFs; // 所有連接關鍵幀list<int> lWs; // 所有連接關鍵幀對應的權重(共視地圖點數目)for(size_t i=0, iend=vPairs.size(); i<iend;i++){// push_front 后變成從大到小lKFs.push_front(vPairs[i].second);lWs.push_front(vPairs[i].first);}// 權重從大到小排列的連接關鍵幀mvpOrderedConnectedKeyFrames = vector<KeyFrame*>(lKFs.begin(),lKFs.end());// 從大到小排列的權重,和mvpOrderedConnectedKeyFrames一一對應mvOrderedWeights = vector<int>(lWs.begin(), lWs.end());
}
結束語
以上就是我學習到的內容,如果對您有幫助請多多支持我,如果哪里有問題歡迎大家在評論區積極討論,我看到會及時回復。