本文主要介绍相机针孔模型的基本原理,包括相机坐标系、成像坐标系以及像素坐标系之间的转换关系——内参矩阵(Camera intrinsics),在此基础上介绍该矩阵在MATLAB中的表示以及与其他相关软件中的表示的异同,最后给出相关MATLAB中的相关类、函数的表示和使用方法。
针孔相机模型是用于表示相机将三维坐标转化为平面坐标的最常用的模型,数学物理原理非常简单,各种相关书籍和文章中也多有详细的介绍,借用MATLAB帮助(《What Is Camera Calibration?》)中的图片,可以表示如下。
从世界坐标系转换到相机坐标系有一个旋转和平移叠加的过程,可以用一个正交矩阵表示,又称为相机的外参矩阵(Camera Extrinsics),该矩阵的参数与相机位姿和世界坐标系的定义有关,而与相机本身的参数(焦距、畸变等)无关,因此本文不作细述,这里主要讨论从相机坐标系下的物体点位置到成像和像素坐标系的转换关系。
从三维空间的点 P = ( X , Y , Z ) P=(X,Y,Z) P=(X,Y,Z)变换到成像平面的过程也称射影变换。该点到成像平面的距离为 f f f,将点P投影到成像坐标系(平面),利用相似三角形原理,可得:
{ x = f X Z y = f Y Z z = f \left\{ \begin{array}{l} x = f\frac{X}{Z} \\ y = f\frac{Y}{Z} \\ z = f \end{array} \right. ⎩⎨⎧x=fZXy=fZYz=f
其中 ( x , y ) (x,y) (x,y)为P点在成像坐标系下的坐标点。
成像坐标系的中心点通常在成像平面中心,而像素坐标系则通常在图像左上角,因此需要作平移,同时,像素坐标系和成像坐标系的下单位不同,因此还有缩放。综合如下:
将坐标 ( x , y ) (x,y) (x,y)水平缩放α倍,在竖直方向缩放β倍,同时平移 ( c x , c y ) (c_x,c_y) (cx,cy),可得对应的像素坐标 ( μ , ν ) (μ,ν) (μ,ν)
u = α ⋅ x + c x v = β ⋅ y + c y \begin{array}{c} u = \alpha\cdot x+ c_x \\ v = \beta \cdot y + c_y \end{array} u=α⋅x+cxv=β⋅y+cy
从而得到
{ u = f x X Z + c x v = f y Y Z + c y \left\{\begin{array}{c} u = f_x\frac{X}{Z}+ c_x \\ v = f_y\frac{Y}{Z} + c_y \end{array}\right. {u=fxZX+cxv=fyZY+cy
其中, f x = α ⋅ f , f y = β ⋅ f f_x = \alpha \cdot f,f_y = \beta \cdot f fx=α⋅f,fy=β⋅f。
写成矩阵形式:
[ μ ν 1 ] = 1 Z [ f x 0 c x 0 f y c y 0 0 1 ] [ X Y Z ] \left[\begin{array}{c}\mu\\\nu\\1\end{array}\right] = \frac{1}{Z}\left[ \begin{array}{ccc}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{array}\right]\left[\begin{array}{c}X\\Y\\Z\end{array}\right] ⎣⎡μν1⎦⎤=Z1⎣⎡fx000fy0cxcy1⎦⎤⎣⎡XYZ⎦⎤
把以上矩阵称为内参矩阵。
MATLAB中内参矩阵表示如下:
首先可以看出,形式上是我们常规表示的转置形式,这是因为常规表示中变幻时是由内参矩阵左乘待变换点,也是我们比较习惯的形式。但是在MATLAB中使用的是坐标点向量左乘矩阵的形式,个人理解是因为在MALTAB中表示或初始化坐标向量时更习惯用类似aVec = [1 2 3]这样的表示形式而不是aVec = [1 2 3]’。
其次增加了一个系数 s s s,表示水平方向的歪斜度。相关参数解释以及 s s s与 f x f_x fx的关系如下:
实际相机并没有上述那么理想,实际在成像过程中会出现畸变,严格来讲需要考虑,但本文不涉及,这里不再细述。
先初始化相机参数:
focalLength = [800, 800]; % fx和fy
principalPoint = [320, 240]; % cx和cy
imageSize = [480, 640]; % 图像大小
然后用构造函数实例化一个相机内参对象:
intrinsics = cameraIntrinsics(focalLength,principalPoint,imageSize)
intrinsics =
cameraIntrinsics with properties:
FocalLength: [800 800]
PrincipalPoint: [320 240]
ImageSize: [480 640]
RadialDistortion: [0 0]
TangentialDistortion: [0 0]
Skew: 0
IntrinsicMatrix: [3x3 double]
这里有畸变以及弯斜的参数,但是这里没有参数,默认为0。
相关类:monoCamera、cameraParameters等。后续进一步介绍。
MATLAB官网《What Is Camera Calibration?》:https://www.mathworks.com/help/vision/ug/camera-calibration.html)
《相机模型与相机标定原理》:https://www.cnblogs.com/narjaja/p/9486407.html