原创:杨其泓
引言
随着智能手机的发展,用手机拍摄照片已经称为大众日常生活中的一部分。对准被拍摄的物体,按下快门,一张美丽的照片就拍摄完成了。不知你有没有想过,如此简单的一个过程,从原理上是如何实现的呢?三维世界中的物体是怎么映射到二维的图像上的呢?这个映射关系与什么参数相关呢?下面我将针对相机模型的问题,为大家一一进行解答。
四大坐标系
在学习相机模型之前,我们首先要了解 “四大坐标系”。有的同学可能会想,不就是从空间映射到图片吗,这么简单的过程怎么会用到四个坐标系?其实还真的用!
- 世界坐标系:世界坐标系顾名思义,就是我们所生活的三维世界的坐标系,它具备X, Y, Z三个轴,分别对应物体的长宽高,在计算中一般会把这个坐标系标记为 ( X w , Y w , Z w ) T (X_w, Y_w, Z_w)^T (Xw,Yw,Zw)T,其中w代表world。世界坐标系的原点和坐标轴方向可以自行选定,坐标系的单位可为米或厘米(现实物理单位即可)。
- 相机坐标系:相机坐标系与世界坐标系类似,也是以现实世界为尺度的坐标系。它也具备X, Y, Z三个轴,分别对应物体的长宽高,但与世界坐标系不同的是,相机坐标系的原点固定在相机光圈位置,其Z轴指向相机外侧(垂直于光圈),X轴为水平方向(指向无所谓),Y轴为竖直方向(指向无所谓)。在计算中一般会把这个坐标系标记为 ( X c , Y c , Z c ) T (X_c, Y_c, Z_c)^T (Xc,Yc,Zc)T,其中c代表camera。
- 图像坐标系:相机坐标系中的每一个“点”经小孔成像后,就会映射到图像坐标系上(小孔可以理解为相机镜头,坐标系位置可以理解为感光元件位置)。图像坐标系的坐标原点为图像平面的中心点,X轴和Y轴分别平行于图像平面的两条垂直边,图像坐标系是一个二维坐标系,没有X轴,因此图像坐标系在计算中一般用 ( X i , Y i ) T (X_i, Y_i)^T (Xi,Yi)T来表示,其中i代表image。图像坐标系的单位依旧使用物理单位。
- 像素坐标系:像素坐标系就是我们实际看到的图片的坐标系,它的原点是左上角,X轴和Y轴分别代表图片的宽和高,像素坐标系在计算中一般用 ( W p , H p ) T (W_p, H_p)^T (Wp,Hp)T来表示,其中p代表pixel。像素坐标系就是以像素为单位的坐标系。
坐标运算
了解了四大坐标系分别是什么意思之后,就可以开始进行坐标运算了,我们需要一步步的将世界坐标逐渐转化为像素坐标,转化过程如下:
世界坐标系 —> 相机坐标系
我们知道,相机坐标系与世界坐标系是十分类似的,唯一的区别就是坐标系原点与坐标轴方向的区别,因此世界坐标系中的任意一个点,都可以通过旋转与平移的方式对应到相机坐标系中。我们称这种变化方式为刚体变换。
二维
同学们在九年义务教育中一定学习过三角函数,下面我将用二维世界中的平移与旋转作为开头,为大家引出三维坐标系下的平移旋转计算方法。
如上图所示,坐标系原点为 O ( 0 , 0 ) O(0,0) O(0,0),我们要将坐标系中的 P ( x , y ) P(x,y) P(x,y)点,以原点为轴,旋转 θ \theta θ角后到达 P 1 ( x 1 , y 1 ) P_1(x_1,y_1) P1(x1,y1)点,由于旋转并不好改变点到原点之间的距离,因此 P P P点与 P 1 P_1 P1点到原点的距离都是 r r r,我们暂时把 P 1 P_1 P1点与横坐标之间的夹角记为 α \alpha α,可得:
x 1 = r c o s α x_1=rcos\alpha\\ x1=rcosα
y 1 = r s i n α y_1=rsin\alpha y1=rsinα
x = r c o s ( α − θ ) = r ( c o s α c o s θ + s i n α s i n θ ) x=rcos(\alpha-\theta)=r(cos\alpha cos\theta + sin\alpha sin\theta)\\ x=rcos(α−θ)=r(cosαcosθ+sinαsinθ)
x = r s i n ( α − θ ) = r ( s i n α c o s θ − c o s α s i n θ ) x=rsin(\alpha-\theta)=r(sin\alpha cos\theta - cos\alpha sin\theta) x=rsin(α−θ)=r(sinαcosθ−cosαsinθ)
将 x 1 , y 1 x_1, y_1 x1,y1的表达式带入上式可得:
x = x 1 c o s θ + y 1 s i n θ x=x_1cos\theta + y_1sin\theta\\ x=x1cosθ+y1sinθ
y = y 1 c o s θ − x 1 s i n θ y=y_1cos\theta - x_1sin\theta y=y1cosθ−x1sinθ
此时可以把上式写做旋转矩阵R:
[ x y 1 ] = [ c o s θ s i n θ 0 − s i n θ c o s θ 0 0 0 1 ] [ x 1 y 1 1 ] \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}=\begin{bmatrix} cos\theta & sin\theta & 0 \\ -sin\theta & cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix} ⎣⎡xy1⎦⎤=⎣⎡cosθ−sinθ0sinθcosθ0001⎦⎤⎣⎡