Roxy's Library

Back

Camera Model#

我们先来看看2D的图像是怎么形成的。其本质是外界的光线进入相机,在相纸上成像

如果不加限制的话,来自任意地方的光线可以从任何方向进入相机,相纸上的每个pixel被来自不同方向的光线照射,很多时候会变成白色

为了得到清晰的图像,我们要控制相纸上每个点只能收到来自物体上一个点的光线,这就是小孔成像

Pinhole Camera#

pinhole camera

在相纸和物体之间放一个barrier,在上面开一个小孔,这样相纸上每个点只能收到来自物体上一个点的光线,形成了一个倒像

pinhole camera 2

这里我们给一些参数:

  • ff:小孔平面到相纸平面的距离,叫做焦距
  • PP:物体上一个点,坐标为(x,y,z)(x,y,z),其中ZZ是物体到小孔平面的距离
  • PP':相纸上对应的点,坐标为(x,y)(x',y')

根据三角形相似,我们可以得到:

xf=xz,yf=yz\frac{x'}{f} = \frac{x}{z}, \quad \frac{y'}{f} = \frac{y}{z}

Pinhole camera的小孔大小不好控制,太大了会导致图像模糊,太小了会导致图像暗淡

Paraxial Refraction Model#

我们用棱镜来替代小孔,棱镜(这里是凸透镜)可以让光线发生折射,控制光线的方向,使得相纸上每个点只能收到来自物体上一个点的光线

paraxial refraction model

所有平行于凸透镜的光线经过折射后会聚焦到一个点,这个点叫做焦点,焦距就是凸透镜到焦点的距离

paraxial refraction model 2

同样的,给定一些参数,我们也可以计算物体折射后在相纸上的位置:

xz=xz,yz=yz\frac{x'}{z'} = \frac{x}{z}, \quad \frac{y'}{z'} = \frac{y}{z}

其中z=z0+fz' = z_0 + f

景深问题:当物体距离相机不在某个范围内时,图像会模糊(即光线没有聚焦在相纸上),这个范围叫做景深

Radial Distortion:只有在距离相机中心较近的地方,图像才会符合上面的规律,距离较远的地方光线会出现弯曲,这就是径向畸变

Camera Geometric Model#

Intrinsics#

我们再来看一下上面的坐标变换

上述变换的本质是进行一个映射 E:R3R2E : R^3 \to R^2,此外我们还需要完成两件事:

  • 从实际的度量(米)转换到 pixel 为单位
  • 在图片中,左下角为零点,而非中心,因此需要添加 offset

因此有:

P=(x,y,z)P=(x,y)=(αxz+cx,βyz+cy)P = (x,y,z) \to P' = (x',y') = \left( \alpha\frac{x}{z} + c_x, \beta\frac{y}{z} + c_y \right)

其中 α\alphaβ\betax,yx,y 两个方向 ff 对应的 pixel 数目,cxc_xcyc_y 是 offset,以pixel为单位

这个映射不是线性的,无法用矩阵表示

因此我们引入齐次坐标,将 PPPP' 分别表示为 P=(x,y,z,1)P = (x,y,z,1)P=(x,y,1)P' = (x',y',1),变换回来时使用前几维除以最后一维的方式

这样就可以用矩阵表示这个变换了:

P=[α0cx00βcy00010][xyz1]P' = \begin{bmatrix}\alpha & 0 & c_x & 0 \\ 0 & \beta & c_y & 0 \\ 0 & 0 & 1 & 0\end{bmatrix} \begin{bmatrix}x \\ y \\ z \\ 1\end{bmatrix}

这里的相等指的是齐次坐标相等

最后,我们记

K=[α0cx0βcy001]K = \begin{bmatrix}\alpha & 0 & c_x \\ 0 & \beta & c_y \\ 0 & 0 & 1\end{bmatrix}

这个矩阵被称为相机内参矩阵,变换改写为

P=K[I0]PP' = K \begin{bmatrix}I & 0\end{bmatrix} P

skew:有时候相机的坐标轴不是垂直的,这时就需要添加一个参数θ\theta来表示坐标轴之间的夹角

skew

那么此时相机内参矩阵就变成了

K=[ααcotθcx0β/sinθcy001]K = \begin{bmatrix}\alpha & -\alpha \cot \theta & c_x \\ 0 & \beta / \sin \theta & c_y \\ 0 & 0 & 1\end{bmatrix}

Extrinsics#

前面我们认为物体的空间位置由相机定义的坐标系来决定,有时候我们需要根据物体的世界坐标系来描述物体的位置

从世界坐标转化为相机坐标需要进行一个旋转和平移,这些都可以使用矩阵表示

对于点PwP_w,如果要将其平移一个向量TT得到PP,我们可以这么表示:

P=[IT0T1]PwP = \begin{bmatrix}I & T \\ 0^T & 1\end{bmatrix} P_w

这里的II是一个3x3的单位矩阵,TT是一个3x1的向量,PwP_wPP都是4x1的齐次坐标

对于旋转,我们可以使用一个3x3的旋转矩阵RR来表示:

P=[R00T1]PwP = \begin{bmatrix}R & 0 \\ 0^T & 1\end{bmatrix} P_w

旋转矩阵RR可以分解为三个绕x,y,zx,y,z轴的旋转矩阵的乘积:(关于旋转矩阵,可以看一下这篇文章

R=Rz(γ)Ry(β)Rx(α)R = R_z(\gamma) R_y(\beta) R_x(\alpha)

其中

Rx(α)=[1000cosαsinα0sinαcosα],Ry(β)=[cosβ0sinβ010sinβ0cosβ],Rz(γ)=[cosγsinγ0sinγcosγ0001]R_x(\alpha) = \begin{bmatrix}1 & 0 & 0 \\ 0 & \cos \alpha & -\sin \alpha \\ 0 & \sin \alpha & \cos \alpha\end{bmatrix}, \quad R_y(\beta) = \begin{bmatrix}\cos \beta & 0 & \sin \beta \\ 0 & 1 & 0 \\ -\sin \beta & 0 & \cos \beta\end{bmatrix}, \quad R_z(\gamma) = \begin{bmatrix}\cos \gamma & -\sin \gamma & 0 \\ \sin \gamma & \cos \gamma & 0 \\ 0 & 0 & 1\end{bmatrix}

最终我们将旋转和平移合并到一起(就是这两个矩阵相乘),得到一个4x4的变换矩阵:

P=[RT0T1]PwP = \begin{bmatrix}R & T \\ 0^T & 1\end{bmatrix} P_w

Summary#

最后我们将相机内参矩阵和外参矩阵合并到一起,得到一个从世界坐标系到像素坐标系的变换:

P=K[RT]PwP' = K \begin{bmatrix}R & T\end{bmatrix} P_w

Perspective Camera#

前面的模型都符合透视投影的规律,即近大远小,因此叫做perspective camera(透视相机),下面介绍两种特殊的相机模型:

weak perspective camera#

弱透视相机假设物体上所有点到相机的距离都近似相等,那么就可以将上述变换中的zz替换为一个常数z0z_0,得到:

x=αxz0+cx,y=βyz0+cyx' = \alpha \frac{x}{z_0} + c_x, \quad y' = \beta \frac{y}{z_0} + c_y

orthographic Projection#

正交投影直接将物体上的点投影到相纸上,不考虑距离的影响

orthographic projection

因此有:

x=αx+cx,y=βy+cyx' = \alpha x + c_x, \quad y' = \beta y + c_y
3D Vision I
https://astro-pure.js.org/blog/cvintro_04_29
Author GreyRat
Published at May 8, 2026
Comment seems to stuck. Try to refresh?✨