1. 程式人生 > >三維重建學習(三)相機的標定(下)

三維重建學習(三)相機的標定(下)

前言

這一部分主要講解相機的標定在matlab中的具體實現方法。

由於特殊原因,現在實現的具體程式碼找不到了,我會在以後重新補上。

Computation of Camera 相機矩陣的計算

Direct Linear Transform

相機矩陣的計算運用了一個很重要的方法,叫做DLT (Direct Linear Transform),即“直接線性變換”。這種方法的核心思維就是將所求矩陣轉化成一個列向量,即將AB=0(A,B都是矩陣)轉化成A‘b=0,這裡b變成了一個向量,但是它儲存的資訊並沒有減少,比如假設B是5x6的矩陣,那麼b就是30x1的向量。這種方法的作用是巨大的,簡單一點說,DLT的作用就是通過重組方程,得到一種比較好求解的形式。原本要求解AB=0

方程中的矩陣B現在要求解A’b=0中的向量b,即矩陣A’的right null space(零空間)。

補充完方法後,現在進入正題

x=PX即投影方程,我們的目的是從這個方程中解出P,即相機矩陣。PX的運算結果是一個向量,即x,那麼我們就可以運用向量的Cross Product(叉積)來構造方程。顯然一個向量與自己的叉積是為零的。

接下來,將對應的值代入。注意在三維空間的線性代數中,有一個convention(不成文但大家都遵循的規則),即任意一個向量a,預設其為列向量。所以在PX的展開式中,可以看到,其實p1,p2,p3應該代表行向量,分別表示矩陣P的1,2,3行,它們儲存的資訊是一行的資訊,但是隻要用p1

來表示一個向量,它就是列向量。所以我們強行要表示行向量的時候,就要用它的transpose(轉置),即p1T

接下來對得到的乘積進行重組,得到了上圖的結果。注意,這時候p1,p2,p3是列向量,所以Ap=0中的p已經滿足了DLT的要求,即變成了一個列向量。

這一步乍一看好像沒啥大變化,實際作用是捨去了一個無用的方程。因為方程Ap=0一定是有Non-trivial Solution(即非零解)的,也就是說明矩陣A的所有行之間是Linear Dependent(非線性獨立)。換句話說,看似方程Ap=0是由三個方程構成的,其實這三個方程中的任意一個都能用另外兩個的Linear Combination(線性組合)來表示出來,所以實際有意義的只有兩個方程。換句話說,一組三維與二維點能夠提供兩個方程,在上一篇文章中講過,相機矩陣P有11個自由度,所以我們需要11個方程來解P,顯然就要拿到6組對應點,但實際上最後一組點只要一個方程就夠了。

現在拿到了方程,就剩下解方程了,只要求解矩陣A的right null space,就能拿到向量p。

Singular Value Decomposition(SVD)奇異值分解

SVD是線性代數中很重要的一個方法,也是matlab中的一個很基本的函式。這裡我們運用SVD方法來求解一個矩陣的null space(零空間)。

關於SVD的具體理論知識我就不講了,可以參考百度或者Wiki,或者看線性代數的教材。這裡只講如何運用SVD。

SVD可以將一個m x n的矩陣A分解成三個矩陣的乘積,即 A=UDV*

+U是一個m x m的矩陣
+D是一個m x n的Diagonal Matrix(對角陣)
+V是一個n x n的矩陣

求解矩陣A的null space,即從矩陣V的列向量來構造。

因為方程Ap=0中的矩陣A是一個11x12的矩陣,並且每一行之間都是線性獨立的,根據等量關係

Rank (Null (A)) = (Number of columns) - Rank (A)

即一個矩陣對應的零空間的秩等於它的行數減去它本身的秩。

所以可以得到,矩陣A的零空間的秩即為12-11=1,也就是說A的零空間是一個一維的空間。

所以SVD結果中矩陣V的最後一列,一個12x1的列向量,即為矩陣A的零空間的基底。換句話說,如果用V12來表示矩陣V的最後一列的話,aV12(a為任意常數)就可以表示整個A的null space。所以我們只要拿到V12,就能算作一個合理的向量p的解,因為相機矩陣P本身具有scale ambiguity(上篇文章中介紹過,產生的原因是齊次座標的性質),所以V12乘任意一個常數都是一個合理的解。為了統一解的結果,一般會用Normalization,即將向量p的模化為單位量1,然後重新組合向量p得到相機矩陣P。

這部分的最後再講解一下SVD更一般化的用法。

SVD求解null space的時候,結果中的矩陣V的最後a個向量(a取決於null space的維數)作為基底張成的空間,即為null space

具體來說,這個問題因為null space是一維的,所以只要取最後一個向量,以它張成的空間,即為所求的null space,這是最簡單的情況

在以後求解Relative Pose的時候,會遇到多維的null space。假如null space是二維的,就要用向量Vn(最後一個向量)和Vn-1(倒數第二個向量)作為基底

所求的null space便為 (aVn + bVn-1),這裡a和b是兩個任意常數,需要用額外的constraint來確定a和b的值。

Recover Camera Parameters 相機矩陣的具體引數

求解相機中心C

拿到相機矩陣後,首先求解相機中心C,即在參考座標中所標定相機的相機中心的空間座標

這裡用到的是一個常識,每一個空間點投影在相機中會對應一個二維點座標,如果一個相機的中心投影在它本身的平面的上,對應的點即為平面點原點。所以 PC = 0。

這時候我覺得你應該想到怎麼求解C了吧,C不就是矩陣P的null space嗎,而且矩陣P不是滿秩,Rank (P) = 2,那麼對應的P的null space就是一維的,也就是最簡單的情況。

用SVD求解C是一種線性代數的方案,這裡給出了另一種普通代數方案,至於怎麼得出的這個解的形式我就不講了。如果SVD還不太會用的話可以直接套這個公式。

求解內部矩陣K和旋轉矩陣R

在求解之前,同樣,我們先觀察一下。

+相機矩陣K是一個Upper Triangular Matrix(上三角矩陣)
+旋轉矩陣R是一個Orthogonal Matrix(正交矩陣)

有了這些性質,求解過程就容易一些了。

對於這種情況,需要用到另一個線性代數的方法,RQ-Decomposition。但是matlab中沒有這個函式,不過有它的“好朋友”QR-Decomposition

因為這個方法相對較難理解,同理,這裡也有簡單的代數方案。

相機矩陣P可以表示稱上圖的形式,因為C已經解出來了,所以M只要通過P的最後一列就能求出,接下來的運算都圍繞M展開。

旋轉矩陣R也可以分解成x,y和z三個不同的分量

直接套用上圖公式,便可求的繞x旋轉的分量。同理,Ry和Rz的公式給出在下圖

最終旋轉矩陣R可以有其三個分量的乘積求出,然後利用下圖公式,便可求出內部矩陣

-------------------------------------------------------------------

總結

到此為止相機的標定就結束了,簡單小結一下,相機的標定並不是很難,這部分最重要的就是DLT和SVD,這兩個方法在後續的學習中會繼續使用,一定要融會貫通。