Visual Odometry 是以相機所拍攝到的一連串影像為輸入,經影像處理後,還原相機在拍攝時的位移過程 - 包含:移動及旋轉,於是可以得知,相機在拍攝當下的移動方向、距離及旋轉方向,建立當時行走的軌跡;如果在拍攝影像時,即時作相同的影像處理,則可以得到即時的相機位移情況。




原理

以追蹤特徵點的方式,找尋每張影像與下一張影像間特徵點的移動距離及方向,再以這些特徵點的移動資訊為輸入,利用 Epipolar Geometry Model,推導出影像間,相機的移動及旋轉,依此計算方式,可以計算出全部影像與其下一張影像之間的相機移動及旋轉,之後再將這些影像間相機的移動及旋轉作累計計算,即可得到影像序列拍攝時,該相機的軌跡。

舉例來說:
假設某個影像序列有 1 ~ 100 張影像,先計算第1張影像與第2張影像的特徵點的位移變化,也就是分別將這些特徵點在第1張影像及第2張影像的座標位置紀錄下來,作為 Epipolar Geometry 的輸入依據,Epipolar Geometry 會根據這些特徵點的移動資訊,計算出第1張影像與第2張影像之間可能的相機位移變化,完成之後,再繼續作第2、3張影像之間的相機位移變化,接著是第3、4張,第4、5張…,以此類推作到第99、100張,最後將全部的位移變化累計計算,即可得到相機在拍該攝影像序列時的軌跡圖。

Epipolar Geometry Model:





程式流程及原理

  1. 讀取影像內容,並對該影像作特徵點偵測(Feature Detection),特徵點一般來說是 corner,也就是較為獨一無二的點,容易與其它影像的特徵點作比對或追縱。
  2. 以上一步驟所取得的特徵點為參考,對下一張影像做特徵點追蹤或比對(Feature Tracking / Matching)。
  3. 經上述步驟後,可以得到一系列特徵點分別在兩張影像的座標資訊,接著將這些資訊輸入 Epipolar Geometry Model,藉以計算兩張影像間的 Essential Matrix。
  4. 從 Essential Matrix 解析出影像間的相機位移及旋轉。
  5. 將影像間的相機移動及旋轉轉換成以第一張影像的方向為主的相機移動及旋轉。
  6. 重覆上述步驟,直至最後一張影像,即可得到影像序列在拍攝時,相機位移的軌跡。


依上述步驟,以 OpenCV 實作,各關鍵方程式的名稱為:
  1. Feature Detection: FAST(...), AGAST(...), ORB, SIFT, BRISK, KAZE, AKAZE
  2. Feature Tracking: calcOpticalFlowPyrLK(...)
    Feature Matching: cv::BFMatcher::match(...)
  3. Epipolar Geometry: findEssentialMat(...)
  4. 計算影像間的相機移動及旋轉 t, r :recoverPose(...)
  5. 計算以第一張影像的方向為主的相機移動及旋轉 T, R: T += R * t; R = r * R
    其中 T 的初始值為零矩陣, R 的始始值為單位矩陣。

注意:因為 Epipolar Geometry 理論本身的條件限制,其所計算得到的移動距離,並不是現實中的位移距離,例如:向左10公分 & 向前4公分 & 向上2分分,而是只能得到依比例單位的距離,如:向左5單位 & 向前2單位 & 向上1單位。




在以 OpenCV 實作時,需注意影像的座標系統,跟相機的座標系統是不一樣的,其中影像座標系統是指所輸入的影像,其座標系為:


而相機的座標系統是指經由 recoverPose(...) 所計算出來的相機移動,其座標系為:





Reference

https://github.com/avisingh599/mono-vo

文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知,謝謝。
創作者介紹

拾人牙慧點滴

silverwind1982 發表在 痞客邦 PIXNET 留言(0) 人氣()