之前學習錄影機模型的時候弄得不是太清楚,現在記錄一下。
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