VSLAM系列原創(chuàng)05講 | 單目初始化中如何進(jìn)行特征匹配?原理+代碼
原文鏈接:https://mp.weixin.qq.com/s/1jX5cfvMHLzuXsX7DB7Qdg
本文系ORB-SLAM2原理+代碼實(shí)戰(zhàn)系列原創(chuàng)文章,對(duì)應(yīng)的視頻課程見:
如何真正搞透視覺SLAM?
大家好,從今天開始我們陸續(xù)更新ORB-SLAM2/3系列的原創(chuàng)文章,以小白和師兄對(duì)話的形式闡述背景原理+代碼解析,喜歡的點(diǎn)個(gè)贊分享,支持的人越多,更新越有動(dòng)力!如有錯(cuò)誤歡迎留言指正!
代碼注釋地址:
https://github.com/electech6/ORB_SLAM2_detailed_comments
VSLAM系列原創(chuàng)01講 | 深入理解ORB關(guān)鍵點(diǎn)提?。涸?代碼
VSLAM系列原創(chuàng)02講 | ORB描述子如何實(shí)現(xiàn)旋轉(zhuǎn)不變性?原理+代碼
VSLAM系列原創(chuàng)03講 | 為什么需要ORB特征點(diǎn)均勻化?
VSLAM系列原創(chuàng)04講 | 四叉樹實(shí)現(xiàn)ORB特征點(diǎn)均勻化分布:原理+代碼
接上回繼續(xù)。。。
ORBSLAM2中的特征匹配
小白:師兄,ORB-SLAM2里有很多種特征匹配函數(shù),看的我眼花繚亂,為什么有這么多種呢?怎么決定什么時(shí)候用哪一種特征匹配方法呢?
師兄:確實(shí)是比較多,但是基本思想是類似的,而且很多函數(shù)多次重載。我把特征匹配的幾個(gè)重要函數(shù)都列出來,做了說明,見下:
下面選擇幾個(gè)典型代碼進(jìn)行分析。
單目初始化中的特征匹配
師兄:單目初始化時(shí),沒有任何的先驗(yàn)信息如何進(jìn)行特征匹配呢?
小白:我能想到的就是暴力匹配了。。。
師兄:暴力匹配缺點(diǎn)太多了,比如:
效率極低。單目初始化時(shí)提取的特征點(diǎn)是平時(shí)跟蹤的好幾倍,ORB-SLAM2里是2倍,ORB-SLAM2里最高達(dá)到了5倍,若采用暴力匹配計(jì)算量會(huì)指數(shù)級(jí)上升,無法接受。
效果不好。花那么大的代價(jià)去匹配,如果效果好也就忍了,可事與愿違,因?yàn)槭恰昂翢o目的”的匹配,所以誤匹配非常多。
因此用“吃力不討好”來形容暴力匹配太適合不過了。如果我們能找到一些先驗(yàn)信息,哪怕不那么準(zhǔn)確的先驗(yàn)信息,加以利用,就能大大緩解上述情況。
在ORB-SLAM2的單目純視覺初始化里的思路是這樣的,參與初始化的兩幀我們默認(rèn)是比較接近的,也就是說,我們?cè)诘?幀提取的特征點(diǎn)坐標(biāo)對(duì)應(yīng)的第2幀里的位置附近畫一個(gè)圓,匹配點(diǎn)應(yīng)該就落在這個(gè)圓里。
如下圖所示,假設(shè)第1幀中提取到的某個(gè)特征點(diǎn)坐標(biāo)為,我們?cè)诘?幀同樣坐標(biāo)(圓心)附近畫一個(gè)半徑為的圓,所有在這個(gè)圓內(nèi)的特征點(diǎn)(圓內(nèi)紅色的點(diǎn))都是候選的匹配特征點(diǎn),然后再用和所有的候選匹配點(diǎn)進(jìn)行匹配,找到滿足如下條件的特征點(diǎn)就認(rèn)為是完成了特征匹配:
條件1:遍歷候選匹配點(diǎn)里最優(yōu)和次優(yōu)的匹配,最優(yōu)匹配對(duì)應(yīng)的描述子距離比次優(yōu)匹配對(duì)應(yīng)的描述子距離小于設(shè)定的比例。
條件2:最優(yōu)匹配對(duì)應(yīng)的描述子距離小于設(shè)定的閾值。
條件3:經(jīng)過方向一致性檢驗(yàn)。
如何快速確定候選匹配點(diǎn)?
師兄:上面提到了需要先確定候選匹配點(diǎn),由于初始化時(shí)無法知曉相機(jī)的運(yùn)動(dòng)大小,所以確定候選匹配點(diǎn)時(shí)搜索圓半徑會(huì)設(shè)置的相對(duì)比較大(代碼里半徑為100個(gè)像素)。你算下大概有多少像素?
小白:我簡單算了下,約有?個(gè)像素,哇!這個(gè)區(qū)域挺大了?。?/p>
師兄:是的,這樣雖然比暴力匹配縮小了范圍,但是索引的像素區(qū)域也是比較大的,如果逐像素匹配代價(jià)也非常大。
小白:ORB-SLAM2肯定采取了什么方法來加速吧?
師兄:是的,方法就是劃分網(wǎng)格。這個(gè)在提取完特征點(diǎn)后就已經(jīng)順手將特征點(diǎn)劃分為不同的網(wǎng)格并記錄在mGrid里。在這里就派上了用場。如下圖所示,搜索的時(shí)候是以網(wǎng)格為單位進(jìn)行搜索的,代碼里網(wǎng)格尺寸默認(rèn)是,這樣圓里包含的網(wǎng)格數(shù)目就大大減少。具體過程如下:
我們先根據(jù)圓的范圍確定圓的上下左右邊界分別在哪個(gè)網(wǎng)格內(nèi)。圖中圓的邊界在水平坐標(biāo)軸上的坐標(biāo)范圍是mMinCellX~mMaxCellX,在垂直坐標(biāo)軸上的坐標(biāo)范圍是mMinCellY~mMaxCellY。mnMinX是圖像的左側(cè)邊界對(duì)應(yīng)的像素坐標(biāo)。
遍歷圓形區(qū)域內(nèi)所有的網(wǎng)格。如果某個(gè)網(wǎng)格內(nèi)沒有特征點(diǎn),那么直接跳過;如果某個(gè)網(wǎng)格內(nèi)有特征點(diǎn)(見下圖中綠色方框),遍歷這些特征點(diǎn),判斷這些特征點(diǎn)是否符合要求的金字塔層級(jí),是否在圓內(nèi),如果滿足條件會(huì)把該特征點(diǎn)作為候選特征點(diǎn)。這種方式大大提高了搜索效率。

