移動機器人相機模型:從相機移動到二維圖像

​ 若是隻是但願獲取圖像上的一些信息(例如特徵提取、擬合等),那麼咱們不會對三維空間中相機的位置有所要求。但若是但願經過二維的圖像去理解三維空間中攝像機的信息,或者是圖像中物體在三維空間中的信息,那麼就不得不考慮成像過程當中三維變化爲二維時的具體過程。而攝像機模型就是三維到二維的一種映射。本文簡要總結了單目相機的成像過程,以便於讀者將相機模型做爲一種基礎的工具理解更深層次的內容。git

​ 本文經過講解三維世界座標系下某一點是如何被映射到二維圖像上的一點的完整流程來說解,如下爲總體流程:github

\[World\ \to Camera\ \to Retinal\ \to Pixel\ \]

(世界座標系——相機座標系——成像平面座標系——圖像座標系)ide

下面對這四個座標系做出一個簡要的介紹:工具

  • 世界座標系 P_w:一般是三維空間中人爲選擇的一個參考座標系。單位爲物理單位,例如m。
  • 相機座標系 P_c:三維空間中,一般以攝像機的光心做爲原點,光軸做爲z軸的一個座標系。能夠經過世界座標系的平移和旋轉來得到。單位爲物理單位,例如m。
  • 成像平面座標系 P:經過相機模型映射獲得的一個二維座標系。單位爲物理單位,例如m。
  • 圖像座標系 P_uv:經過所成像轉換得到的在計算機內部能夠存儲的矩陣圖像上的座標系。單位爲像素。

1. World -> Camera

假如攝像頭固定不動,那麼世界座標系和相機座標系能夠直接重合。但若是咱們要把攝像頭放在一個可以移動的機器人身上,那麼就有必要令一個固定的座標系和一個跟着機器人走的相機座標系。3d

​ 若是上述這句話你不太理解,那就說明你確實有必要閱讀這篇文章,等到閱讀結束後再回過頭來思考這個問題。而如今,你只須要知道,咱們在這裏考慮的是後面這種狀況,即攝像頭置於移動機器人上code

​ 做爲一個移動機器人,它必然有所處位置座標和一個朝向,咱們把機器人的位置和朝向稱爲位姿。若是它還沒開始運動,咱們不妨將該位置做爲世界座標系原點,而相機朝向做爲Z軸:視頻

1

​ 機器人在空間中會進行移動和轉向,因而咱們能夠按照一樣方式定義一個跟隨着機器人進行移動的座標系,稱爲相機座標系。blog

​ 爲了表示出這種移動和轉向,咱們須要知道機器人相對於原來位置移動了多少,旋轉了多少。get

​ 很天然的,咱們能夠經過當前機器人在世界座標系下的座標,來表示機器人是如何從世界座標系原點移動到當前位置。因而把該座標,稱爲平移向量it

​ 而對於旋轉,一般使用旋轉矩陣R進行描述。對於如何理解旋轉矩陣,我這裏推薦看臺大的機器人學視頻P4(經過列空間變換和投影的方式去理解)。我這裏直接使用單位正交基的方式進行描述,意思是一致的。總之,下式表示是在A看來B座標系的姿態,或者能夠把在B座標系下的座標表示經過左乘下列R轉換成A座標系下的座標表示。

\[R_{AB}=\begin{bmatrix} |&|&|\\\hat X_B^A & \hat Y_B^A & \hat Z_B^A\\ |&|&|\\\end{bmatrix}=\begin{bmatrix}e_1^Ae_1^B & e_2^Ae_1^B & e_3^Ae_1^B\\ e_1^Ae_2^B & e_2^Ae_2^B & e_3^Ae_2^B\\e_1^Ae_3^B & e_2^Ae_3^B & e_3^Ae_3^B\\ \end{bmatrix} \]

​ 也就是說,旋轉矩陣R除了表示在A看來B座標系的姿態,也能夠用來轉換空間中某一點的座標表示(而這正是咱們的相機模型最須要的)。即有:

\[P^A=R_{AB}P^B \]

​ 此外在機器人學中比較重要的一點是,R可以用來描述物體的旋轉。例以下式就表示的是在A座標系下點1經過一個R旋轉至點2。

\[P_2^A=RP_1^A \]

​ 回到咱們的機器人上來。假定如今機器人在世界座標系初始位置時看到了一點 P_W,而後通過一次旋轉和平移,此時看到了同一個點,座標爲 P_C。經過上面的定義,咱們可以很天然的獲得一個等式:

\[P_c=R_{cw}P_w+t_{cw} \]

​ 咱們一般把這裏的 R t稱爲相機的外參

​ 爲了矩陣運算上的便利,上式同時也能夠表現成下面這樣(注意使用的是齊次座標的形式):

