相机的成像模型

本文详细阐述了相机成像模型中的四个关键步骤:从世界坐标系到相机坐标系、相机坐标系到图像坐标系、图像坐标系到像素坐标系的转换,以及相机内参和外参矩阵在成像过程中的作用。特别强调了尺度因子在三维重建和视觉测量中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

相机成像模型

1.世界坐标系与相机坐标系的转换

 2.相机坐标系与图像坐标系的转换

3.图像坐标系与像素坐标系的转换

4.成像模型


相机成像模型

        在学习计算机视觉的过程中,少不了接触针孔相机的成像模型,这是基础也是容易让人混淆的东西,特别是其中参数的概念,对应的物理意义是什么。其实,相机的成像模型无非就是几个坐标系的转换,其中涉及到的坐标系有:世界坐标系(world frame)、相机坐标系(camera frame)、图像坐标系(image frame)、像素坐标系(pixel frame)。其中,图像坐标系与像素坐标系为二维坐标系,像素坐标系通常以图像的左上角为坐标原点。

        下面我将会分为4个部分讲述他们的关系。

1.世界坐标系与相机坐标系的转换

        所谓世界坐标系就是世界上任意一个地方都可以成为一个坐标系。假设在空间中存在一个点称为P^{W},那么世界坐标系在不同的位置,P^{W}的坐标自然也就不同。

        现在固定一个世界坐标系,P^{W}的坐标自然也就固定不变了。比如,在相机标定的过程中,就是假设世界坐标系在标定板(棋盘格)的左上顶点处;在视觉测量的过程中,通常以被测物体作为世界坐标系,有时也被称为物体坐标系。

        下面涉及到一些刚体变换的知识。设RT分别为世界坐标系到相机坐标系的旋转变换和平移变换,P^{C}为相机坐标系下的坐标。那么P^{W}P^{C}的转换关系为:

P^{C}=\begin{bmatrix}R&T & \\ 0 &\mathbf{ 1} \end{bmatrix}P^{W}

        注意,这里P^{C}P^{W}都变为齐次坐标,也就是多加了一个1,例如:P^{C}表现形式为[X^{C}, Y^{C}, Z^{C}, 1]^{T}

 2.相机坐标系与图像坐标系的转换

        将世界坐标系转换到相机坐标系后,原来的P^{W}也就变为P^{C}了。在拍摄过程中,P^{C}会投影到CCD或CMOS传感器上,成为一个像素点,该像素点在图像坐标系下的坐标为p^{i}=(x, y),下图可以简述其中的关系。

        而投影也是一种比例关系或者说是相似关系,如下:

x=\frac{X^{C}f}{Z^{C}}y=\frac{Y^{C}f}{Z^{C}}

        矩阵化之后为:

\begin{bmatrix} x\\ y \\ 1 \end{bmatrix}=\frac{1}{Z^{C}}\begin{bmatrix} f& 0& 0& 0\\ 0& f& 0& 0\\ 0& 0 & 1& 0 \end{bmatrix}\begin{bmatrix} X^{C}\\ Y^{C}\\ Z^{C}\\ 1 \end{bmatrix}

3.图像坐标系与像素坐标系的转换

        完成上面两个关系后,只需要获得图像坐标系与像素坐标系的转换关系,就可以将世界坐标系下的点投影转换为像素坐标系下了(为什么要转换到像素坐标系呢?因为通常像素点的坐标指的就是像素坐标系下的坐标,而不是图像坐标系下的坐标)。而图像坐标系与像素坐标系均为二维平面,将两个二维平面平铺之后,它们之间的关系如下图所示:

         设o点在像素坐标系下的坐标为(u_{0}, v_{0}),这两个点通常也被成为主点坐标(principal point),也就是相机坐标系的Z轴与图像平面的交点。由于CCD或CMOS的传感器通常不为正方形,故设像元的横向尺寸和纵向尺寸分别为dxdy,其单位则为mm/pixel

        将实际的空间点离散化为相机的像素值(在实际编程的时候xy可能为小数,需要取整),有:(注意:在部分参考资料中还加入了倾斜因子,该值通常较小,这里就省略了)

u=\frac{x}{dx}+u_{0}

v=\frac{y}{dy}+v_{0}

        将上面的等式转换为矩阵形式并且升一个维度变为齐次形式,有:

\begin{bmatrix} u\\ v \\ 1 \end{bmatrix}=\begin{bmatrix} \frac{1}{dx} & 0 &u_0 \\ 0 & \frac{1}{dx} & v_0\\ 0& 0 & 1 \end{bmatrix}\begin{bmatrix} x\\y \\1 \end{bmatrix}

4.成像模型

        将上面三个矩阵依次相乘,则有:

Z^{C}\begin{bmatrix} x\\ y \\ 1 \end{bmatrix}=\begin{bmatrix} \frac{1}{dx}& 0& u_0\\ 0& \frac{1}{dy}& v_0\\ 0& 0& 1\\ \end{bmatrix}\begin{bmatrix} f& 0& 0& 0\\ 0& f& 0& 0\\ 0& 0 & 1& 0 \end{bmatrix}\begin{bmatrix} R & T\\ 0& \mathbf{1} \end{bmatrix}\begin{bmatrix} X^{W}\\ Y^{W}\\ Z^{W}\\ 1 \end{bmatrix}

        其中,坐标两个矩阵只与相机的参数相关,故也被称为相机内参矩阵K。中间包含RT的矩阵是世界坐标系到相机坐标系的变换矩阵,也被称为外参矩阵Z^{C}则是一个很重要,也很神奇的参数,在部分参考资料会将它写成s,称为尺度因子。这个参数在三维重建、视觉测量等领域都非常重要。

        根据上面的解释,我们可以把上式简化成:

