1. 程式人生 > >第7講 視覺里程計2 --- 求解相機的運動

第7講 視覺里程計2 --- 求解相機的運動

上一篇部落格中學習了特徵提取和匹配的概念,並且呼叫OpenCV庫實現了ORB特徵的提取和匹配。

找到了匹配點後,我們希望能夠根據匹配的  點對 來估計相機的運動。由於相機的原理不同,情況就變得有點複雜了:

  1. 當相機為單目的時候,我們只知道2D的畫素座標,因而問題是根據兩組2D點估計運動。該問題用對極幾何來解決。
  2. 當相機為雙目、RGB-D時,或者通過某種方法得到了距離資訊,那麼問題就是根據兩組3D點估計運動。該問題通常用ICP來解決。
  3. 如果有3D點及其在相機的投影位置,也能估計相機的運動。該問題通過PnP來求解。

1、對極約束

       下面先來看一下兩個相鄰幀之間的匹配點有什麼關係?

   

以上圖為例,我們設從I_{1}I_{2}的運動為R,\vec{t},兩個相機的中心分別為O_{1},O_{2}

現在,假設I_{1}中有一個特徵點p_{1},它在I_{2}中對應的點為p_{2}

(我們知道這是通過特徵匹配得到的,如果匹配結果正確的話,就可以認為p_{1},p_{2}是同一個空間點在兩個成像平面上投影)

現在,我們假設匹配結果是正確的,然後就可以開始下面的數學推導了:

I_{1}的座標系下,設點P的空間位置為P=[X,Y,Z]^{T}

根據針孔相機模型可以知道,兩個畫素點p_{1},p_{2}的畫素位置滿足:

z_{1}p_{1}=KPz_{2}p_{2}=K(RP+t)

因為使用的是齊次座標,所以在上式的左邊乘以任意一個非零常數也是成立的,則有:

p_{1}=KPp_{2}=K(RP+t)

現在取兩個畫素點在歸一化平面上的座標:x_{1}=K^{-1}p_{1}x_{2}=K^{-1}p_{2},代入上式中得:

x_{2}=Rx_{1}+t

然後兩邊同時左乘t^{\Lambda },注意:t^{\Lambda }t=t\times t=0,得:

t^{\Lambda }x_{2}=t^{\Lambda }Rx_{1}

然後,兩式同時左乘x_{2}^{T},得到:

x_{2}^{T}t^{\Lambda }x_{2}=x_{2}^{T}t^{\Lambda }Rx_{1}

因為t^{\Lambda }x_{2}=t\times x_{2}是一個和t,x_{2}都垂直的向量,所以:x_{2}^{T}t^{\Lambda }x_{2}=0,則有:

x_{2}^{T}t^{\Lambda }Rx_{1}=0

x_{1},x_2的值重新代入得到:

{\color{Red} p_{2}^{T}K^{-T}t^{\Lambda }RK^{-1}p_{1}=0}

上式就稱之為對極約束,它的幾何意義是O_1,O_2,P共面。

我們把上式的中間兩個部分記為兩個矩陣:基礎矩陣(Fundamental matrix)F、本質矩陣(Essential matrix)E

{\color{Red} E=t^{\Lambda }R}, {\color{Red} F=K^{-T}t^{\Lambda }RK^{-1}=K^{-T}EK^{-1}}

於是對極約束進一步簡化為下式:

有了上面的基礎之後,相機的位姿估計問題就可以分解為下面兩步:

(1)根據相鄰幀配對點的畫素位置求出E或者F

(2)根據E或者F求出R, t

注:由對極幾何的表示式也可以知道 利用對極幾何僅根據配對的畫素點位置就可以求相機運動,記為 2D-2D 問題(瞎說的)

2、本質矩陣E

       上面說了,根據 E 或者 F 都可以求出R, t,E 和 F 之間相差的就是相機內參K,而相機的內參矩陣在SLAM問題中一般是已知的,所以我們經常使用形式更加簡單的 本質矩陣E 來求解相機的運動。

       根據定義,本質矩陣E=t^{\Lambda}R,它是一個3*3的矩陣,內有9個未知數。另一方面,由於旋轉和平移各有3個自由度,故E=t^{\Lambda}R一共有6個自由度,但由於尺度等價性,E實際上只有5個自由度。E具有5個自由度的事實,表明我們最少可以用5對點來求解E。但是E的內在性質是一種非線性性質,在求解線性方程時會帶來麻煩,因此,也可以只考慮它的尺度等價性,使用8對點來估計E---------這就是經典的八點法。(ps: 我對這段話不是很理解)

       接下來的問題就是如何根據估計到的本質矩陣E,來分解出R和t了。這個過程是通過奇異值分解得到的。

3、單應矩陣H

       單應矩陣H,描述了兩個平面之間的對映關係。若場景中的特徵點都落在同一個平面上(比如牆、地面),則可以通過單應性來進行運動估計。這種情況在無人攜帶的俯視星際或者掃地機攜帶的頂視相機中比較常見。

下面從數學的角度說明一下什麼是單應矩陣:

考慮在影象I_{1},I_{2}上有一對匹配好的特徵點p_{1},p_{2},這些特徵點落在平面P上,設這個平面的方程為:

n^{T}P+d=0

整理一下,就是:

-\frac{n^{T}P}{d}=1

又因為:p_{2}=K(RP+t),可以得到:

p_{2}=K(RP+t(-\frac{n^{T}P}{d}))=K(R-\frac{tn^{T}}{d})P=K(R-\frac{tn^{T}}{d})K^{-1}p_{1}

令 H=K(R-\frac{tn^{T}}{d})K^{-1},於是p_{2}=Hp_{1}(H就是所謂的單應矩陣)

自由度為8的單應矩陣可以通過4對匹配特徵點算出(這些特徵點不能有三點共線的情況),然後通過H分解得到R,t。

計算出兩幅影象之間的單應矩陣H之後,可以有如下用途:

(1)根據H分解出相機的運動R、t

(2)應用p_{2}=Hp_{1}這個關係可以將一個檢視中的所有點變換到另一個圖的視角下的圖片。