快速搜索候選匹配點(diǎn)的代碼見:
(左右滑動(dòng)看完整代碼)
方向一致性檢驗(yàn)
師兄:經(jīng)過上面條件1、2的檢驗(yàn)后,我們還要做方向一致性檢驗(yàn)。因?yàn)橥ㄟ^特征點(diǎn)匹配后的結(jié)果仍然可能不一定準(zhǔn)確,我們需要剔除掉其中的錯(cuò)誤匹配。原理是統(tǒng)計(jì)兩張圖像所有匹配對(duì)中兩個(gè)特征點(diǎn)主方向的差,構(gòu)建一個(gè)直方圖。由于兩張圖像整體發(fā)了運(yùn)動(dòng),所以特征點(diǎn)匹配對(duì)主方向整體會(huì)有一個(gè)統(tǒng)一一致的變化,我們認(rèn)為直方圖里前三個(gè)最大的格子(代碼里稱為bin)里就是正常的匹配點(diǎn)對(duì),那些誤匹配的特征點(diǎn)對(duì)此時(shí)就會(huì)暴露了,會(huì)落在直方圖上述之外的其他格子里,這些就是需要剔除的錯(cuò)誤匹配。
我們舉個(gè)可能不是很恰當(dāng)?shù)睦觼眍惐纫幌?,軍?xùn)時(shí)所有人都站的筆直,教官下令“向左轉(zhuǎn)”,此時(shí)大部分人都能正確的向左轉(zhuǎn)90°左右,當(dāng)然大家轉(zhuǎn)動(dòng)的幅度可能不同,但基本都朝著同一個(gè)方向旋轉(zhuǎn)了80°~100°左右,這就相當(dāng)于我們前面說的直方圖里前三個(gè)最大的格子。但可能會(huì)有少量分不清左右的人向右轉(zhuǎn)或者干脆不轉(zhuǎn),此時(shí)他們相對(duì)之前的旋轉(zhuǎn)角度可能是-90°或0°,因?yàn)檫@樣的人很少,對(duì)應(yīng)直方圖頻率就很低,角度變化就不在直方圖前三大的格子里,就是需要剔除的對(duì)象。
下圖(a)是初始的特征匹配對(duì),(b)是經(jīng)過方向一致性驗(yàn)證后刪除的特征匹配對(duì)。我們可以看到明顯錯(cuò)誤匹配對(duì)被剔除了。

源碼解析
這部分代碼見:
(左右滑動(dòng)看完整代碼)
歡迎支持獨(dú)家視頻課程:如何真正搞透視覺SLAM?
微信掃描二維碼查看、購買、學(xué)習(xí)課程:

如果想要求拼團(tuán),或?qū)φn程有任何疑問,歡迎加入咨詢?nèi)海?br>

專輯:計(jì)算機(jī)視覺方向簡介
專輯:視覺SLAM入門
專輯:最新SLAM/三維視覺論文/開源
專輯:三維視覺/SLAM公開課
專輯:深度相機(jī)原理及應(yīng)用
專輯:手機(jī)雙攝頭技術(shù)解析與應(yīng)用
專輯:相機(jī)標(biāo)定
專輯:全景相機(jī)