s\begin{bmatrix} u\\ v\\ 1 \end{bmatrix}=K\begin{bmatrix} R & T\\ 0&\boldsymbol{1} \end{bmatrix}\begin{bmatrix} X^{W}\\ Y^{W}\\ Z^{W}\\ 1 \end{bmatrix}

        其中

K=\begin{bmatrix} \frac{f}{dx} & 0& u_0& 0\\ 0& \frac{f}{dy}& v_o& 0\\ 0& 0& 1& 0 \end{bmatrix}=\begin{bmatrix} f_x & 0& u_0& 0\\ 0& f_y& v_0& 0\\ 0& 0& 1& 0 \end{bmatrix}

        在部分资料中会将\begin{bmatrix} R & T\\ 0&\boldsymbol{1} \end{bmatrix},改写为\begin{bmatrix} R & T\end{bmatrix}。故也写作

Z^{C}\begin{bmatrix} x\\ y \\ 1 \end{bmatrix}=\begin{bmatrix} \frac{1}{dx}& 0& u_0\\ 0& \frac{1}{dy}& v_0\\ 0& 0& 1\\ \end{bmatrix}\begin{bmatrix} f& 0& 0\\ 0& f& 0\\ 0& 0 & 1\end{bmatrix}\begin{bmatrix} R & T\\ \end{bmatrix}\begin{bmatrix} X^{W}\\ Y^{W}\\ Z^{W}\\ 1 \end{bmatrix}

        则有 

K=\begin{bmatrix} f_x & 0& u_0\\ 0& f_y& v_0\\ 0& 0& 1\end{bmatrix}

        在相机标定结束后,相机内参始终只有一个,而每一张标定板的图像都会对应着一个外参矩阵。(注意:这里仅描述了成像模型,通常除了要标定出内外参之外,还需要标定相机的畸变参数,这里就不做论述了。)

### 相机坐标系在成像中的应用与原理 #### 1. 相机坐标系定义 相机坐标系是以相机光心 \(O_c\) 为原点的一个三维直角坐标系。通常情况下,\(Z_c\) 轴沿着相机的光轴指向前方,而 \(X_c\) 和 \(Y_c\) 则分别对应于图像平面的方向[^1]。 #### 2. 投影模型计算机视觉中,相机成像是基于针孔模型的一种近似方法。具体来说,现实世界的三维点 \((X_w, Y_w, Z_w)\) 首先被映射到相机坐标系下的三维点 \((X_c, Y_c, Z_c)\),然后再经过透视投影变换成为二维图像平面上的点 \((u, v)\)[^3]。 这一过程可以用如下公式表示: \[ \begin{bmatrix} x \\ y \\ z \end{bmatrix} = K \begin{bmatrix} R & T \end{bmatrix} \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix}, \] 其中: - \(K\) 是相机内参数矩阵, - \([R|T]\) 表示由世界坐标系到相机坐标系的旋转和平移组成的外参数矩阵[^2]。 #### 3. 坐标转换关系 为了完成从世界坐标系到像素坐标的转换,需要依次经历以下几个步骤: - **世界坐标系转相机坐标系**:利用外部参数(即旋转矩阵 \(R\) 和平移向量 \(T\)),将世界坐标系中的点转换至相机坐标系。 \[ P_c = R P_w + T, \] 这里 \(P_c\) 和 \(P_w\) 分别代表同一空间点在相机坐标系和世界坐标系下的位置矢量。 - **相机坐标系转图像坐标系**:通过除以深度分量 \(Z_c\) 实现透视投影操作,从而得到归一化后的图像坐标 \((x_n, y_n)\): \[ x_n = X_c / Z_c,\quad y_n = Y_c / Z_c. \] - **图像坐标系转像素坐标系**:最后借助内部校准数据来调整比例因子并加上偏置项,最终获得实际采集图片上的像素位置 \((u,v)\): \[ u = f_x x_n + c_x,\quad v = f_y y_n + c_y, \] 其中 \(f_x,f_y,c_x,c_y\) 来自相机内参矩阵 \(K=[α β γ;0 α' δ;0 0 1]\), 它们反映了焦距以及主点的具体数值。 以上便是整个流程概述,展示了如何运用相机坐标系及其关联要素达成精确的目标定位功能。 ```python import numpy as np def project_points(world_points, K, R, t): """ Projects world points into image plane using camera parameters. Parameters: world_points (numpy.ndarray): Nx3 array of N 3D points in the world coordinate system. K (numpy.ndarray): 3x3 intrinsic parameter matrix. R (numpy.ndarray): 3x3 rotation matrix from world to camera coordinates. t (numpy.ndarray): 3x1 translation vector from world to camera coordinates. Returns: numpy.ndarray: Nx2 array of projected pixel coordinates. """ # Convert world points to homogeneous coordinates world_homogeneous = np.hstack((world_points, np.ones((len(world_points), 1)))) # Transform world points to camera frame extrinsic_matrix = np.hstack((R, t)) cam_coords = np.dot(extrinsic_matrix, world_homogeneous.T).T # Perspective projection onto image plane img_plane_coords = cam_coords[:, :2] / cam_coords[:, 2].reshape(-1, 1) # Apply intrinsics and convert back to pixels pixel_coords = np.dot(K[:2,:], np.vstack((img_plane_coords.T, np.ones(len(img_plane_coords)))).T) return pixel_coords[:,:2] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值