摄像机的标定即确定摄像机的内外部参数的过程。
摄像机内部参数是由摄像机内部几何和光学特性决定的,主要包括焦距f和主点坐标( u 0 , v 0 ),还有镜头畸变的各类畸变系数等。
摄像机外部参数是指摄像机坐标系相对世界坐标的位置关系,包括旋转矩阵R和平移向量t。
通俗讲:
通过摄像机标定我们可以知道些什么?
1.外参数矩阵。告诉你现实世界点(世界坐标)是怎样经过旋转和平移,然后落到另一个现实世界点(摄像机坐标)上。
2.内参数矩阵。告诉你上述那个点在1的基础上,是如何继续经过摄像机的镜头、并通过针孔成像和电子转化而成为像素点的。
3.畸变矩阵。告诉你为什么上面那个像素点并没有落在理论计算该落在的位置上,还产生了一定的偏移和变形!!!
4.结构参数。告诉你右摄像机是怎样相对于左摄像机经过旋转和平移达到现在的位置。
通过结构参数,便能把左右摄像机获取的图像的每一个像素点之间的关系用数学语言定量描述,保证两个相机都处于我们“可求”的状态。
世界坐标系:Xw、Yw、Zw。相机坐标系: Xc、Yc、Zc。图像坐标系:x、y。像素坐标系:u、v.
1.计算机图像坐标系Ouv(也称像素坐标系), 原点O位于CCD图像平面的左上角,u和v分别表示像素位于数组的列数和行数。
2.图像平面坐标系oxy, 原点(即主点)定义在摄像机光轴与图像平面的交点,一般为图像平面的中心,x,y轴分别与u,v轴平行。
3.摄像机坐标系OcXcYcZc, 原点Oc定义在摄像机的光心,Xc,Yc轴分别平行于x,y轴,Zc轴与光轴重合。Oc与o距离为摄像机的有效焦距f,(Xc,Yc,Zc)表示物点P在摄像机坐标系下的三维坐标。
4.世界坐标系OwXwYwZw, 根据具体环境来定。(Xw,Yw,Zw)表示物点P在世界坐标系下的三维坐标。
世界坐标系和相机坐标系是三维空间 ,而其他两个是二维平面
1.从世界坐标系到相机坐标系
刚体从世界坐标系转换到相机坐标系的过程,可以通过旋转和平移来得到,我们将其变换矩阵由一个旋转矩阵和平移向量组合成的齐次坐标矩阵。
其中,外参矩阵中R为旋转矩阵,t为平移向量,因为假定在世界坐标系中物点所在平面过世界坐标系原点且与Zw轴垂直(也即棋盘平面与Xw-Yw平面重合,目的在于方便后续计算),所以zw=0,可直接转换成式1的形式。外参矩阵可以理解为只与相机外部参数有关,且外参矩阵随刚体位置的变化而变化。
下图表示了用R,t将上述世界坐标系转换到相机坐标系的过程。
2从相机坐标系到理想图像坐标系(不考虑畸变)
这一过程进行了从三维坐标到二维坐标的转换,也即投影透视过程(用中心投影法将物体投射到投影面上,从而获得的一种较为接近视觉效果的单面投影图,也就是使我们人眼看到景物近大远小的一种成像方式)。我们还是拿针孔成像来说明(除了成像亮度低外,成像效果和透镜成像是一样的,但是光路更简单)。
成像过程如图二所示:针孔面(相机坐标系)在图像平面(图像坐标系)和物点平面(棋盘平面)之间,所成图像为倒立实像。
但是为了在数学上更方便描述,我们将相机坐标系和图像坐标系位置对调,变成图三所示的布置方式(没有实际的物理意义,只是方便计算)此时,点M(X,Y,Z)为摄像机坐标系空间中的一点,该点被光线投影到图像平面上的p(x,y,f)点,图像平面与光轴z轴垂直,和投影中心距离为f (f是相机的焦距)。按照三角比例关系可以得出:
xp/f = Xm/Zm yp/f = Ym/Zm 。也即:
点M,则在理想图像坐标系下(无畸变)的成像点P的坐标为:
将上式化为齐次坐标表示形式为:
3从理想图像坐标系到实际图像坐标系(考虑畸变)
透镜的畸变主要分为径向畸变和切向畸变,还有薄透镜畸变等等,但都没有径向和切向畸变影响显著,所以我们在这里只考虑径向和切向畸变。径向畸变是由于透镜形状的制造工艺导致。且越向透镜边缘移动径向畸变越严重。下图所示是径向畸变的两种类型:桶形畸变和枕形畸变。
实际情况中我们常用r=0处的泰勒级数展开的前几项来近似描述径向畸变。矫正径向畸变前后的坐标关系为:
由此可知对于径向畸变,我们有3个畸变参数需要求解。
切向畸变是由于透镜和CMOS或者CCD的安装位置误差导致。因此,如果存在切向畸变,一个矩形被投影到成像平面上时,很可能会变成一个梯形。切向畸变需要两个额外的畸变参数来描述,矫正前后的坐标关系为:
由此可知对于切向畸变,我们有2个畸变参数需要求解。
综上,我们一共需要5个畸变参数(k1、k2、k3、p1和p2 )来描述透镜畸变。
4从实际图像坐标系到像素坐标系
由于定义的像素坐标系原点与图像坐标系原点不重合.
假设像素坐标系原点在图像坐标系下的坐标为(u0,v0),设每个像素的物理尺寸大小为 dx * dy (mm) ( 由于单个像素点投影在图像平面上是矩形而不是正方形,因此可能dx != dy),每个像素点在图像坐标系x轴、y轴方向的尺寸为:dx、dy,且图像平面上某点在成像平面坐标系中的坐标为(xc,yc),于是可得到像点在像素坐标系下的坐标( u, v),二者满足如下关系:
化为齐次坐标表示形式可得:
公式2中(xp, yp)与公式5中(xc, yc)相同,都是图像坐标系下的坐标。
若暂不考虑透镜畸变,则将式2与式5的转换矩阵相乘即为内参矩阵M:
之所以称之为内参矩阵可以理解为矩阵内各值只与相机内部参数有关,且不随物体位置变化而变化。
最后用一幅图来总结从世界坐标系到像素坐标系(不考虑畸变)的转换关系:
如何由图像坐标系中的点的信息求得物点在世界坐标系中的点的信息可以归纳为如下:
其中,
λ是一个比例因子;
( u,v,1)为点P在图像坐标系中投影的齐次坐标;
dx、dy为每个像素在x轴和y轴方向上的物理尺寸;
(Xw,Yw,Zw,1)为P点在世界坐标系下的坐标;
fu =f /dx、fv = f /dy,分别代表u轴和v轴的尺度因子;
M1由fu、fv、u0、v0决定,称为内部参数;(u0,v0)为原点o的像素坐标。
M2由摄像机相对于世界坐标系的方位决定,称为摄像机的外部参数;
M称为投影矩阵,也就是下面的单应矩阵H
相机标定的目的就是建立摄像机图像像素位置与物体空间位置之间的关系,即世界坐标系与图像坐标系之间的关系。方法就是根据摄像机模型,由已知特征点的坐标求解摄像机的模型参数,从而可以从图像出发恢复出空间点三维坐标,即三维重建。所以要求解的参数包括4个内参数和5个畸变参数,还有外部参数旋转矩阵和平移矩阵。
“张氏标定”是指张正友教授于1998年提出的单平面棋盘格的摄像机标定方法。张氏标定法已经作为工具箱或封装好的函数被广泛应用。张氏标定的原文为“A Flexible New Technique forCamera Calibration”。此文中所提到的方法,为相机标定提供了很大便利,并且具有很高的精度。从此标定可以不需要特殊的标定物,只需要一张打印出来的棋盘格。
上文中我们已经得到了像素坐标系和世界坐标系下的坐标映射关系,我们假设标定棋盘位于世界坐标中zw=0平面,则化简前文中的公式:
其中,u,v表示像素坐标系中的坐标,fx =f /dx、fy= f /dy,u0,x0,γ(由于制造误差产生的两个坐标轴偏斜参数,通常很小,如果按上文中矩阵运算得到的值即为0)表示5个相机内参,R,t示相机外参,xw,yw,zw 表示世界坐标系中的坐标。
fx,fy和物理焦距f之间的关系为:fx=fsx和fy=fsy。其中sx=1/dx表示x方向上的1毫米长度所代表像素值,即像素/单位毫米,fx,fy是在相机标定中整体计算的,而不是通过该公式计算的。
单应性(在计算机视觉中被定义为一个平面到另一个平面的投影映射矩阵定义为:
我们如果求取H的值?
H是一个三3×3的矩阵,并且有一个元素是作为齐次坐标。因此,H有8个未知量待解。(xw,yw)作为标定物的空间坐标,可以由设计者人为控制,是已知量。(u,v)是像素坐标,我们可以直接通过摄像机获得。对于一组对应(xw,yw)-(u,v)我们可以获得两组方程。
*现在有8个未知量需要求解,所以我们至少需要八个方程。所以需要四个对应点。四点即可算出,图像平面到世界平面的单应性矩阵H。
这也是张氏标定采用四个角点的棋盘格作为标定物的一个原因。张氏标定就是利用一张打印的棋盘格,然后对每个角点进行标记其在像素坐标系的像素点坐标,以及在世界坐标系的坐标,张氏标定证明通过4组以上的点就可以求解出H矩阵的值,但是为了减少误差,具有更强的鲁棒性,我们一般会拍摄许多张照片,选取大量的角点进行标定。具体过程如下:
打印一张棋盘格标定图纸,将其贴在平面物体的表面.
拍摄一组不同方向棋盘格的图片,可以通过移动相机来实现,也可以移动标定图片来实现。
对于每张拍摄的棋盘图片,检测图片中所有棋盘格的特征点(角点,也就是下图中黑白棋盘交叉点,中间品红色的圆圈内就是一个角点)。我们定义打印的棋盘图纸位于世界坐标系zw=0的平面上,世界坐标系的原点位于棋盘图纸的固定一角(比如下图中黄色点)。像素坐标系原点位于图片左上角。
因为棋盘标定图纸中所有角点的空间坐标是已知的,这些角点对应在拍摄的标定图片中的角点的像素坐标也是已知的,如果我们得到这样的N>=4个匹配点对(越多计算结果越鲁棒),就可以根据LM等优化方法得到单应性矩阵H。
假设我们已经通过LM求得了相机的内参M1和外参R,t。那如果获取到图像中二维坐标,如何获取到现实中三维坐标呢?当然单目摄像机无法获取三维坐标,但能反映一定关系。综上来讲,矩阵变换公式为:
根据坐标系之间转化和相机模型,研究了极几何及基本矩阵的知识,证明了基本矩阵是求得摄像机投影矩阵的关键,根据基础矩阵H和摄像机标定阶段获取的内参数矩阵M1,计算得到本征矩阵E,通过对E进行奇异值分解求得外参数矩阵R,t,接着求出投影矩阵P1和P2、重投影矩阵Q。OpenCV提供了两个相关的函数stereoCalibrate()和stereoRectify()。