1.ORB特征
是目前看來非常具有代表性的實時圖像特征。[ORB特征:改進的FAST(oriented FAST)關鍵點+BRIEF描述子]
這個博客講的很詳細可做參考:http://blog.csdn.net/qq_18661939/article/details/52900524
2.漢明距離:
漢明距離是以理查德•衛斯里•漢明的名字命名的。在信息論中,兩個等長字符串之間的漢明距離是兩個字符串對應位置的不同字符的個數。換句話說,它就是將一個字符串變換成另外一個字符串所需要替換的字符個數。例如:
1011101 與 1001001 之間的漢明距離是 2。
2143896 與 2233796 之間的漢明距離是 3。
"toned" 與 "roses" 之間的漢明距離是 3。
給予兩個任何的字碼,10001001和10110001,即可決定有多少個相對位是不一樣的。在此例中,有三個位不同。要決定有多少個位不同,只需將xor運算加諸於兩個字碼就可以,並在結果中計算有多個為1的位。例如:
10001001
Xor 10110001
00111000
兩個字碼中不同位值的數目稱為漢明距離(Hamming distance) 。
3.直接法
3.1直接法介紹
直接法是視覺里程計另一主要分支,它與特征點法有很大不同。隨着SVO、LSD-SLAM等直接法SLAM方案的流行,直接法本身也得到越來越多的關注。盡管特征點法在視覺里程計中占據主流地位,研究者們認識它至少有以下幾個缺點:
- 關鍵點的提取與描述子的計算非常耗時。實踐當中,SIFT目前在CPU上是無法實時計算的,而ORB也需要近20毫秒的計算。如果整個SLAM以30毫秒/幀的速度運行,那么一大半時間都花在計算特征點上。
- 使用特征點時,忽略了除特征點以外的所有信息。一張圖像有幾十萬個像素,而特征點只有幾百個。只使用特征點丟棄了大部分可能有用的圖像信息。
- 相機有時會運動到特征缺失的地方,往往這些地方都沒有什么明顯的紋理信息。例如,有時我們會面對一堵白牆,或者一個空盪盪的走廓。這些場景下特征點數量會明顯減少,我們可能找不到足夠的匹配點來計算相機運動。
我們看到使用特征點確實存在一些問題。針對這些缺點,也存在若干種可行的方法:
- 只計算關鍵點,不計算描述子。同時,使用光流法(Optical Flow)來跟蹤特征點的運動。這樣可以回避計算和匹配描述子帶來的時間,但光流本身的計算需要一定時間;
- 只計算關鍵點,不計算描述子。同時,使用直接法來計算特征點在下一時刻圖像的位置。這同樣可以跳過描述子的計算過程,而且直接法的計算更加簡單。
- 既不計算關鍵點、也不計算描述子——根據像素來直接計算相機運動。
第一種方法仍然使用特征點,只是把匹配描述子替換成了光流跟蹤,估計相機運動時仍使用PnP或ICP算法。而在,后兩個方法中,我們會根據圖像的像素信息來計算相機運動,它們稱為直接法。
使用特征點法估計相機運動時,我們把特征點看作固定在三維空間的不動點。根據它們在相機中的投影位置,通過最小化重投影誤差(Reprojection error)來優化相機運動。在這個過程中,我們需要精確地知道空間點在兩個相機中投影后的像素位置——這也就是我們為何要對特征進行匹配或跟蹤的理由。//而在直接法中,我們最小化的不再是重投影誤差,而是測量誤差(Phometric error)。
直接法是本講介紹的重點。它的存在就是為了克服特征點法的上述缺點(雖然它會引入另一些問題)。直接法直接根據像素亮度信息,估計相機的運動,可以完全不用計算關鍵點和描述子。於是,直接法既避免了特征的計算時間,也避免了特征缺失的情況。只要場景中存在明暗變化(可以是漸變,不形成局部的圖像特征),直接法就能工作。根據使用像素的數量,直接法分為稀疏、稠密和半稠密三種,具有恢復稠密結構的能力。相比於特征點法通常只能重構稀疏特征點,直接法和稠密重建有更緊密的聯系。
歷史上,雖然早期也有一些對直接法的使用,但直到RGB-D相機出現后,人們才發現直接法對RGB-D相機,進而對單目相機,都是行之有效的方法。隨着一些使用直接法的開源項目的出現(如SVO、LSD-SLAM等),它們逐漸地走上主流舞台,成為視覺里程計算法中重要的一部分。
3.2直接法數學推導
直接法和光流非常相似,它們都是基於灰度不變假設的:
灰度不變假設:同一個空間點的像素灰度,在各個圖像中是固定不變的。
灰度不變假設是一個很強的假設,實際當中很可能不成立。事實上,由於物體的材質不同,像素會出現高光和陰影部分;有時,相機會自動調整曝光參數,使得圖像整體變亮或變暗。這些時候灰度不變假設都是不成立的,因此直接法/光流的結果也不一定可靠。不過,暫且讓我們認為該假設成立,從而看看如何計算相機的運動。
3.2直接法的使用
在我們上面的推導中,P是一個已知位置的空間點,它是怎么來的呢?在RGB-D相機下,我們可以把任意像素反投影到三維空間,然后投影到下一個圖像中。如果在單目相機中,我們也可以使用已經估計好位置的特征點(雖然是特征點,但直接法里是可以避免計算描述子的)。根據P的來源,我們可以把直接法進行分類:
- P來自於稀疏特征點,我們稱之為稀疏直接法。通常我們使用數百個特征點,並且會像L-K光流那樣,假設它周圍像素也是不變的。這種稀疏直接法速度不必計算描述子,並且只使用數百個像素,因此速度最快,但只能計算稀疏的重構。
- P來自部分像素。我們看到式(12)中,如果像素梯度為零,整一項雅可比就為零,不會對計算運動增量有任何貢獻。因此,可以考慮只使用帶有梯度的像素點,舍棄像素梯度不明顯的地方。這稱之為半稠密(Semi-Dense)的直接法,可以重構一個半稠密結構。
- P為所有像素,稱為稠密直接法。稠密重構需要計算所有像素(一般幾十萬至幾百萬個),因此多數不能在現有的 CPU上實時計算,需要GPU的加速。可以看到,從稀疏到稠密重構,都可以用直接法來計算。它們的計算量是逐漸增長的。稀疏方法可以快速地求解相機位姿,而稠密方法可以建立完整地圖。具體使用哪種方法,需要視機器人的應用環境而定。
3.3直接法的討論
3.4 直接法的優缺點總結
大體來說,它的優點如下:
- 可以省去計算特征點、描述子的時間。
- 只要求有像素梯度即可,無須特征點。因此,直接法可以在特征缺失的場合下使用。比較極端的例子是只有漸變的一張圖像。它可能無法提取角點類特征,但可以用直接法估計它的運動。
- 可以構建半稠密乃至稠密的地圖,這是特征點法無法做到的。
另一方面,它的缺點也很明顯:
- 非凸性——直接法完全依靠梯度搜索,降低目標函數來計算相機位姿。其目標函數中需要取像素點的灰度值,而圖像是強烈非凸的函數。這使得優化算法容易進入極小,只在運動很小時直接法才能成功。
- 單個像素沒有區分度。找一個和他像的實在太多了!——於是我們要么計算圖像塊,要么計算復雜的相關性。由於每個像素對改變相機運動的“意見”不一致。只能少數服從多數,以數量代替質量。
- 灰度值不變是很強的假設。如果相機是自動曝光的,當它調整曝光參數時,會使得圖像整體變亮或變暗。光照變化時亦會出現這種情況。特征點法對光照具有一定的容忍性,而直接法由於計算灰度間的差異,整體灰度變化會破壞灰度不變假設,使算法失敗。