1. 程式人生 > 實用技巧 >視覺SLAM十四講第八講

視覺SLAM十四講第八講

第 8 講 視覺里程計 2

本節目標

  1. 理解光流法跟蹤特徵點的原理。
  2. 理解直接法是如何估計相機位姿的。
  3. 使用 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 的加速。
    最後,我們總結一下直接法的優缺點。大體來說,它的優點如下:
    • 可以省去計算特徵點、描述子的時間。
    • 只要求有畫素梯度即可,無須特徵點。因此,直接法可以在特徵缺失的場合下使用。比較極端的例子是隻有漸變的一張影象。它可能無法提取角點類特徵,但可以用直接法估計它的運動。
    • 可以構建半稠密乃至稠密的地圖,這是特徵點法無法做到的。
    另一方面,它的缺點也很明顯:
    • 非凸性——直接法完全依靠梯度搜索,降低目標函式來計算相機位姿。其目標函式中需要取畫素點的灰度值,而影象是強烈非凸的函式。這使得優化演算法容易進入極小,只在運動很小時直接法才能成功。
    • 單個畫素沒有區分度。找一個和他像的實在太多了!——於是我們要麼計算影象塊,要麼計算複雜的相關性。由於每個畫素對改變相機運動的“意見”不一致。只能少數服從多數,以數量代替質量。
    • 灰度值不變是很強的假設。如果相機是自動曝光的,當它調整曝光引數時,會使得影象整體變亮或變暗。光照變化時亦會出現這種情況。特徵點法對光照具有一定的容忍性,而直接法由於計算灰度間的差異,整體灰度變化會破壞灰度不變假設,使演算法失敗。針對這一點,目前的直接法開始使用更細緻的光度模型標定相機,以便在曝光時間變化時也能讓直接法工作。