之前学习摄像机模型的时候弄得不是太清楚,现在记录一下。
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
0 0