相机模型以及FOV计算


一、相机模型

相机将三维世界中的坐标点(单位为米)映射到二维图像平面(单位为像素)的过程 能够用一个几何模型进行描述。这里介绍一下常用的相机模型——针孔相机模型。

1.针孔相机模型

针孔相机模型可以理解为通过小孔呈像原理将三维世界中的景象投射到二维成像平面上。如下图所示:

image-20231203114628384

这里OxyzO-x-y-z相机坐标系,一般Z轴向前,X轴向右,Y轴向下,OO为相机的光心,同时也是针孔模型中的针孔,现实世界的空间点PP经过小孔OO投影之后,落在物理成像平面OxyO^{'}-x^{'}-y^{'}上,成像点PP^{'},设PP的坐标为[X,Y,Z]T\begin{bmatrix}X, & Y, & Z \end{bmatrix}^{T},PP^{'}[X,Y,Z]T\begin{bmatrix}X^{'}, & Y^{'}, & Z^{'} \end{bmatrix}^{T},物理成像的平面到相机光心(小孔)的距离为ff(焦距)。如上图右侧所示,根据三角形的相似关系有:

Zf=XX=YY\begin{aligned} \frac{Z}{f}=-\frac{X}{X^{'}}=-\frac{Y}{Y^{'}} \\ \end{aligned}

其中负号表示成的像是倒立的。为了简化模型,我们把可以成像平面对称到相机前方,和三维空间点一起放在摄像机坐标系的同一侧,这样可以去掉负号,同时大多数相机输出的图像并不是倒像——相机自身 的软件会帮你翻转这张图像,所以你看到的一般是正着的像,也就是对称的成像平面上的像。由于输出的图像已经做了预处理,所以理解成在对称平面上的像,并不会带来什么坏处。可以参考下图:

image-20231203191340960

整理可以得到:

X=fXZY=fYZ\begin{aligned} X^{'}&=f \frac{X}{Z} \\ Y^{'}&=f \frac{Y}{Z} \\ \end{aligned}

2.像素坐标系

上面描述了空间中点P和它的像之间的空间关系,但是我们最终获得的是一个个的像素,这需要在成像平面上对呈的像进行采样和量化,将光线转换为图像的像素。设在物理成像平面上固定着一个像素平面OuvO-u-v。我们在像素平面得到了PP^{'}的像素坐标:[u,v]T\begin{bmatrix}u ,& v \end{bmatrix}^{T}。像素坐标系为下图所示:

image-20231203204941101

原点OO^{'} 位于图像的左上角,uu轴向右与xx轴平行,vv轴向下与yy轴平行。像素坐标系与成像平面之间,相差了一个缩放和一个原点的平移。我们设像素坐标在uu轴上缩放了α\alpha倍,在vv上缩放了β\beta倍。同时,原点平移了[cx,cy]T\begin{bmatrix}c_{x} ,& c_{y} \end{bmatrix}^{T}。那么,PP^{'}的坐标与像素坐标$ \begin{bmatrix}u ,& v \end{bmatrix}^{T}$的关系为:

{u=αX+cxv=βY+cy\begin{cases} u=\alpha X^{'}+c_x \\ v=\beta Y^{'}+c_y\\ \end{cases}

将此式与之前的式子进行合并:

{u=αX+cxv=βY+cy\begin{cases} u=\alpha X^{'}+c_x \\ v=\beta Y^{'}+c_y\\ \end{cases}

X=fXZY=fYZ\begin{aligned} X^{'}&=f \frac{X}{Z} \\ Y^{'}&=f \frac{Y}{Z} \\ \end{aligned}

同时令αf\alpha f合并成fxf_x,βf\beta f合并成fyf_y,其中ff的单位是米,αβ\alpha, \beta的单位为像素每米,合并得到的fxfyf_x,f_y的单位为像素,得到:

{u=αfXZ+cx=fxXZ+cxv=βfYZ+cy=fyYZ+cy\begin{cases} u&=\alpha f \frac{X}{Z}+c_x&=f_x \frac{X}{Z}+c_x \\ v&=\beta f \frac{Y}{Z}+c_y&=f_y \frac{Y}{Z}+c_y\\ \end{cases}

将该式写成矩阵形式,

[uv1]=1Z[fx0cx0fycy001][XYZ]=1ZKP\begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=\frac{1}{Z}\begin{bmatrix} f_x &0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} X \\ Y \\ Z \end{bmatrix}=\frac{1}{Z}KP

按照习惯将Z移到左侧:

Z[uv1]=[fx0cx0fycy001][XYZ]=KPZ\begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=\begin{bmatrix} f_x &0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} X \\ Y \\ Z \end{bmatrix}=KP

[fx0cx0fycy001]\begin{bmatrix} f_x &0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}作为相机的内参矩阵K,内参可以利用棋盘网格或者apriltag码方式进行标定。内参一般是不会变化的,除非焦距等参数发生了改变。

二、FOV相关计算公式

1.FOV简介

FOV的全称是Field of View (视场角),它表示相机或者人眼可以接收或者显示的影像的角度范围。由于相机的成像原理,一般都会有视场角的限制。如下图所示当相机的CCD或CMOS传感器的成像平面W一定时,FOV由焦距f决定,当焦距越大时,看的越远 但是FOV就会越小。当焦距越小时,FOV会变大,但是看到的范围就会变近。

image-20231204225034519

2.FOV相关的计算公式

主要分为水平FOV,垂直FOV和对角FOV。其中水平FOV由焦距和sensor的宽度W决定,垂直FOV由焦距和sensor的高度H决定,DFOV由焦距和sensor的宽度W和高度H决定。

image-20231204231622052

image-20231126171343416

相关的计算公式如下,其中fx,cx,fy,cyf_x,c_x,f_y,c_y为相机去畸变后的内参:

水平方向:HFOV=FOVhorizontal=2arctan(cxfx)=2arctan[tan(DFOV2)cos(arctan(cycx)]垂直方向:VHOF=FOVvertical=2arctan(cyfy)=2arctan[tan(DFOV2)sin(arctan(cycx)]水平方向:HFOV=FOV_{horizontal} = 2*\arctan(\frac{c_x}{f_x})=2*\arctan[tan(\frac{DFOV}{2})cos(arctan(\frac{c_y}{c_x})] \\ 垂直方向:VHOF=FOV_{vertical} = 2*\arctan(\frac{c_y}{f_y})=2*\arctan[tan(\frac{DFOV}{2})sin(arctan(\frac{c_y}{c_x})] \\

参考链接

相机的FOV计算公式_renmengqisheng的博客-CSDN博客

VR、AR、XR设计中的图像尺寸关系 - 知乎 (zhihu.com)