相机成像的四个坐标系

发布时间 2023-08-19 20:44:11作者: Champrin

相机成像的四个坐标系

Write By Champrin On 2022-11-3
GUET Evolution Team Visual Group

三维重建第三课:相机标定原理步骤(一)坐标系变换
三维重建第四课:相机标定原理步骤(二)世界坐标系到相机坐标系与畸变
相机标定——四个坐标系
MATLAB有关相机模型
《Learning OpenCV3》ch18:相机模型与标定

相机镜头-凸透镜

  • 焦距 \(f\)
    • 是光学系统中衡量光的聚集或发散的度量方式,指从透镜的光心到光聚集之焦点的距离
    • 亦是相机中,从镜片中心到底片或图像传感器等成像平面的距离
    • 一般用凸透镜做相机的镜头时,它成的最清晰的像一般不会正好落在焦点上,或者说,最清晰的像到光心的距离(像距)一般不等于焦距,而是略大于焦距。具体的距离与被照的物体与镜头的距离(物距)有关,物距越大,像距越小,(但实际上总是大于焦距)
  • 光心:凸透镜的中心近似看作是光心,可理解为相机透镜的几何中心

相机 CCD/CMOS 图像传感器

相机 CCD/CMOS 图像传感器是用于成像的,具体原理就不去了解了……
我们用的华睿(大华)工业相机的图像传感器类型是 CMOS。

四个坐标系总览

针孔相机模型,建立了四个坐标系:世界坐标系、相机坐标系、图像物理坐标系到和图像像素坐标系。

世界坐标系(World Coordinate)

由于摄像机与被摄物体可以放置在环境中任意位置,这样就需要在环境中建立一个坐标系,来表示摄像机和被摄物体的位置,这个坐标系就称为 世界坐标系

在相机模型中,世界坐标系为 右手坐标系;对于别处模型的世界坐标系可能有所不同。

一般而言,世界坐标系原点是设立在识别到的物体上的;
如对于装甲板,是以其中心为原点,\(x\) 轴水平向右,\(y\) 轴竖直向下建立世界坐标系;
如对于棋盘图标定板,是以最左上角的角点为原点,\(x\) 轴水平向右,\(y\) 轴竖直向下建立世界坐标系。

总览中 \(O-X_WY_WZ_W\) 就是世界坐标系,上图为对于棋盘图标定板建立世界坐标系各个轴的朝向示例。

相机坐标系(Camera Coordinate)

相机坐标系 原点位于镜头光心处,\(x,y\) 轴分别与像平面的两边平行,\(z\) 轴为镜头光轴,与像平面垂直。

在相机模型中,相机坐标系为右手坐标系

相机右手坐标系

总览中 \(O-X_CY_CZ_C\) 就是相机坐标系,右图为相机坐标系各个轴的朝向示例。

世界坐标系 到 相机坐标系

刚体变换不会改变形状,只改变朝向和位置,可用两个变量来描述:正交矩阵-旋转矩阵 \(R\),三维平移向量 \(t\)
这两系的转换就是是刚体变换。

\(R\) 为 世界坐标系 到 相机坐标系 的旋转矩阵;
\(t\) 为 世界坐标系 到 相机坐标系 的平移矩阵。

世界坐标系 上一点 \((X_W, Y_W, Z_W)\),转换为 相机坐标系 上一点的坐标为 \((X_C, Y_C, Z_C)\)

那么 世界坐标系 到 相机坐标系 转换表达式就可以得出:

\[\begin{bmatrix} X_C \\ Y_C \\ Z_C \end{bmatrix} = R \begin{bmatrix} X_W \\ Y_W \\ Z_W \end{bmatrix} + t \]

转换为齐次形式:

\[\begin{bmatrix} X_C \\ Y_C \\ Z_C \\ 1 \end{bmatrix} = \begin{bmatrix} R & t \\ 0_{1 \times 3} & 1 \end{bmatrix}\begin{bmatrix} X_W \\ Y_W \\ Z_W \\ 1 \end{bmatrix} \tag{1} \]

图像像素坐标系

