OpenCV——相机标定(Camera calibration)

摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵 P PP 的过程。

所涉及的坐标系

  • 世界坐标系(world coordinate system);
  • 相机坐标系(camera coordinate system);
  • 图像坐标系(image coordinate system);

 标定的过程分为两个部分:

第一步是从世界坐标系转换为相机坐标系,这一步是三维点到三维点的转换,包括 R RR,t tt (相机外参)等参数;
第二部是从相机坐标系转为图像坐标系,这一步是三维点到二维点的转换,包括 K KK(相机内参)等参数;

相机坐标系转换到图像坐标系

OpenCV——相机标定(Camera calibration)_第1张图片

 如上图所示,是一个小孔成像的模型,其中:

  • C点表示camera centre,即相机的中心点,也是相机坐标系的中心点
  • Z轴表示principal axis,即相机的主轴
  • p点所在的平面表示image plane,即相机的像平面,也就是图片坐标系所在的二维平面
  • p点表示principal point,即主点,主轴与像平面相交的点
  • C点到p点的距离,也就是右边图中的f表示focal length,即相机的焦距
  • 像平面上的xy坐标轴是与相机坐标系上的XY坐标轴互相平行的
  • 相机坐标系是以XYZ三个轴组成的且原点在C点,度量值为米(m)
  • 像平面坐标系是以x,y两个轴组成的且原点在p点,度量值为米(m)
  • 图像坐标系一般指图片相对坐标系,在这里可以认为和像平面坐标系在一个平面上,不过原点是在图片的角上,而且度量值为像素的个数(pixel

 如果知道相机坐标系中的一个点 X(现实三维世界中的点),在像平面坐标系对应的点是x,求相机坐标系转为像平面坐标系的转换,即点X(X,Y,Z)通过一定的转换变为点x(x,y)

通过图2我们可以发现

x=fX/Z

y=fY/Z

OpenCV——相机标定(Camera calibration)_第2张图片

 x=PX

 通过上面,可以把相机坐标系转换到像平面坐标系,但是像平面坐标系和图像坐标系虽然在同一个平面上,但是原点并不是同一个,而目标是要转换到图像坐标系下,所以还需要一步操作,如下图:

OpenCV——相机标定(Camera calibration)_第3张图片

其中主点p是像平面坐标系的原点,但在图像坐标系中的位置为(p_{x},p_{y})

在这里图形坐标系的原点是图片的左下角,(X,Y,Z\rightarrow (fX/Z+p_{x},fY/Z+p_{y}

相当于在上面的基础上加了一个p 点坐标的偏移量,矩阵表示

OpenCV——相机标定(Camera calibration)_第4张图片

OpenCV——相机标定(Camera calibration)_第5张图片

最后得到K 相机内参(Intrinsic parameters)

OpenCV——相机标定(Camera calibration)_第6张图片

 投影矩阵P(设旋转矩阵R为单位矩阵I,平移矩阵t都为0)

 像素坐标

在图像坐标系中用的不是现实生活中的m来度量,而是用的 pixel 的个数,所以在上面转换到图像坐标系中还有个问题,就是坐标的表示还是m,并没有转换到像素坐标系统。

  • m_{x}表示在水平方向1m的长度包含的像素的个数
  • m_{y}表示在竖直方向1m的长度包含的像素的个数

 通过上面可以得到一个像素点的大小(m度量)为

 需要说明的是像素并不一定是一个正方形,有时候可能也是一个矩形,所以要分别指定。

更新上面相机内参K

OpenCV——相机标定(Camera calibration)_第7张图片

 一般来说,在使用相机内参K计算坐标系转换时,提供的都是已经变换后的值

一般见到的是f_{x},f_{y},c_{x},c_{y}分表对应相机内参K,对应上面矩阵f_{x},f_{y},c_{x},c_{y}分别对应\alpha _{x},\alpha _{y},\beta _{x},\beta _{y}

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

OpenCV——相机标定(Camera calibration)_第8张图片

 如上图所示,从世界坐标系转换到相机坐标系是三维空间到三维空间的变换,一般来说需要一个平移操作和一个旋转操作就可以完成这个转换,用公式表示如下(可以理解为世界坐标系原点先平移到相机坐标系的位置然后在做一次坐标系旋转,使坐标轴对齐):

  • R表示旋转矩阵
  • \widetilde{X}表示X点在世界坐标系中的位置
  • \widetilde{C}表示相机原点C在世界坐标系中的位置
  • \widetilde{X}_{cam}表示X点在相机坐标系中的位置 

 世界坐标转到相机坐标

根据上面的公式可以得到从一个三维点从世界坐标系转换到相机坐标的变换公式如下

OpenCV——相机标定(Camera calibration)_第9张图片

世界坐标转到图像坐标

 根据以上得到

得到投影矩阵P

其中 

K一般称为相机内参 (intrinsic parameters),描述了相机的内部参数,包括焦距f、主点 p 的位置、以及像素与真实环境的大小比例等,这个是固有属性。Rt称为相机外参(extrinsic parameters),R是旋转矩阵,可以转换为三维的旋转向量,分别表示绕x,y,z 三个轴的旋转角度,t目前就是一个平移向量,分别表示在x,y,z三个方向上的平移量。

畸变参数(distortion parameters)

在几何光学和阴极射线管(CRT)显示中,畸变(distortion) 是对直线投影(rectilinear projection)的一种偏移。简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。那畸变简单来说就是一条直线投影到图片上不能保持为一条直线了,这是一种光学畸变(optical aberration)。
径向畸变(Radial distortion

径向畸变的效应有三种,一种是桶形畸变(barrel distortion),另一种是枕形畸变(pincushion distortion),还有一种是两种的结合叫做胡子畸变(mustache distortion),从图片中可以很容易看出区别,具体见下图(图片来自wikipedia):

 径向畸变可以用如下公式修正:

OpenCV——相机标定(Camera calibration)_第10张图片

切向畸变(tangential distortion

切向畸变是由于透镜与成像平面不严格的平行,其可以用如下公式修正:

OpenCV——相机标定(Camera calibration)_第11张图片

OpenCV——相机标定(Camera calibration)_第12张图片


再次介绍 

 相机坐标系Pc到像素坐标系P_{x}

像素坐标系相比与相机坐标系进行了缩放和原点的平移(像素坐标系的原点一般为图像左上角),故像素坐标系P_{x}(u,v):

OpenCV——相机标定(Camera calibration)_第13张图片

OpenCV——相机标定(Camera calibration)_第14张图片

OpenCV——相机标定(Camera calibration)_第15张图片

 相机坐标系P_{c}到世界坐标系P_{w}

 相机坐标系P_{c}只是单个相机下的坐标,需要把所有相机拍的转换到同一个坐标系下,即世界坐标系P_{w},需要经过旋转和平移。

其中R是一个3*3的旋转矩阵,T是一个3*1的平移矩阵。

RT放一起成下面形式是一个4*4的矩阵,表示相机的外参(camera extrinsics)矩阵

OpenCV——相机标定(Camera calibration)_第16张图片

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

OpenCV——相机标定(Camera calibration)_第17张图片

OpenCV——相机标定(Camera calibration)_第18张图片

OpenCV——相机标定(Camera calibration)_第19张图片

 f_{x},f_{y}为想x,y轴焦距

关于f_{x},f_{y}焦距参见

https://www.cnblogs.com/zipeilu/p/6658177.html

你可能感兴趣的:(Opencv,相机内参外参,相机标定)