相机标定
先放一个知乎上面通俗易懂的解答:
链接:https://www.zhihu.com/question/29448299/answer/102658379
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
不过请注意!到了这一步,其实我们仅仅是得到了一坨坨感兴趣的像素而已!究竟要怎样才能把这些像素转化到现实世界的对象中呢?也就是说,究竟要怎样对这些仅存在于图像中的东西进行测量,才能得到具有实际意义和尺度的数据呢?这个时候我们就懵逼了……
没错, 摄像机标定的存在意义就是解决这个蛋疼的问题!!!
我们继续看看,通过摄像机标定我们可以知道些什么:
1.外参数矩阵。告诉你现实世界点(世界坐标)是怎样经过旋转和平移,然后落到另一个现实世界点(摄像机坐标)上。
2.内参数矩阵。告诉你上述那个点在1的基础上,是如何继续经过摄像机的镜头、并通过针孔成像和电子转化而成为像素点的。
3.畸变矩阵。告诉你为什么上面那个像素点并没有落在理论计算该落在的位置上,还tm产生了一定的偏移和变形!!!
好了,到这里是不是明白了一点?上述3点的每一个转换,都有已经有成熟的数学描述,通过计算,我们完全可以精确地重现现实世界的任意一个点到其数字图像上对应像素点的投影过程。
对于双目视觉系统,通过立体标定还能进一步得到下面的参数:
通过结构参数,便能把左右摄像机获取的图像的每一个像素点之间的关系用数学语言定量描述,保证两个相机都处于我们“可求”的状态。
总的来说,摄像机标定是通过寻找对象在图像与现实世界的转换数学关系,找出其定量的联系,从而实现从图像中测量出实际数据的目的。
当然,其实上述的各个转换过程大部分都不需要用户自己一个个写程序实现,比如opencv就集成了单目标定函数calibracamera()、畸变校正函数undistortinitialmap()、双目标定函数stereocalibrate()……
其实自己亲自走一遍流程就很容易领会到整个视觉测量的逻辑。比如说,在畸变校正中需要用到单目标定的畸变参数输出和内参数输出,在双目标定中需要用到单目标定的外参数输出,在外极线校准中需要用到双目标定的结构参数输出,在立体匹配中中需要用到外极线校准的输出参数,在三维反求中需要用到立体匹配的输出参数。用户自己走完一遍这个流程,基本上就发现没有做标定的话,几乎什么都干不了。
什么是相机标定?
1:相机标定含义(解决什么是相机标定)
在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。
基本的坐标系:
- 世界坐标系(world coordinate system);
- 相机坐标系(camera coordinate system);
- 图像坐标系(image coordinate system);
一般来说,标定的过程分为两个部分:
- 第一步是从世界坐标系转换为相机坐标系,这一步是三维点到三维点的转换,包括 R,t (相机外参)等参数;
- 第二部是从相机坐标系转为图像坐标系,这一步是三维点到二维点的转换,包括 K(相机内参)等参数;
相机坐标系 转换到 图像坐标系
坐标系介绍
如上图所示(图片来自UIUC计算机视觉课件),是一个小孔成像的模型,其中:
- C 点表示
camera centre
,即相机的中心点,也是相机坐标系的中心点; - Z 轴表示
principal axis
,即相机的主轴; - p 点所在的平面表示
image plane
,即相机的像平面,也就是图片坐标系所在的二维平面; - p 点表示
principal point
,即主点,主轴与像平面相交的点; - C 点到 p 点的距离,也就是右边图中的 f 表示
focal length
,即相机的焦距; - 像平面上的 x 和 y 坐标轴是与相机坐标系上的 X 和 Y 坐标轴互相平行的;
- 相机坐标系是以 X, Y, Z(大写)三个轴组成的且原点在 C 点,度量值为米(
m
); - 像平面坐标系是以 x,y(小写)两个轴组成的且原点在 p 点,度量值为米(
m
); - 图像坐标系一般指图片相对坐标系,在这里可以认为和像平面坐标系在一个平面上,不过原点是在图片的角上,而且度量值为像素的个数(
pixel
);
相机 转换到 像平面
知道上面的简单知识后,如果知道相机坐标系中的一个点 X(现实三维世界中的点),在像平面坐标系对应的点是 x,要求求从相机坐标系转为像平面坐标系的转换,也就是从 X 点的(X,Y,Z)通过一定的转换变为 x 点的(x,y)。注意:(X,Y,Z)(大写)是在相机坐标系,而(x,y)(小写)是在像平面坐标系(还不是图像坐标系,原点不同。)观察第二个图,很简单的可以得到这个转换:
x=fX/Zy=fY/Z(X,Y,Z)?(fX/Z,fY/Z)
可以表示为矩阵计算为(在这里用的是齐次坐标的表示方式,关于齐次坐标文章最下面有介绍):
?????XYZ1?????????fXfYZ???=???ff1000????????XYZ1?????
可以简写为(P 就是所谓的投影矩阵,当然现在还不完整):
x=PX
加入偏移量
通过上面,可以把相机坐标系转换到像平面坐标系,但是像平面坐标系和图像坐标系虽然在同一个平面上,但是原点并不是同一个,而目标是要转换到图像坐标系下,所以还需要一步操作,如下图:
如上图所示(图片来自UIUC计算机视觉课件),其中主点 p 是像平面坐标系的原点,但在图像坐标系中的位置为(px,py),在这里,图形坐标系的原点是图片的左下角,所以可以得到:
(X,Y,Z)?(fX/Z+px,fY/Z+py)
相当于在上面的基础上加了一个p
点坐标的偏移量,同时可以表示为矩阵计算为(在这里用的是齐次坐标的表示方式):
?????XYZ1?????????fX+ZpxfY+ZpyZ???=???ffpxpy1000????????XYZ1?????
整理一下得:
???fX+ZpxfY+ZpyZ???=???ffpxpy1??????111000????????XYZ1?????
所以最后可以得到 K,也就是平时所说的相机内参(Intrinsic parameters
):
K=???ffpxpy1???
以及投影矩阵 P(在这里可以认为旋转矩阵 R 为单位矩阵 I,平移矩阵 t 都为0,这也是为什么要拆成这种方式),为:
P=K[I0]
像素坐标
前面也提到了在图像坐标系中用的不是现实生活中的m
来度量,而是用的 pixel
的个数,所以在上面转换到图像坐标系中还有个问题,就是坐标的表示还是m
,并没有转换到像素坐标系统;在这里需要引入一个新概念就是:
- mx 表示在水平方向
1m
的长度包含的像素的个数; - my 表示在竖直方向
1m
的长度包含的像素的个数;
可能有人奇怪为啥不是一个值,还需要分别指定 mx 和 my 呀,这是因为通过上面可以得到一个像素点的大小(m
度量)为:
1mx×1my
但是需要说明的是像素并不一定是一个正方形,有时候可能也是一个矩形,所以要分别指定。
所以可以把上面相机内参 K 变为更新为,转换公式把 K 替换即可,其他不变:
K=???mxmy1??????ffpxpy1???=???αxαyβxβy1???
一般来说,在使用相机内参K
计算坐标系转换时,提供的都是已经变换后的值;例如会提供 fx,fy ,cx,cy 四个值代表相机内参K,其实 fx 就是这里的 αx,同理 fy 是 αy,cx 是 βx,cy 是 βy。
世界坐标系 转换到 图像坐标系
坐标系介绍
如上图所示(图片来自UIUC计算机视觉课件),从世界坐标系转换到相机坐标系是三维空间到三维空间的变换,一般来说需要一个平移操作和一个旋转操作就可以完成这个转换,用公式表示如下(可以理解为世界坐标系原点先平移到相机坐标系的位置然后在做一次坐标系旋转,使坐标轴对齐。):
X?cam=R(X??C?)
- R 表示旋转矩阵;
- X? 表示 X 点在世界坐标系中的位置;
- C? 表示相机原点 C 在世界坐标系中的位置;
- X?cam 表示 X 点在相机坐标系中的位置;
世界 转换到 相机
根据上面的公式可以得到从一个三维点从世界坐标系转换到相机坐标的变换公式如下(也是用的齐次坐标的表示方式):
Xcam=(X?cam1)=[R0?RC?1](X?1)=[R0?RC?1]X
世界 转换到 图像
根据上面的讨论知道了怎样从世界坐标系转换到相机坐标系(平移和旋转)以及从相机坐标系转换到图像坐标系(相机内参变换),所以带入上面的矩阵计算,可以得到:
x=K[I0]Xcam=K[R?RC?]X
这样就得到了最终的投影矩阵 P :
P=K[Rt]
其中:
t=?RC?
在这里,K 一般称为相机内参(intrinsic parameters
),描述了相机的内部参数,包括焦距 f、主点 p的位置、以及像素与真实环境的大小比例等,这个是固有属性,是提供好的;R 和 t 称为相机外参(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
):
径向畸变可以用如下公式修正:
xcorr=xdis(1+k1r2+k2r4+k3r6)
ycorr=ydis(1+k1r2+k2r4+k3r6)
切向畸变(tangential distortion
)
切向畸变是由于透镜与成像平面不严格的平行,其可以用如下公式修正:
xcorr=xdis+[2p1xy+p2(r2+2x2)]
ycorr=ydis+[p1(r2+2y2)+2p2xy]
其中:
- xdis 和 ydis 表示有畸变的坐标;
- xcorr 和 ycorr 表示修复后的坐标;
- k1,k2,k3 表示径向畸变参数;
- p1,p2 表示切向畸变参数;
所以最终得到5个畸变参数:
D=(k1,k2,p1,p2,k3)
相机标定
2:相机标定意义(解决为什么要进行相机标定)
计算机视觉的基本任务之一是从摄像机获取的图像信息出发计算三维空间中物体的几何信息,并由此重建和识别物体,而空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系是由摄像机成像的几何模型决定的,这些几何模型参数就是摄像机参数。在大多数条件下,这些参数必须通过实验与计算才能得到。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。
3:相机标定的方法(解决如何进行相机标定)
摄像机相对于世界坐标系的方位。标定精度的大小,直接影响着计算机视觉(机器视觉)的精度。迄今为止,对于摄像机标定问题已提出了很多方法,摄像机标定的理论问题已得到较好的解决,对摄像机标定的研究来说,当前的研究工作应该集中在如何针对具体的实际应用问题,采用特定的简便、实用、快速、准确的标定方法。