(三)ORB特征匹配
?ORBSLAM2匹配方法流程
在基于特征點(diǎn)的視覺SLAM系統(tǒng)中,特征匹配是數(shù)據(jù)關(guān)聯(lián)最重要的方法。特征匹配為后端優(yōu)化提供初值信息,也為前端提供較好的里程計(jì)信息,可見,若特征匹配出現(xiàn)問題,則整個(gè)視覺SLAM系統(tǒng)必然會(huì)崩掉。因此,本系列將特征匹配獨(dú)立成一講進(jìn)行分析。
ORBSLAM2中的匹配流程如下所述:
1. 計(jì)算當(dāng)前幀描述子對應(yīng)的BOW向量;
2. 設(shè)置匹配閾值;
3. 進(jìn)行BOW特征向量匹配確定最優(yōu)匹配;
4. 統(tǒng)計(jì)匹配描述子角度偏差并篩選,確定最終匹配。
接下來,我們一起再細(xì)細(xì)分析一下,每一步它具體是怎么做的。
?詞袋模型
在進(jìn)入正題之前,需要給大家普及一下,什么叫BOW。BOW就是Bag of Word,是詞袋模型中的詞匯組合而成的向量。
到這里,大家肯定又會(huì)有疑惑,什么叫詞袋模型?
從字面上非常直觀的意思就是:裝著很多詞匯的袋子。那么,這個(gè)袋子里面的詞袋究竟是什么?怎么來的呢?
我們知道,一幀圖像中,可以提取到很多的特征點(diǎn),每一個(gè)特征點(diǎn)都是一個(gè)圖像局部塊的描述,那么相似場景下的特征點(diǎn),其描述應(yīng)該是比較接近的。如果我們將這些常見場景的相似特征進(jìn)行聚類,下一次再遇到相似的特征,能不能直接用我們聚類的結(jié)果來表示這個(gè)特征呢?顯然是可以的。也就是說,我們把所有相似的特征描述都進(jìn)行統(tǒng)一化,最終得到一個(gè)唯一的描述。而詞袋模型就是將所有常見場景的特征描述子按照樹狀圖進(jìn)行分層聚類,最終得到的一系列聚類中心——統(tǒng)一化的特征描述。
為了讓大家更加直觀的理解我所說的東西,我為大家提供了一個(gè)分層聚類的樹結(jié)構(gòu)圖:
如圖所示,上述樹結(jié)構(gòu)是一個(gè)聚類中心K為3,深度D為2的詞匯樹,共計(jì)產(chǎn)生KD也就是9個(gè)詞匯。
比如我有10幀圖像,每幀圖像提取了500個(gè)特征點(diǎn),那么總共有5000個(gè)特征點(diǎn)。首先將其聚成3類,作為粗略的篩選。在這三個(gè)聚類中心的基礎(chǔ)上,每個(gè)大類下的特征點(diǎn)再進(jìn)一步聚成三類。所以我們將5000個(gè)特征點(diǎn)分成了9大類,即9個(gè)詞匯,對于屬于詞匯W5的描述子,其最終表示是[ 0 0 0 0 1 0 0 0 0 ],對于每一個(gè)詞匯,都存儲(chǔ)著其對應(yīng)的權(quán)重。對于任意一張輸入圖像,所有特征點(diǎn)通過詞袋模型轉(zhuǎn)換以后變成 [ 50 50 100 0 0 50 50 100 100 ],即輸入圖像中的所有特征點(diǎn)直接轉(zhuǎn)換成了一個(gè)9維的向量,在圖像檢索時(shí)非常高效。
但是,上述的詞袋模型對于我們的問題來說,實(shí)在是太小了。因此,ORBSLAM中回環(huán)檢測里采用的詞袋模型,是從一些常用場景的大量圖像中提取了特征點(diǎn)后進(jìn)行上述基于樹結(jié)構(gòu)的聚類。當(dāng)然,其樹結(jié)構(gòu)肯定是更大更深的,比如,聚類中心K為10,深度D為5的詞匯樹,共計(jì)產(chǎn)生十萬個(gè)詞匯。這個(gè)龐大的詞匯樹可以讓不那么相似的特征分開,使得BOW向量更加具有區(qū)分度。
?轉(zhuǎn)換成BOW向量
對于輸入圖像的所有特征點(diǎn),我們通過詞袋模型轉(zhuǎn)換成對應(yīng)詞匯,在樹結(jié)構(gòu)龐大的情況下,我們不能在一個(gè)向量中包含所有詞匯,一方面是考慮內(nèi)存,另一方面考慮檢索效率。因此,我們只保存非0的詞匯,即 I = { (W1, 0.01), (W5,0.02), ..., (W300,0.05) },花括號里(A,B),A表示詞匯ID,B表示權(quán)重。需要注意的是,這里的權(quán)重是我隨機(jī)寫的,只是為了方便大家理解,實(shí)際的權(quán)重必須是根據(jù)統(tǒng)計(jì)結(jié)果算出來的。
以上述的樹結(jié)構(gòu)為例,對于任意一個(gè)特征點(diǎn),我們從root節(jié)點(diǎn)出發(fā),與第一層聚類中心進(jìn)行粗匹配,選擇匹配分?jǐn)?shù)最高的一個(gè)聚類中心。接著,繼續(xù)與其子類進(jìn)行特征匹配,找到最優(yōu)的匹配,直到葉子為止,這個(gè)葉子就是我們之前所說的詞匯。假設(shè)最終找到的詞匯是W3,則這個(gè)描述子對應(yīng)的BOW就是(W3,0.02),通過將所有特征點(diǎn)進(jìn)行相同的操作,我們可以得到一系列詞匯ID和權(quán)重,將其串起來就得到了我們要的BOW向量了。
?特征匹配
通過上述的方法,我們將待匹配圖像的特征點(diǎn)轉(zhuǎn)換成BOW向量,在匹配時(shí)我們查找兩幀BOW向量中相同ID的詞匯,特征匹配只在有相同ID的詞匯中進(jìn)行。顯然,這個(gè)過程限定了匹配范圍,可以提高匹配的速度。當(dāng)然,匹配的精度跟詞匯樹的大小和深度有關(guān)系。
假設(shè)在圖像1中,ID為3的詞匯中包含6個(gè)特征點(diǎn),同理,圖像2中包含3個(gè)特征點(diǎn)。則對圖像1中的每個(gè)特征點(diǎn)都與圖像2中的每個(gè)特征點(diǎn)計(jì)算匹配分?jǐn)?shù),通過最近鄰比例法,結(jié)合閾值條件篩選出最優(yōu)的匹配對。值得注意的是,在圖像2中已經(jīng)匹配過的特征點(diǎn),圖像1其余特征點(diǎn)就不再與之匹配了。
形象一點(diǎn)說:圖像1中有6名男士,圖像2中有3名女士,自由牽手組合。當(dāng)圖像1中的一名男士與圖像2中的所有女士進(jìn)行交流后(特征匹配),有其中一位好感度比較高(匹配分?jǐn)?shù)高于匹配閾值),那么就牽手成功了。這時(shí),圖像1中剩余5名男士自然無法匹配已經(jīng)被選擇的那名女士。相反,如果所有女士都對其好感度較低(匹配分?jǐn)?shù)低于匹配閾值),則說明牽手失敗。(即匹配失敗)
?確定最優(yōu)匹配
ORBSLAM2中將360°分成30個(gè)bin,每個(gè)bin的范圍是12°。對于圖像1和圖像2任意兩個(gè)對應(yīng)匹配特征,我們計(jì)算其二者主方向的夾角。根據(jù)夾角的大小確定在哪個(gè)角度范圍里,并將特征索引存入對應(yīng)bin中。
我們統(tǒng)計(jì)每個(gè)bin中保存的索引數(shù)量,取數(shù)量最多的前三個(gè)bin作為最終的匹配對結(jié)果。其他的匹配對全部予以刪除。至此,我們的最優(yōu)匹配就全部確定了。
不過,值得注意的是,我們實(shí)際上匹配的點(diǎn)只是一部分,另一部分沒有匹配到的,在后面會(huì)通過共試圖關(guān)鍵幀以及局部地圖重投影進(jìn)行進(jìn)一步匹配,我們會(huì)在后續(xù)的內(nèi)容中講解。
?總結(jié):
本文主要介紹了ORBSLA2中的匹配方案,以及詞袋模型的生成方法。本文在文末提供了一些參考文獻(xiàn),歡迎大家查閱。
(為了讓大家能更直觀的了解ORBSLAM2的圖像匹配,本文后續(xù)會(huì)提供圖像匹配的源碼。。。)
下一講,我將為大家介紹ORBSLAM2的運(yùn)動(dòng)估計(jì)模塊。
參考文獻(xiàn):
[1]?A Fast and incremental method for loop-closure detection using bags of visual words
[2] 視覺SLAM十四講
PS:
如果您覺得我的博客對您有所幫助,歡迎關(guān)注我的博客。此外,歡迎轉(zhuǎn)載我的文章,但請注明出處鏈接。
對本文有任何問題可以在留言區(qū)進(jìn)行評論,也可以在泡泡機(jī)器人論壇:http://paopaorobot.org/bbs/index.php?c=cate&fid=1中的SLAM技術(shù)交流模塊發(fā)帖提問。
我的github鏈接是:https://github.com/yepeichu123/orbslam2_learn。
?
轉(zhuǎn)載于:https://www.cnblogs.com/yepeichu/p/10723171.html
總結(jié)
以上是生活随笔為你收集整理的(三)ORB特征匹配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端模拟数据的技术方案(二)
- 下一篇: ansible自动化部署