【摘抄】相机的内外参数
相机的位置和朝向由相机的外参(extrinsic matrix)决定,投影属性由相机的内参(intrinsic matrix)决定。
注意:接下来的介绍假设矩阵是列矩阵(column-major matrix),变换矩阵左乘坐标向量实现坐标变换(这也是OpenCV/OpenGL/NeRF里使用的形式)。
# 相机外参
相机外参是一个4x4的矩阵M,其作用是将世界坐标系的点Pworld=[x,y,z,1]变换到相机坐标系Pcamera=MPworld下。我们也把相机外参叫做world-to-camera (w2c)矩阵(注意用的是4维的齐次坐标,如果不了解齐次坐标系请自行查阅相关资料)。
相机外参的逆矩阵被称为camera-to-world (c2w
)矩阵,其作用是把相机坐标系的点变换到世界坐标系。因为NeRF主要使用c2w
,这里详细介绍一下c2w
的含义。c2w
矩阵是一个4x4的矩阵,左上角3x3是旋转矩阵R,右上角的3x1向量是平移向量T。
[R0T1]=⎣⎢⎢⎢⎡r11r21r310r12r22r320r13r23r330t1t2t31⎦⎥⎥⎥⎤
有时写的时候可以忽略最后一行[0,0,0,1]。
[RT]=⎣⎢⎡r11r21r31r12r22r32r13r23r33t1t2t3⎦⎥⎤
刚刚接触的时候,对这个c2w矩阵的值可能会比较陌生。其实c2w矩阵的值直接描述了相机坐标系的朝向和原点:
具体的,旋转矩阵的第一列到第三列分别表示了相机坐标系的X, Y, Z轴在世界坐标系下对应的方向;平移向量表示的是相机原点在世界坐标系的对应位置。
如果这段描述还是有点抽象,可以尝试进行下列计算帮助自己理解。刚刚讲到c2w是将相机坐标系的向量变换到世界坐标系下,那我们如果将c2w作用到(即左乘)相机坐标系下的X轴[1,0,0,0],Y轴[0,1,0,0], Z轴[0,0,1,0],以及原点[0,0,0,1](注意方向向量的齐次坐标第四维等于0,点坐标第四维等于1),我们会得到它们在世界坐标系的坐标表示:
[RT]⎣⎢⎢⎢⎡1000⎦⎥⎥⎥⎤=⎣⎢⎡r11r21r31⎦⎥⎤
[RT]⎣⎢⎢⎢⎡0100⎦⎥⎥⎥⎤=⎣⎢⎡r12r22r32⎦⎥⎤
[RT]⎣⎢⎢⎢⎡0010⎦⎥⎥⎥⎤=⎣⎢⎡r13r23r33⎦⎥⎤
[RT]⎣⎢⎢⎢⎡0001⎦⎥⎥⎥⎤=⎣⎢⎡t1t2t3⎦⎥⎤
从上面可以看到可以看到,将c2w作用到相机坐标系下的X轴、Y轴、 Z轴、以及原点我们会依次得到c2w的四列向量。
# 相机内参
刚刚介绍了相机的外参,现在简单介绍一下相机的内参。
相机的内参矩阵将相机坐标系下的3D坐标映射到2D的图像平面,这里以针孔相机(Pinhole camera)为例介绍相机的内参矩阵K:
K=⎣⎢⎡fx000fy0cxcy1⎦⎥⎤
内参矩阵K包含4个值,其中fx和fy是相机的水平和垂直焦距(对于理想的针孔相机,fx=fy)。焦距的物理含义是相机中心到成像平面的距离,长度以像素为单位。cx和cy是图像原点相对于相机光心的水平和垂直偏移量。cx,cy有时候可以用图像宽和高的1/2近似:
# NeRF run_nerf.py有这么一段构造K的代码
if K is None:
K = np.array([
[focal, 0, 0.5*W],
[0, focal, 0.5*H],
[0, 0, 1]
])
2
3
4
5
6
7