1. 程式人生 > >ORB_SLAM2基礎知識-ORB特徵

ORB_SLAM2基礎知識-ORB特徵

前面轉載過一篇ORB特徵的原理解讀,我感覺講的是很詳細的,但是特徵點在SLAM中的運用,還不是很清楚,我們知道特徵點是由關鍵點和描述子組成的。常見的特徵有SIFT特徵,SURF特徵等。那麼為什麼ORB-SLAM2選擇ORB特徵呢?這是因為雖然SIFT考慮了影象變換過程中出現的光照、尺寸、旋轉等變化,但需要較大計算量,在沒有GPU加速的情況下,很難在SLAM這種系統中進行實時計算,另一方面,SIFT特徵和SURF特徵是受到專利保護的,需要付費使用。

ORB取名已經反映出其是一個結合了改良後的FAST角點提取和BRIEF描述子的演算法,提取ORB特徵分為兩步:

1、FAST關鍵點提取:找出影象中的FAST角點,相較於原版的FAST,ORB中計算了特徵點的主方向,為後續的BRIEF描述子增加了旋轉不變性;

2、BRIEF描述子:對上一步提取出關鍵點的周圍影象區域進行描述。


FAST是一種角點,主要檢測區域性畫素灰度變化明顯的地方,以速度快著稱。FAST只需要比較畫素亮度大小,速度很快,它的檢測過程如下:

1、在影象中選取畫素pp,假設它的亮度為IpIp;

2、設定一個閾值TT(比如IpIp的20%);

3、以畫素p為中心,選取半徑為3的圓上的16個畫素點;

4、假如選取的圓上有連續的N個點的亮度大於Ip+TIp+T或者小於Ip−TIp−T,那麼畫素pp可以被認為是特徵點(N通常取12,即FAST-12)。

5、迴圈以上四步,對每一個畫素執行相同的操作。

FAST角點檢測雖然速度很快,但是它存在一些問題。首先是FAST角點數量很大且不確定,因此ORB對其進行改進。ORB指定最終要提取的角點數量N,對原始FAST角點分別計算Harris響應值,然後選取前N個具有最大值的角點作為最終的角點集合。

其次,FAST不具有尺寸,因此ORB構建影象金字塔,對影象進行不同層次的降取樣,獲得不同解析度的影象,並在金字塔的每一層上檢測角點,從而獲得多尺寸特徵。(前面一直搞不清為什麼要用金字塔來取特徵點)

FAST沒有計算旋轉,因此ORB通過計算以FAST角點O為中心的影象塊的質心C,那麼向量OC→OC→的方向就是特徵點的方向,具體值通過影象塊的矩得到。

通過各種改進,FAST特徵具有了尺寸和旋轉的描述,在ORB中,把這種改進後的FAST稱為oFAST。

BRIEF描述子
BRIEF描述子是一種二進位制字元描述子,其描述向量定義如下:

fn(p)=∑1≤i≤n2i−1τ(p;xi,yi)
fn(p)=∑1≤i≤n2i−1τ(p;xi,yi)
其中,

τ(p;x,y)={1,0,p(x)<p(y)p(x)≥p(y)
τ(p;x,y)={1,p(x)<p(y)0,p(x)≥p(y)
p(x)p(x) 是影象塊p中點xx的強度。ττ的選擇有很多種,常見的選擇方式是圍繞影象塊中心的高斯分佈。n選為256的話,fn(p)fn(p)就是256維的向量。BRIEF由於使用了二進位制表達,儲存起來十分方便,適用於實時的影象匹配。原始的BRIEF描述子不具有旋轉不變性,因此在圖片發生旋轉時,匹配效能會急速下降。ORB根據之前關鍵點的方向來旋轉影象塊,得到“steer BRIEF”。

BRIEF具有每個bit的方差很大,均值約為0.5的特性,但是“steer BRIEF”喪失了這種特性,其均值不再集中在0.5左右。可以理解為特定方向的角點關鍵點使得其產生髮散。這樣會導致使用“steer BRIEF”進行匹配時的錯誤率變高,因為“steer BRIEF”的方差發生了虧損,彼此之間區分度降低。同時我們希望每個ττ彼此不相干,這樣得到的BRIEF更加有區分度。

為了解決上述問題,BRIEF採用了貪婪搜尋,對所有可能的ττ進行搜尋,找出既具有高方差,均值約為0.5,同時又不相干的ττ,最終結果稱為rBRIEF。

由於考慮了旋轉和縮放,使得ORB在平移、旋轉和縮放的變換下仍具有良好的表現。同時,FAST和BRIEF的計算非常高效,使得ORB特徵在實時SLAM系統中得以應用。