表示三维空间物体在图像平面上的投影,坐标系反应了相机CCD/CMOS芯片中像素的排列情况;
其上的点称为像素,是离散化的。

其坐标系为二维,原点在图像传感器所成图像平面的左上角,\(u\) 轴水平向右,\(v\) 轴竖直向下;
图像像素坐标系中的坐标轴单位是像素 \(px\)(整数)。

总览中 \(O_0-uv\) 就是图像像素坐标系

图像物理坐标系

图像像素坐标系不利于坐标变换,因此需要建立图像物理坐标系。

坐标原点在图像传感器所成图像平面的中心,也是相机光轴与像平面的交点(称为主点),即图像的中心点,\(x,y\) 轴分别平行于图像像素坐标系的 \(u,v\) 轴;
图像物理坐标系中的坐标轴单位通常为毫米 \(mm\)

总览中 \(O_1-xy\) 就是图像像素坐标系

图像物理坐标系 到 图像像素坐标系

很明显,这两个坐标系通过平移就可得到。

图像物理坐标系是以物理单位来描述一个点的位置的,轴上的数据单位为 \(mm\)
图像像素坐标系是以像素单位来描述一个点的位置的,轴上的数据单位为 \(px\)
也很显然,要使得这两个坐标系进行相互转换,同时需要解决单位一致的问题。

  • \(dx,dy\) 分别表示为像素在 \(x,y\) 轴方向上的物理尺寸,单位为毫米每像素 \(mm/px\),其意义是 1 像素有多少毫米;
    因此,图像物理坐标系上以 mm 为单位的一点 \((x, y)\),转换为以 px 为单位就是 \((\cfrac{x}{dx}, \cfrac{y}{dy})\)
  • 图像物理坐标系原点 \(O_1\) 在图像像素坐标系上坐标为 \((u_0, v_0)\)

图像物理坐标系 上一点 \((x, y)\),转换为 图像像素坐标系 上一点的坐标为 \((u, v)\)

基于上述,有如下关系:

\[\begin{cases} u = \frac{x}{dx} + u_0 \\ v = \frac{y}{dy} + v_0 \end{cases} \]

转换为齐次坐标矩阵形式:

\[\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} \frac{1}{dx} & 0 & u_0 \\ 0 & \frac{1}{dy} & v_0 \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x \\ y \\ 1 \end{bmatrix} \tag{2} \]

孔成像原理

孔成像,成的是原像倒立的像;
建模时,为了使成的像是正立的,即不是倒立的像,会把成像平面前移;
因此,在一些资料中的相机成像模型,成像平面在光心的前面,而不是实际孔成像原理中,成像平面在光心的后面。

相机坐标系 到 图像物理坐标系

相机坐标系 上一点 \((X_C, Y_C, Z_C)\),转换为 图像像素坐标系 上一点的坐标为 \((u, v)\)

根据孔成像原理,以及相似三角形,可以完成 相机坐标系 到 图像物理坐标系 的转换:

\[\begin{cases} \frac{x}{X_C} = \frac{f}{Z_C} \\ \frac{y}{Y_C} = \frac{f}{Z_C} \end{cases} \Rarr \begin{cases} Z_C \cdot x = f \cdot X_C \\ Z_C \cdot y = f \cdot Y_C \end{cases} \]

转换为齐次坐标矩阵形式:

\[Z_C \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \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} \tag{3} \]

世界坐标系 到 图像像素坐标系

世界坐标系 上一点 \((X_W, Y_W, Z_W)\),转换为 图像像素坐标系 上一点的坐标为 \((u, v)\)

将式 \((2)(3)(1)\) 联立:

