特征點是什么
SLAM需要根據路標來計算當前相機的位置和姿態。而視覺SLAM的路標就是圖像中的特征點了。注意:只要談到圖像中的特征點你就得記得它包含兩個內容關鍵點
和描述子
。關鍵點指的特征點在圖像中的位置,而描述子是指的是關鍵點的朝向和周圍像素信息。相同特征點他們的描述子相似。
現在已有很多特征點提取算法。其中既能兼顧性能又能兼顧精度的一種特征點提取算法那就是:ORB特征點。前面我們提到了只要提到特征點那就意味着包含兩個東西:關鍵點和描述子。
ORB特征點
ORB它的關鍵點叫做Oriented FAST,就是有方向的FAST關鍵點。ORB的描述子是BRIEF描述子。
我們現在先解釋下什么是FAST關鍵點
FAST關鍵點
它的思想是任何物體的邊緣一定是灰度值變化較大,那么我只用比較哪些地方灰度值變化較大。然后把這個地方作為關鍵點。然后它怎么做的呢?遍歷整個圖片的像素。為了判斷一個像素是不是關鍵點,它在周圍以3像素為半徑畫一個圈。這個圈上有16個像素點。比較當前像素點與這16個像素點的差異。當然我們需要設定一個閾值,差異度超過多少算高差異。然后統計高差異的像素點個數。FAST-12認為>=12個大差異的像素點那就把當前像素點設置為關鍵點,FAST-11是認為11個,FAST-9是認為9個。
ORB對FAST關鍵點的改進:
原始的FAST關鍵點存在缺點:
- FAST關鍵點數量很大,而我們往往只想找固定數量的特征點。於是ORB對FAST算法進行改進:
FAST選定的那些點的原始像素計算Harris響應值,然后選取前N個最大的。FAST-12就選12個最大的。
- FAST關鍵點沒有方向。然后ORB的改進就是說找到整個圖像塊的質點,關鍵點與質點的連線就是方向。
講完關鍵點了接下來需要講ORB使用的BRIEF(Binary Robust Independent Elementary Feature)描述子。
BRIEF描述子
描述子的作用是用來匹配兩個特征點是否是同一個特征點。一般描述子的構造都是在關鍵點周圍畫個圈,對圈內的像素點進行計算得到一個向量。這個向量能反映這個關鍵點周圍像素的特點。即它可以描述當前這個特征點的周圍特性。因為相同的特征點周圍肯定是相似的,所以可以用描述子來判斷兩個特征點是不是同一個。
而BRIEF描述子它是怎么提取周圍像素的特征的呢?
它做法非常簡單。就是從周圍選N對像素點。比如說其中第i對像素點是(p,q)如果p比q大,描述子向量第i個值就是1,反之則是0. 描述子向量的維度是N。選N對像素點就是BRIEF-N。一般是隨機選的。當然你也可以自己設計選取像素點的規則。
當然ORB對BRIEF也進行了改進,改進的方法是利用之前得到的關鍵點與質點的連線方向對圖片進行旋轉然后獲取描述子。為什么要旋轉?因為兩個特征雖然長的一樣,但是如果他們發生了旋轉那么他們提取到的周圍的特征那就很不一樣的。這樣會使得程序認為他們兩個為不一樣的特征點。
現在我們已經講好了ORB特征點是什么,以及怎么獲得。我怎么知道哪些是相同的特征點呢?(因為我們要根據相同特征點他們之間位置關系來計算出相機的位置和姿態關系),接下來介紹下如何判斷兩張圖提取的特征點是否為同一個。
根據特征點的描述子比較特征點之間的相似度
我們已經知道ORB使用的描述子是一個二進制向量長得像這樣:[1,0,1,0,0,1…]。那么怎么比較兩個特征點相似度呢?最簡單方法是暴力比較。如何度量相似度?我們直接比較數字相同的個數。由於都是二進制,進行XOR運算就很快計算出數字不同的個數。當特征點很多的時候暴力匹配很耗費時間,所以一般是用快速最近鄰算法FLANN找相同特征點。
OpenCV已經集成了ORB特征點的提取算法。