orbslam2匹配方法流程
在基於特徵點的視覺slam系統中,特徵匹配是資料關聯最重要的方法。特徵匹配為後端優化提供初值資訊,也為前端提供較好的里程計資訊,可見,若特徵匹配出現問題,則整個視覺slam系統必然會崩掉。因此,本系列將特徵匹配獨立成一講進行分析。
orbslam2中的匹配流程如下所述:
1. 計算當前幀描述子對應的bow向量;
2. 設定匹配閾值;
3. 進行bow特徵向量匹配確定最優匹配;
4. 統計匹配描述子角度偏差並篩選,確定最終匹配。
接下來,我們一起再細細分析一下,每一步它具體是怎麼做的。
詞袋模型
在進入正題之前,需要給大家普及一下,什麼叫bow。bow就是bag of word,是詞袋模型中的詞彙組合而成的向量。
到這裡,大家肯定又會有疑惑,什麼叫詞袋模型?
從字面上非常直觀的意思就是:裝著很多詞彙的袋子。那麼,這個袋子裡面的詞袋究竟是什麼?怎麼來的呢?
我們知道,一幀影象中,可以提取到很多的特徵點,每乙個特徵點都是乙個影象區域性塊的描述,那麼相似場景下的特徵點,其描述應該是比較接近的。如果我們將這些常見場景的相似特徵進行聚類,下一次再遇到相似的特徵,能不能直接用我們聚類的結果來表示這個特徵呢?顯然是可以的。也就是說,我們把所有相似的特徵描述都進行統一化,最終得到乙個唯一的描述。而詞袋模型就是將所有常見場景的特徵描述子按照樹狀圖進行分層聚類,最終得到的一系列聚類中心——統一化的特徵描述。
如圖所示,上述樹結構是乙個聚類中心k為3,深度d為2的詞彙樹,共計產生kd也就是9個詞彙。
比如我有10幀影象,每幀影象提取了500個特徵點,那麼總共有5000個特徵點。首先將其聚成3類,作為粗略的篩選。在這三個聚類中心的基礎上,每個大類下的特徵點再進一步聚成三類。所以我們將5000個特徵點分成了9大類,即9個詞彙,對於屬於詞彙w5的描述子,其最終表示是[ 0 0 0 0 1 0 0 0 0 ],對於每乙個詞彙,都儲存著其對應的權重。對於任意一張輸入影象,所有特徵點通過詞袋模型轉換以後變成 [ 50 50 100 0 0 50 50 100 100 ],即輸入影象中的所有特徵點直接轉換成了乙個9維的向量,在影象檢索時非常高效。
但是,上述的詞袋模型對於我們的問題來說,實在是太小了。因此,orbslam中回環檢測裡採用的詞袋模型,是從一些常用場景的大量影象中提取了特徵點後進行上述基於樹結構的聚類。當然,其樹結構肯定是更大更深的,比如,聚類中心k為10,深度d為5的詞彙樹,共計產生十萬個詞彙。這個龐大的詞彙樹可以讓不那麼相似的特徵分開,使得bow向量更加具有區分度。
轉換成bow向量
對於輸入影象的所有特徵點,我們通過詞袋模型轉換成對應詞彙,在樹結構龐大的情況下,我們不能在乙個向量中包含所有詞彙,一方面是考慮記憶體,另一方面考慮檢索效率。因此,我們只儲存非0的詞彙,即 i = ,花括號裡(a,b),a表示詞彙id,b表示權重。需要注意的是,這裡的權重是我隨機寫的,只是為了方便大家理解,實際的權重必須是根據統計結果算出來的。
以上述的樹結構為例,對於任意乙個特徵點,我們從root節點出發,與第一層聚類中心進行粗匹配,選擇匹配分數最高的乙個聚類中心。接著,繼續與其子類進行特徵匹配,找到最優的匹配,直到葉子為止,這個葉子就是我們之前所說的詞彙。假設最終找到的詞彙是w3,則這個描述子對應的bow就是(w3,0.02),通過將所有特徵點進行相同的操作,我們可以得到一系列詞彙id和權重,將其串起來就得到了我們要的bow向量了。
特徵匹配
通過上述的方法,我們將待匹配影象的特徵點轉換成bow向量,在匹配時我們查詢兩幀bow向量中相同id的詞彙,特徵匹配只在有相同id的詞彙中進行。顯然,這個過程限定了匹配範圍,可以提高匹配的速度。當然,匹配的精度跟詞彙樹的大小和深度有關係。
假設在影象1中,id為3的詞彙中包含6個特徵點,同理,影象2中包含3個特徵點。則對影象1中的每個特徵點都與影象2中的每個特徵點計算匹配分數,通過最近鄰比例法,結合閾值條件篩選出最優的匹配對。值得注意的是,在影象2中已經匹配過的特徵點,影象1其餘特徵點就不再與之匹配了。
形象一點說:影象1中有6名男士,影象2中有3名女士,自由牽手組合。當影象1中的一名男士與影象2中的所有女士進行交流後(特徵匹配),有其中一位好感度比較高(匹配分數高於匹配閾值),那麼就牽手成功了。這時,影象1中剩餘5名男士自然無法匹配已經被選擇的那名女士。相反,如果所有女士都對其好感度較低(匹配分數低於匹配閾值),則說明牽手失敗。(即匹配失敗)
確定最優匹配
orbslam2中將360°分成30個bin,每個bin的範圍是12°。對於影象1和影象2任意兩個對應匹配特徵,我們計算其二者主方向的夾角。根據夾角的大小確定在哪個角度範圍裡,並將特徵索引存入對應bin中。
我們統計每個bin中儲存的索參數量,取數量最多的前三個bin作為最終的匹配對結果。其他的匹配對全部予以刪除。至此,我們的最優匹配就全部確定了。
不過,值得注意的是,我們實際上匹配的點只是一部分,另一部分沒有匹配到的,在後面會通過共試圖關鍵幀以及區域性地圖重投影進行進一步匹配,我們會在後續的內容中講解。
總結:
[1] a fast and incremental method for loop-closure detection using bags of visual words
[2] 視覺slam十四講
ps:
我的github鏈結是:
ORB特徵提取與匹配
特徵點的檢測 影象的特徵點可以簡單的理解為影象中比較顯著顯著的點,如輪廓點,較暗區域中的亮點,較亮區域中的暗點等。orb採用fast features from accelerated segment test 演算法來檢測特徵點。這個定義基於特徵點周圍的影象灰度值,檢測候選特徵點周圍一圈的畫素值,...
ORB特徵提取與匹配
orb特徵是目前最優秀的特徵提取與匹配演算法之一,下面具體講解一下 特徵點的檢測 影象的特徵點可以簡單的理解為影象中比較顯著顯著的點,如輪廓點,較暗區域中的亮點,較亮區域中的暗點等。orb採用fast features from accelerated segment test 演算法來檢測特徵點。...
ORB特徵點檢測與匹配
orb特徵是目前最優秀的特徵提取與匹配演算法之一,下面具體講解一下 特徵點的檢測 影象的特徵點可以簡單的理解為影象中比較顯著顯著的點,如輪廓點,較暗區域中的亮點,較亮區域中的暗點等。orb採用fast features from accelerated segment test 演算法來檢測特徵點。...