\[\begin{aligned} Z_C \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} & = \begin{bmatrix} \frac{1}{dx} & 0 & u_0 \\ 0 & \frac{1}{dy} & v_0 \\ 0 & 0 & 1 \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 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix}\begin{bmatrix} X_C \\ Y_C \\ Z_C \\ 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_{1 \times 3} & 1 \end{bmatrix}\begin{bmatrix} X_W \\ Y_W \\ Z_W \\ 1 \end{bmatrix} \\ & = \begin{bmatrix} \frac{f}{dx} & 0 & u_0 & 0 \\ 0 & \frac{f}{dy} & v_0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix}\begin{bmatrix} R & t \\ 0_{1 \times 3} & 1 \end{bmatrix}\begin{bmatrix} X_W \\ Y_W \\ Z_W \\ 1 \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_{1 \times 3} & 1 \end{bmatrix}\begin{bmatrix} X_W \\ Y_W \\ Z_W \\ 1 \end{bmatrix} \\ & = \begin{bmatrix} f_x & 0 & u_0 \\ 0 & f_y & v_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} R & t \end{bmatrix}\begin{bmatrix} X_W \\ Y_W \\ Z_W \\ 1 \end{bmatrix} \\ & = P\begin{bmatrix} X_W \\ Y_W \\ Z_W \\ 1 \end{bmatrix} \end{aligned} \]

  • \(f_x = \frac{f}{dx},f_y = \frac{f}{dy}\) 称为 \(u,v\) 轴的尺度因子
  • \(K\) 称为相机的内部参数矩阵,简称相机内参
  • \(\begin{bmatrix}R & t\end{bmatrix}\) 称为相机的外部参数矩阵,简称相机外参
    • \(R\) 为 世界坐标系 到 相机坐标系 的旋转矩阵
    • \(t\) 为 世界坐标系 到 相机坐标系 的平移矩阵
  • \(P\)\(3 \times 4\) 矩阵,称为投影矩阵

OpenCV中的相机内参矩阵有 4 个参数:\(f_x, f_y, u_0, v_0\)
MATLAB 标定时可选择标定参数为 5 个参数的结果,多了一个缩放因子 \(s\);在一些资料中,内参矩阵会多出来一个 \(s\)

图像像素坐标系 到 相机坐标系

图像像素坐标系 到 相机坐标系,可以经 图像物理坐标系 进行转换;
即图像像素坐标系 到 图像物理坐标系,再由 图像物理坐标系 到相机坐标系。

图像像素坐标系 上一点 \((u,v)\),转换为 图像物理坐标系 上一点的坐标为 \((x,y)\),转换为 相机坐标系 上一点的坐标为 \((x_C,y_C,z_C)\)

根据式\((2)\),可得:

\[\begin{cases} x = (u - u_0)dx \\ y = (v - v_0)dy \end{cases} \]

根据式\((3)\),可得:

\[\begin{cases} z_C \cdot x = f \cdot x_C \\ z_C \cdot y = f \cdot y_C \end{cases} \]

设焦距为\(F\),则\(z_C = F\)

联立两方程组可得:

\[\begin{cases} F \cdot (u - u_0)dx = f \cdot x_C \\ F \cdot (v - v_0)dy = f \cdot y_C \end{cases} \\ \Rarr \begin{cases} F \cdot (u - u_0) \frac{dx}{f} = x_C \\ F \cdot (v - v_0) \frac{dy}{f} = y_C \end{cases} \\ \Rarr \begin{cases} F \cdot (u - u_0) / \frac{f}{dx} = x_C \\ F \cdot (v - v_0) / \frac{f}{dy} = y_C \end{cases} \\ \Rarr \begin{cases} x_C = F \cdot (u - u_0) / f_x \\ y_C = F \cdot (v - v_0) / f_y \\ z_C = F \end{cases} \]

畸变矩阵

工业相机镜头畸变较小,这方面的内容了解即可,可以先不用深入,懂得如何使用OpenCV进行畸变矫正即可。

参考资料:最详细、最完整的相机标定讲解

一般只需要计算出k1、k2、p1、p2,对于鱼眼镜头等径向畸变特别大的才需要计算k3。

相机标定

相机标定是在求得相机的内部参数矩阵,以及外部参数矩阵,但是这个外部参数矩阵仅适用于当时作为标定图对应标定板的外部参数矩阵。

cv::solvePnP

世界坐标系原点设在装甲板的中心,
PNP解算可以理解为在求外部参数矩阵

本文部分图片来自:
mathworks
CSDN-土豪gold