摄像机矩阵详解

来源:互联网 发布:java scanner用法 编辑:程序博客网 时间:2024/05/16 05:56

之前学习摄像机模型的时候弄得不是太清楚,现在记录一下。

1.摄像机矩阵的分解

摄像机矩阵可以表示为如下形式:

P=[M|MC](1)

其中,C为摄像机在世界坐标系中的位置,求出摄像机的位置C只需要用M1乘以摄像机矩阵最后一列。对摄像机矩阵进一步分解可得:

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][I0C1]=[RTc0RTcC1](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=KIntrinsic Matrix×[Rt]Extrinsic Matrix=100010x0y012D Translation×fx000fy00012D Scaling×100s/fx100012D ShearIntrinsic Matrix×(It)3D Translation×(R001)3D RotationExtrinsic 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
原创粉丝点击