\[\begin{bmatrix} x_w\\y_w\\z_w\\1 \end{bmatrix} = \begin{bmatrix} R & t \\ 0^t & 1 \end{bmatrix} \begin{bmatrix} x_c\\y_c\\z_c\\1 \end{bmatrix} \]

​ 常將中間由R和t組成的矩陣寫做變換矩陣T,因而能夠表示成下列形式:

\[P_c=T_{cw}P_w \ldots\ldots0 \]

​ 此式子即爲世界座標系轉換爲相機座標系的變換式。它揭示了兩個很簡單的道理:1. 知道 R_cw t_cw,那就可以將點在兩個座標系下進行轉換。2. 若是知道多個點在兩個座標系下的座標表示,那就能夠求解得到 R_cw t_cw

2. Camera -> Retinal

​ 好了,如今咱們已經可以知道如何把世界座標系下的點轉換成相機座標系下的點了,如今咱們要考慮的是三位空間下的點是如何轉換到二維平面上。此刻咱們考慮的幾何模型纔是真正的相機模型。

​ 相機模型一般會考慮兩種:針孔模型透鏡模型。

​ 通常來講,考慮針孔模型就夠了,由於透鏡模型不過是將針孔模型的焦距f進行修改。

​ 首先先考慮針孔模型(圖源):

​ 如上圖所示,針孔模型能夠簡單看做,位於三維空間中的某一點P通過相機座標系的中心點O映射至像平面座標系上的P'的一個過程。因而乎,咱們能夠把這一模型視做一個類似三角形模型:

​ 很容易看出來左邊X成像是倒的,對於座標系來講這樣的倒會引入負號,所以咱們在O點右側也畫一個X‘,這樣就能消除這個負號。而對於引入的橙色X’所在平面,咱們稱爲歸一化成像平面。因而成像過程就有以下式子:

\[X' = f \cfrac {X_c} {Z_c} \ldots \ldots 1 \]

\[Y' = f \cfrac {Y_c} {Z_c}\ldots\ldots 2 \]

3. Retinal -> Pixel

​ 由上面的推導,咱們很清楚,它們都是在物理層面進行轉換的,所以單位都是m。而真正拿到咱們手中的是一張張由像素點構成的矩陣圖像。所以在成像平面座標系到圖像座標系還須要進行採樣和量化。而同時咱們也清楚,圖像座標的原點一般在圖像左上角,x軸朝向圖像右邊,y軸豎直向下。而成像平面座標系的原點則是在像的中間。所以要把成像平面座標系轉換至像素座標系,須要進行一次縮放和原點平移

​ 所以,成像平面座標系的座標P’到像素座標[u,v]有以下關係:

\[u = aX'+c_x\ldots\ldots3 \]

\[v = aY'+c_y\ldots\ldots4 \]


​ 至此,咱們已經完成了每個局部過程的推導。可是,咱們不可能每次都這樣一次一次進行部分運算,若是咱們但願直接把相機座標系下的點轉換到像素座標系下,該怎麼轉換?又或者,咱們但願從世界座標系下的點開始轉換呢?下面就會對這樣的過程進行講解。

Camera -> Pixel

​ 在上面,咱們已經得到了 Camera -> Retinal Retinal -> Pixel的式子,所以能夠將 X',Y'消去(即把1和2帶入3和4),獲得下列式子:

\[u = af \cfrac {X_c} {Z_c}+c_x \]

\[v = bf \cfrac {Y_c} {Z_c}+c_y \]

​ 一般地,咱們會令 f_x = aff_y = bf(這是因爲a的單位爲pixel/m,而f的單位爲m,相乘從而將量綱統一到pixel):

\[u = f_x \cfrac {X_c} {Z_c}+c_x \]

\[v = f_y \cfrac {Y_c} {Z_c}+c_y \]

​ 將上式化做矩陣形式:

\[\begin{bmatrix} u\\v\\1 \end{bmatrix} = \frac 1 {Z_c} \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_x & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X_c\\Y_c\\Z_c \end{bmatrix}\ldots\ldots5 \]

​ 一般咱們會將中間的3*3矩陣做爲內參矩陣K,咱們很清楚,前面的f是固定的,a是採樣過程固定的,所以f_x也是固定的,也就是說內參矩陣K也是從出廠開始就是固定的:

\[K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_x & c_y \\ 0 & 0 & 1 \end{bmatrix} \]

​ 5式一般又能夠寫做下列形式:

\[ZP_{uv} = KP_c\ldots\ldots6 \]

World -> Pixel

​ 因爲咱們的機器人的運動,致使相機也不斷在運動,所以咱們能夠把0式代入到6式中:

\[ZP_{uv}=KT_{cw}P_w \]

​ 至此,咱們已經完成了整個過程的推導。

相關文章
相關標籤/搜索