之前學習攝像機模型的時候弄得不是太清楚,現在記錄一下。
1.攝像機矩陣的分解
攝像機矩陣可以表示爲如下形式:
P=[M|−MC](1)
其中,C爲攝像機在世界座標系中的位置,求出攝像機的位置C只需要用−M−1乘以攝像機矩陣最後一列。對攝像機矩陣進一步分解可得:
P=K[R|−RC]=K[R|T](2)
矩陣R是rotation矩陣,因此是正交的;K是上三角矩陣.
對P的前三列進行RQ分解就可得到KR .一般的矩陣庫裏面都只有QR分解算法,所以可以使用QR分解替代。具體解釋見這裏,Richard
Hartley and Andrew Zisserman’s “Multiple View Geometry in Computer Vision”給的code,其中vgg_rq()
就是分解KR.
RQ分解不爲一,所以可以取使K的對角線元素都爲正的分解,可以通過改變矩陣對應列/行的符號得到。
另外T=−RC ,是攝像機座標系下世界座標系原點的位置,tx,ty,tz的符號表示世界原點在攝像機的左右上下,前後關係。在三維重建中,一組標定好了的圖片序列,它們攝像機矩陣計算出來的世界座標系原點位置應該是相同了,因爲所有的攝像機都校正到同一個座標系了,(測試了數據集3D
Photography Dataset中兩個攝像機矩陣計算出來的世界座標系原點確實是相同的,最起碼說明標定沒有錯誤).
其中K即爲所謂的內參,R,T爲外參。
2.攝像機外參
攝像機外參數可以表示爲3x3的旋轉矩陣R和3x1的位移向量T:
[R|t]=⎡⎣⎢⎢r1,1r2,1r3,1r1,2r2,2r3,2r1,3r2,3r3,3t1t2t3⎤⎦⎥⎥(3)
通常也會看到添加了額外一行(0,0,0,1)的版本:
[R0t1]=[I0t1]×[R001]=⎡⎣⎢⎢⎢⎢100001000010t1t2t31⎤⎦⎥⎥⎥⎥×⎡⎣⎢⎢⎢⎢⎢r1,1r2,1r3,10r1,2r2,2r3,20r1,3r2,3r3,300001⎤⎦⎥⎥⎥⎥⎥(4)(5)
這樣做可以允許我們把矩陣分解爲一個旋轉矩陣跟着一個平移矩陣。這個矩陣描述瞭如何把點從世界座標系轉換到攝像機座標系,平移矩陣T描述了在攝像機座標系下,空間原點的位置;旋轉矩陣R描述了世界座標系的座標軸相對攝像機座標系的的方向。
如果以世界座標系爲中心,知道了攝像機的Pose, [Rc|C] 即空間位置C和相對世界座標系座標軸的旋轉Rc,怎麼得到外參矩陣呢?給攝像機的pose矩陣添加(0,0,0,1)讓它成爲方陣,對pose矩陣求逆就可以得到外參矩陣。
[R0t1]=[Rc0C1]−1=[[I0C1][Rc001]]−1=[Rc001]−1[I0C1]−1=[RTc001][I0−C1]=[RTc0−RTcC1](decomposing
rigid transform)(distributing
the inverse)(applying
the inverse)(matrix
multiplication)(6)(7)(8)(9)(10)
即:
Rt=RTc=−RC(11)(12)
3.攝像機內參
K=⎛⎝⎜fx00sfy0x0y01⎞⎠⎟(13)
其中fx,fy爲焦距,一般情況下fx=fy , x0,y0爲主點座標(相對成像平面),s爲座標軸傾斜參數,理想情況應該爲0.
內參K是2D的變換
K=⎛⎝⎜fx00sfy0x0y01⎞⎠⎟=⎛⎝⎜100010x0y01⎞⎠⎟2D
Translation×⎛⎝⎜fx000fy0001⎞⎠⎟2D
Scaling×⎛⎝⎜100s/fx10001⎞⎠⎟2D
Shear(14)(15)
綜合起來,攝像機矩陣可以由外參的3D變換和內參的2D變換組合起來:
P=KIntrinsic
Matrix×[R∣t]Extrinsic
Matrix=⎛⎝⎜100010x0y01⎞⎠⎟2D
Translation×⎛⎝⎜fx000fy0001⎞⎠⎟2D
Scaling×⎛⎝⎜100s/fx10001⎞⎠⎟2D
ShearIntrinsic
Matrix×(It)3D
Translation×(R001)3D
RotationExtrinsic
Matrix(16)(17)(18)
本文主要參考於The Perspective Camera - An Interactive Tour. 作者還提供了可以交互的demo.
http://haiyangxu.github.io/posts/2014/2014-06-12-camera-matrix.html