0. 相机矩阵 Camera Matrix
小孔成像模型
成像过程
1. 相机矩阵的分解
齐次坐标下,物体的物理坐标是 [x,y,z,1]′ [ x , y , z , 1 ] ′ 的形式,图像上对应点的坐标是 [u,v,1]′ [ u , v , 1 ] ′ 的形式,所以 相机矩阵 P P 作为把物体映射成像的矩阵,应该是一个 的矩阵。
因此,摄像机矩阵可以表示为如下形式:
其中,
|
代表的是增广矩阵M
代表的是可逆的 3×3 3 × 3 的矩阵C
是列向量,代表世界坐标系
中相机的位置
- 要想求得 C C , 只需要 的前三列组成的 M M , 求出来 再乘以最后一列,就得到了 C C
矩阵的确可以把 3D的点投影到 2D 空间,但是,这种形式下表达的信息是很粗糙的,比如
- 没有提供相机的摆放姿态
- 没有相机内部的几何特征
为了挖掘这些信息,对矩阵进一步分解为一个内参矩阵和外参矩阵的乘积:
其中
- 矩阵R是rotation矩阵,因此是正交的;K是上三角矩阵. 对P的前三列进行RQ分解就可得到KR
-
T=−RC
T
=
−
R
C
, 是
摄像机坐标系
下世界坐标系原点
的位置, tx,ty,tz t x , t y , t z 分别代表世界坐标原点在相机的 左右,上下,前后 位置关系。在三维重建中,一组标定好了的图片序列,它们各自的相机矩阵中的 T T 应该是相同的。 - 其中 就是内参, R,T R , T 为外参
2. 相机外参
相机的外参矩阵描述的是世界坐标中相机的位置,及其指向方向。有两个成分:旋转矩阵R和平移向量t。
常见的做法是在底部增加一行
(0,0,0,1)
(
0
,
0
,
0
,
1
)
,这使得矩阵为方形的,允许我们进一步将矩阵分解为真正的旋转和平移矩阵
这个矩阵描述的就是如何将世界坐标系中的点变换都相机坐标系中,向量t描述的是世界坐标系原点在相机坐标系中的位置,R的列代表的是相机坐标系中世界坐标系轴的方向。
从上可以发现,外参主要作用就是描述世界坐标系到相机坐标系的转换。与我们经常想的相机坐标系到世界坐标系的转换刚好相反。
实际中,直接指定相机的姿态比指定世界坐标系中的点如何转换到相机坐标系中更加自然,通过建立一个刚体变换矩阵描述相机姿态,然后对其取逆即可建立相机的外参矩阵。
因而可以这样做:定义一个描述相机中心在世界坐标系中的位置的向量
C
C
,然后让代表相机在世界坐标系旋转到当前姿态需要的旋转矩阵。那么描述相机姿态的变换矩阵就是
(Rc|C)
(
R
c
|
C
)
。同样在底部添加一个行向量
(0,0,0,1)
(
0
,
0
,
0
,
1
)
,那么外参矩阵就是相机姿态矩阵的逆
:
以上推导中,因为
Rc
R
c
是正交阵,所以
RTC=R−1C
R
C
T
=
R
C
−
1
. 而 平移向量的逆就是它的负数平移向量,即
t−1=−t
t
−
1
=
−
t
, 进而可以根据相机姿态得到外参:
总结一下,
- 我们得到的是一般化的相机外参 [R|t] [ R | t ] 描述的是从相机坐标系观察世界坐标系,即世界坐标系向相机坐标系的变换,因此, t t 代表的是世界坐标系原点在相机坐标系中的位置, 代表世界坐标系到相机坐标系的旋转,其列向量分别是世界坐标系中的 xyz x y z 轴在相机坐标系中的方向向量。
- 有时候,我们需要从相机外参中得到相机中心(相机坐标系原点)在世界坐标系中的位置 C C . 其对应关系为 , 因此 C=−R−1t=−RTt C = − R − 1 t = − R T t ,即旋转矩阵的转置乘以平移矩阵再取负。
3. 相机内参
内参矩阵是将3D相机坐标变换到2D齐次图像坐标。透视投影的一个理想模型就是针孔相机。
内参矩阵如下:
其中每一个参数都有具体的物理含义
-
fx,fy
f
x
,
f
y
:以像素为单位丈量的焦距。焦距就是上图中针孔和成像平面的距离(图中红线),类似于人眼瞳孔和视网膜。理想情况下,针孔相机的
fx=fy
f
x
=
f
y
。但是实际中,
fx,fy
f
x
,
f
y
总有一定的偏差,而这个误差可能来自
- 相机透镜的失真
- 数码传感器的缺陷
- 相机使用了失真的格式,透镜将宽屏场景压缩到标准大小的传感器
- 后期处理中图像被非均匀压缩
- 相机校准的误差
- 。。。
x0,yo x 0 , y o : 以像素为单位丈量的主点位置。相机的主轴是垂直于成像平面且穿过针孔的直线,主轴与成像平面的交点就是主点。理想情况下,主点的位置应该位于图像的中心。但实际中总有一些偏差。比如 x0 x 0 偏大,相当于成像平面不动而针孔右移,或等价于,针孔不动而成像平面左移。
s s :以像素为单位丈量的轴倾斜Skew coefficient 。
- 理想情况下,像素是正方形或长方形, s=0 s = 0
- 实际中,这个值也是趋近于 0 的
- 单位:从像素到毫米。内参矩阵只关心相机坐标和图像坐标之间的关系,与相机的绝对尺寸无关。可以把像素单元转换到世界单元中去,但是前提是必须知道世界单元中至少一个相机尺寸。比如知道相机投影面(数字传感器)宽度为
W
W
毫米,而图片宽度是像素,那么就可以将焦距
fx
f
x
转化为世界单元
Fx=fxWw F x = f x W w. 其他的亦可依此换算。
可以将内参矩阵 K K 分解为切变(shear,类似于将长方形压成平行四边形的变形方式)、缩放,平移变换,分别对应轴倾斜、焦距、主点偏移
4. 综合
综合起来看,相机矩阵可以由外参的3D变换和内参的2D变换组合起来
5. 交互 demo
有位大神写了关于相机标定的一系列文章并做了一个可交互的demo.
demo中提供了三种外参接口(世界坐标系,相机坐标系,look-at),三种交互效果不同,前两种的方向相反,世界坐标系中向左移动表示相机坐标系中向右移动,但是它们都有六个参数控制:
- tx t x 表示沿着水平方向移动相机
- ty t y 表示沿着垂直方向移动相机
- tz t z 表示沿着前后方向移动相机
- px p x 表示镜头不平移,但是绕x轴做俯仰旋转
- py p y 表示镜头不平移,但是绕垂直轴y轴做左右摇头旋转
- pz p z 表示镜头不平移,但是绕z轴做顺时针(或者逆时针)旋转
demo也提供了内参的接口,包括四个参数控制:
- 焦距(Focal length):镜头的前后缩进(不是缩放)
- 轴倾斜(Axis Skew):可以导致球变形,平面上显示椭球形
- x0 x 0 表示主点偏移,相机不动,左右移动成像平面
- y0 y 0 表示主点偏移,相机不动,上下移动成像平面