視覺SLAM十四講第八講
阿新 • • 發佈:2020-10-21
第 8 講 視覺里程計 2
本節目標
- 理解光流法跟蹤特徵點的原理。
- 理解直接法是如何估計相機位姿的。
- 使用 g2o 進行直接法的計算。
一、直接法
直接法擁有如下的缺點:
1.、關鍵點的提取與描述子的計算非常耗時。
2、 使用特徵點時,忽略了除特徵點以外的所有資訊。
3.、相機有時會運動到特徵缺失的地方,往往這些地方沒有明顯的紋理資訊。
為了克服特徵點法的上述缺點而存在的。直接法根據畫素的亮度資訊,估計相機的運動,可以完全不用計算關鍵點和描述子,於是,既避免了特徵的計算時間,也避免了特徵缺失的情況。只要場景中存在明暗變化(可以是漸變,不形成區域性的影象梯度),直接法就能工作。根據使用畫素的數量,直接法分為稀疏、稠密和半稠密三種。相比於特徵點法只能重構稀疏特徵點(稀疏地圖),直接法還具有恢復稠密或半稠密結構的能力。
光流是一種描述畫素隨著時間,在影象之間運動的方法,隨著時間的經過,同一個畫素會在影象中運動,而我們希望追蹤它的運動過程。計算部分畫素運動的稱為稀疏光流,計算所有畫素的稱為稠密光流。稀疏光流以 Lucas-Kanade 光流為代表,並可以在 SLAM 中用於跟蹤特徵點位置。
1)LK光流
在 LK 光流中,我們認為來自相機的影象是隨時間變化的。影象可以看作時間的函式:I(t)。那麼,一個在 t 時刻,位於 (x, y) 處的畫素,它的灰度可以寫成
灰度不變假設:同一個空間點的畫素灰度值,在各個影象中是固定不變的。
對於 t 時刻位於 (x, y) 處的畫素,我們設 t + dt 時刻,它運動到 (x + dx, y + dy) 處。由於灰度不變,我們有:
對左邊進行泰勒展開,保留一階項,得:
因為我們假設了灰度不變,於是下一個時刻的灰度等於之前的灰度,從而
兩邊除以 dt,得:
其中 dx/dt 為畫素在 x 軸上運動速度,而 dy/dt 為 y 軸速度,把它們記為 u, v。同時 ∂I/∂x 為影象在該點處 x 方向的梯度,另一項則是在 y 方向的梯度,記為 Ix, Iy。把影象灰度對時間的變化量記為 It,寫成矩陣形式,有:
我們想計算的是畫素的運動 u, v,但是該式是帶有兩個變數的一次方程,僅憑它無法計算出 u, v。因此,必須引入額外的約束來計算 u, v。在 LK 光流中,我們假設某一個視窗內的畫素具有相同的運動。
考慮一個大小為 w × w 大小的視窗,它含有 w2 數量的畫素。由於該視窗內畫素具有同樣的運動,因此我們共有 w2 個方程:
於是整個方程為:
這是一個關於 u, v 的超定線性方程,傳統解法是求最小二乘解。最小二乘在很多時候都用到過:
三、直接法
P 是一個已知位置的空間點,根據 P 的來源,我們可以把直接法進行分類:
1、 P 來自於稀疏關鍵點,我們稱之為稀疏直接法。通常我們使用數百個至上千個關鍵點,並且像 L-K 光流那樣,假設它周圍畫素也是不變的。這種稀疏直接法不必計算描述子,並且只使用數百個畫素,因此速度最快,但只能計算稀疏的重構。
2、 P 來自部分畫素。如果畫素梯度為零,整一項雅可比就為零,不會對計算運動增量有任何貢獻。因此,可以考慮只使用帶有梯度的畫素點,捨棄畫素梯度不明顯的地方。這稱之為半稠密(Semi-Dense)的直接法,可以重構一個半稠密結構。
3.、P 為所有畫素,稱為稠密直接法。稠密重構需要計算所有畫素(一般幾十萬至幾百萬個),因此多數不能在現有的 CPU 上實時計算,需要 GPU 的加速。
最後,我們總結一下直接法的優缺點。大體來說,它的優點如下:
• 可以省去計算特徵點、描述子的時間。
• 只要求有畫素梯度即可,無須特徵點。因此,直接法可以在特徵缺失的場合下使用。比較極端的例子是隻有漸變的一張影象。它可能無法提取角點類特徵,但可以用直接法估計它的運動。
• 可以構建半稠密乃至稠密的地圖,這是特徵點法無法做到的。
另一方面,它的缺點也很明顯:
• 非凸性——直接法完全依靠梯度搜索,降低目標函式來計算相機位姿。其目標函式中需要取畫素點的灰度值,而影象是強烈非凸的函式。這使得優化演算法容易進入極小,只在運動很小時直接法才能成功。
• 單個畫素沒有區分度。找一個和他像的實在太多了!——於是我們要麼計算影象塊,要麼計算複雜的相關性。由於每個畫素對改變相機運動的“意見”不一致。只能少數服從多數,以數量代替質量。
• 灰度值不變是很強的假設。如果相機是自動曝光的,當它調整曝光引數時,會使得影象整體變亮或變暗。光照變化時亦會出現這種情況。特徵點法對光照具有一定的容忍性,而直接法由於計算灰度間的差異,整體灰度變化會破壞灰度不變假設,使演算法失敗。針對這一點,目前的直接法開始使用更細緻的光度模型標定相機,以便在曝光時間變化時也能讓直接法工作。