ORB-SLAM2中的Loop Closinng中DetectLoopCandidates函數解析

/函數的三要素是:函數返回值類型,函數名稱,函數參數
函數的返回值是裝有關鍵幀指針的vector
該函數是類KeyFrameDatabase的成員函數,函數名是DetectLoopCandidate
該函數的參數分別是KeyFrame類型的指針變量 pKF和最小得分vector<KeyFrame*> KeyFrameDatabase::DetectLoopCandidates(KeyFrame* pKF, float minScore)
{spConnectedKeyFrames是一個set定義的變量,set中裝的是在covisibility graph中與關鍵幀pKF相關聯的關鍵幀。GetConnectedKeyFrame()是類KeyFrame的成員函數,通過遍歷變量map變量                 mConnectedKeyFrameWeights來得到關聯幀。map<KeyFrame*, int> mConnectedKeyFrameWeights;set 有自動排序功能,不能直接存取元素list不可以隨機存取元素set<KeyFrame*> spConnectedKeyFrames = pKF->GetConnectedKeyFrames();list<KeyFrame*> lKFsSharingWords;// Search all keyframes that share a word with current keyframes// Discard keyframes connected to the query keyframe{unique_lock<mutex> lock(mMutex);//遍歷pKF中所有生成的Bow向量for(DBoW2::BowVector::const_iterator vit=pKF->mBowVec.begin(), vend=pKF->mBowVec.end(); vit != vend; vit++){//在inverse indexes中查找該word都在哪些圖像中出現過list<KeyFrame*> &lKFs =   mvInvertedFile[vit->first];//遍歷這些查找出來的與pKF有共視的word的關鍵幀for(list<KeyFrame*>::iterator lit=lKFs.begin(), lend= lKFs.end(); lit!=lend; lit++){//緊接著這一小段程序可以統計pKF與pKFi共視words的個數。//到了這里就是說pKF與pKFi有共視關系,但是并不是pKFi都可以被認為是閉環候選幀//只有當pKFi不是在covisibility graph中與pKF直接相連的關鍵幀才有機會入圍。KeyFrame* pKFi=*lit;//如果pKFi是第一次被pKF查詢,那么先初始化成員變量mnLoopwords為0//經判斷pKFi確實不與pKF直接相連則將成員變量mnLoopQuery設置為pKF的Id號碼//表示pKFi已經被pKF查詢過,下次再次查詢pKFi的時候//pKFi->mnLoopQuery = pKF->mnId 則直接讓 pKFi->mnLoopWords++;//并且將pKFi插入到lKFsSharingwords中去。if(pKFi->mnLoopQuery!=pKF->mnId){pKFi->mnLoopWords=0;if(!spConnectedKeyFrames.count(pKFi)){pKFi->mnLoopQuery=pKF->mnId;lKFsSharingWords.push_back(pKFi);}}pKFi->mnLoopWords++;}}}if(lKFsSharingWords.empty())return vector<KeyFrame*>();//IScoreAndMatch變量中與pKF有共視關系的關鍵幀以及兩者之間的得分//pair<float, KeyFrame>pair的使用是將兩者捆綁到一起存儲list<pair<float,KeyFrame*> > lScoreAndMatch;int maxCommonWords=0;//遍歷那些所有與pKF有共視關系又滿足條件的存儲在lKFsSharingWords中的關鍵幀for(list<KeyFrame*>::iterator lit=lKFsSharingWords.begin(), lend= lKFsSharingWords.end(); lit!=lend; lit++){//從上面的程序我們知道mnLoopWords變量中存儲了該關鍵幀與pKF的共視word數目//找到這些所有與pKF有共視關系的關鍵幀中與pKF共視word最大值 maxCommonWordsif((*lit)->mnLoopWords>maxCommonWords)maxCommonWords=(*lit)->mnLoopWords;}//但是我們如果要求這么嚴格,那滿足我們條件的關鍵幀真的是寥寥無幾啦,所以為了得到多一些的//閉環候選幀我們不得不降低要求,讓前20%的關鍵幀都能進入下一輪的比賽。//如果這個要求您都不能滿足的話,那對不起,您只能等下一次了。int minCommonWords = maxCommonWords*0.8f;int nscores=0;//再次遍歷lKFsSharingWords中存儲的所有與pKF有共視關系的關鍵幀for(list<KeyFrame*>::iterator lit=lKFsSharingWords.begin(), lend= lKFsSharingWords.end(); lit!=lend; lit++){//將每一個關鍵幀單獨拿出來,看一看他的mnLoopWords與minCommonWords的大小KeyFrame* pKFi = *lit;if(pKFi->mnLoopWords>minCommonWords){nscores++;//對于那些共視單詞數滿足條件的pKFi計算與pKF之間的BoW得分float si = mpVoc->score(pKF->mBowVec,pKFi->mBowVec);//mLoopScore目前的值是pKFi與pKF之間的Bow得分。pKFi->mLoopScore = si;//只有那些得分大于minScore的pKFi才可以留下第三關:Bow得分限制if(si>=minScore)lScoreAndMatch.push_back(make_pair(si,pKFi));}}if(lScoreAndMatch.empty())return vector<KeyFrame*>();list<pair<float,KeyFrame*> > lAccScoreAndMatch;float bestAccScore = minScore;// Lets now accumulate score by covisibility//遍歷所有上一貫留下的關鍵幀pKFifor(list<pair<float,KeyFrame*> >::iterator it=lScoreAndMatch.begin(), itend=lScoreAndMatch.end(); it!=itend; it++){//單獨拿出每一幀KeyFrame* pKFi = it->second;//查找在covisibility graph上與pKFi連接最密切的10個關鍵幀vector<KeyFrame*> vpNeighs = pKFi->GetBestCovisibilityKeyFrames(10);//bestScore初始化為pKFi與pKF之間的得分float bestScore = it->first;//這個累計得分accScore也被初始化為pKFi與pKF之間的得分float accScore = it->first;//而最佳幀選也初始化為pKFiKeyFrame* pBestKF = pKFi;//遍歷每一個pKFi的10個聯系最為密切的關鍵幀for(vector<KeyFrame*>::iterator vit=vpNeighs.begin(), vend=vpNeighs.end(); vit!=vend; vit++){KeyFrame* pKF2 = *vit;//如果在這10個關鍵幀中有之前被pKF查詢過(即有共視單詞),并且共視的單詞數還滿足//大于minCommonwords的要求if(pKF2->mnLoopQuery==pKF->mnId && pKF2->mnLoopWords>minCommonWords){//那么就要在原來pKFi與pKF得分的基礎上再加上pKFi的“好友”pKF2與pKF之間的得分accScore+=pKF2->mLoopScore;//殘忍的時刻到了,倘若pKF2與pKF之間的得分要比pKFi大,//pKF2就會超過pKFi pBestKF就成了pKF2了if(pKF2->mLoopScore>bestScore){pBestKF=pKF2;bestScore = pKF2->mLoopScore;}}}//現在存儲是從多個成員是11的小組內選擇出的與pKF得分最高的pBestKF以及累計得分accScorelAccScoreAndMatch.push_back(make_pair(accScore,pBestKF));//并且在所有的accScore中找到那個最大的得分bestAccScore.if(accScore>bestAccScore)bestAccScore=accScore;}//但是為了能夠得到多一些的閉環候選幀,需要降低要求,將那些上一關留下來分數靠前25%的關鍵幀//留下來float minScoreToRetain = 0.75f*bestAccScore;set<KeyFrame*> spAlreadyAddedKF;vector<KeyFrame*> vpLoopCandidates;vpLoopCandidates.reserve(lAccScoreAndMatch.size());//遍歷所有上一關留下的關鍵幀for(list<pair<float,KeyFrame*> >::iterator it=lAccScoreAndMatch.begin(), itend=lAccScoreAndMatch.end(); it!=itend; it++){//將那些上一關留下來分數靠前25%的關鍵幀留下來if(it->first>minScoreToRetain){KeyFrame* pKFi = it->second;//如果檢測到set中已經有pKFi了就不要重復插入了,其實這個判斷是多余的//set本來就具有值唯一性,不可以存入重復的值。if(!spAlreadyAddedKF.count(pKFi)){vpLoopCandidates.push_back(pKFi);spAlreadyAddedKF.insert(pKFi);}}}//最后終于得到了想要的關鍵幀,就想皇帝選妃子,需要層層選拔//可以走到這里的關鍵幀真的是過五關斬六將了//第一關:與pKF有共視單詞的pKF1,且不能是與pKF在covisibility graph中與pKF直接相連的//關鍵幀//第二關:共視單詞數必須大于minCommonWords的才可以留下 pKF2//第三關:pKF2中與pKF的BOw得分必須大于minScore的才可以留下 pKF3//第四關:pKF3要與自己最親密的“朋友”PK與pKF之間的共視單詞數,留下的記為pKF4//第五關:pKF4中那些與pKF得分大于minScoreToRetain的才可以最終留下來 記為pKF5;return vpLoopCandidates;
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252519.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252519.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252519.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NYOJ2—括號配對問題

括號配對問題 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB 難度&#xff1a;3描述現在&#xff0c;有一行括號序列&#xff0c;請你檢查這行括號是否配對。輸入第一行輸入一個數N&#xff08;0<N<100&#xff09;,表示有N組測試數據。后面的N行輸入多…

李彥宏千字愿景內部信:10次提到“用戶”

中新網1月17日電 1月17日&#xff0c;百度公司創始人、董事長兼CEO李彥宏發出一封內部信&#xff0c;信中&#xff0c;李彥宏向員工闡述了百度愿景&#xff1a;成為最懂用戶&#xff0c;并能幫助人們成長的全球頂級高科技公司。他提出&#xff0c;百度要持續創新&#xff0c;“…

spring-boot 速成(8) 集成druid+mybatis

spring-boot與druid、mybatis集成&#xff08;包括pageHelper分頁插件&#xff09;, 要添加以下幾個依賴項: compile(mysql:mysql-connector-java:6.0.5)compile(tk.mybatis:mapper-spring-boot-starter:1.1.1)compile(org.mybatis.spring.boot:mybatis-spring-boot-starter:1.…

ORB-SLAM2中生成金字塔提取FAST角點和計算BRIEF描述子

//這個是類ORBextractor的帶參構造函數&#xff0c;并且使用初始化列表對該類中的這5個變量賦值 ORBextractor::ORBextractor(int _nfeatures, float _scaleFactor, int _nlevels,int _iniThFAST, int _minThFAST):nfeatures(_nfeatures), scaleFactor(_scaleFactor), nlevels(…

我們怎樣確保從大數據計算中獲得價值

我們怎樣確保從大數據計算中獲得價值 支持大數據方案并不是在硬件以及軟件層次終止&#xff0c;企業要想真正地從大數據中受益&#xff0c;領導者必須改變思考與對待信息的方式。 我們怎樣確保從大數據計算中獲得價值&#xff1f; 當所有可用數據都可用時&#xff0c;大數據…

jsoncpp-src-0.5.0.tar.gz 源碼錯誤!!!!

近期在做畢設&#xff0c;使用到了JsonCpp0.5.0版本號的源碼&#xff01;依照網上的安裝配置教程&#xff0c;搭建好環境后就能夠使用了&#xff01; 在這里就不浪費空間去將怎樣搭建開發環境了&#xff01;請大家去google一下就好了&#xff01;在解析一個Json文件時。程序總是…

青海省多地日降水量突破歷史極值

受高原槽和西北冷空氣的共同影響&#xff0c;青海省海西州茫崖等多地日降水量突破歷史極值。 李萬花 攝 受高原槽和西北冷空氣的共同影響&#xff0c;青海省海西州茫崖等多地日降水量突破歷史極值。 李萬花 攝 中新網西寧1月18日電 (孫睿 趙海梅)記者18日從青海省氣象局獲悉&am…

ORB-SLAM2中四叉樹管理特征點

當從圖像金字塔中的每一層圖像上提取特征點之后&#xff0c;都要先用四叉樹技術對這些特征點進行管理 //該類中定義了四叉樹創建的函數以及樹中結點的屬性 //bool bNoMore&#xff1a; 根據該結點中被分配的特征點的數目來決定是否繼續對其進行分割 //DivisionNode()&#xff…

Python多線程3:queue

queue模塊實現了多生產者。多消費者隊列。在多線程環境下&#xff0c;該隊列能實現多個線程間安全的信息交換。 queue模塊介紹 模塊實現了3種類型的隊列&#xff0c;差別在于隊列中條目檢索的順序不同。在FIFO隊列中。依照先進先出的順序檢索條目。在LIFO隊列中&#xff0c;最后…

微信小程序教程02:App(Object)和Page(Object) 構造器介紹

在/app.js中&#xff0c;有方法App&#xff0c;它的作用是注冊整個小程序的應用&#xff0c;其中可以傳入一些配置&#xff0c;或者存儲全局狀態。 App(Object) 構造器生命周期 屬性類型描述onLaunchFunction在小程序初始化時觸發&#xff0c;全局僅觸發一次onShowFunction小程…

阿里云.log

申請證書審核失敗的原因及處理方法;( 新添加站點 免費版 SSL 網頁內不能有 HTTPS的連接&#xff1b;更多點擊連接) 轉載于:https://www.cnblogs.com/q1104460935/p/8287377.html

SharePoint Search之(七)Search result- 結果源

在使用搜索引擎的時候。非常多情況下&#xff0c;用戶希望限定一下搜索范圍&#xff0c;以便更加easy找到想要的結果。在SharePoint 2013的search里&#xff0c;也支持類似的功能&#xff0c;SharePoint 默認提供了幾種范圍&#xff1a; 在SharePoint&#xff0c;這個叫Search …

曠視砸20億進軍AIoT,發布國內首個機器人協作大腦河圖

1 月 16 日&#xff0c;人工智能獨角獸曠視科技發布了機器人戰略&#xff0c;以及自 2018 年 4 月收購艾瑞思機器人&#xff0c;進軍機器人領域的最新進展——智能協同大腦河圖。在會上&#xff0c;曠視還大筆一揮&#xff0c;決定投入 20 億元&#xff0c;用于打造物流倉儲上下…

ORB-SLAM2-金字塔求解-特征點的提取-描述子的計算

//這個成員函數重載了函數括號運算符&#xff0c;讓他具有函數的特點 //但是還不知道在其他程序塊是如何應用這塊代碼的。 //InputArray和OutputArray是opencv中的兩個函數接口 void ORBextractor::operator()( InputArray _image, InputArray _mask, vector<KeyPoint>&a…

am335x uboot, kernel 編譯

一、設置環境變量// 寫在家目錄下面的 .bashrc 里面export KERNEL_PATH~/aplex/kernel3.2.0 // kernel 路徑export UBOOT_PATH~/aplex/uboot2011.09 // u-boot 路勁export ROOTFS_PATH~/aplex/filesystemexport TOOLFS_PATH~/aplex/toolsexport ARCHarm …

php+ajax簡單實現跨域(http+https)請求調用

當一個網站 a站 需要調用另一個網站 b站 列表文章時 比如&#xff1a;www.a123.com 調用 www.b456.com 文章 在 a站 建立php文件獲取 b站 資源文章到本地后&#xff0c;再傳遞a站前端 在網站 b456 下的文件為 <ul class"ls_wz"> <li><a href"#&q…

ORB-SLAM2中MapPoints的描述子的計算

//我們在從金字塔的圖像中獲取特征點時為每一個特征點計算了描述子 //現在看看如何計算一個空間的地圖點的描述子 void MapPoint::ComputeDistinctiveDescriptors() {// Retrieve all observed descriptorsvector<cv::Mat> vDescriptors;//獲取到某一個地圖點可以被哪些關…

HDU:4185-Oil Skimming

Oil Skimming Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description Thanks to a certain “green” resources company, there is a new profitable industry of oil skimming. There are large slicks of crude oil floa…

域控制器情況分析

域控制器情況分析 1、Windows Server 的 Foundation、Standard、Enterprise 以及 Datacenter 版本號既可作為源server&#xff0c;也可作為目標server。僅支持將 Foundation Server 版本號作為受限方案中的目標server。在使用 Foundation Server 作為目標server之前&#xff0c…