写在开头:本人视觉小白,项目需要学习相机标定相关的知识,网上相关博客和教程很多但也很杂,所以还是想从自己的思路来整理一遍,以备后面回顾学习。
1.相机标定是什么?
说到相机标定,就要先说什么是传感器的标定。我们知道,任何传感器,它都是存在有误差的,那么狭义上说,标定就是去校正这部分误差,让传感器尽量准确一点。其次,当涉及到两个或者多个传感器的标定的时候,往往还包括计算出这些传感器间的相互位置关系。
概括一下,常说的标定包括两部分内容:传感器误差的校正、传感器相互之间的位置关系。(此处的内容更可能不太容易理解,没关系往下看),我们常说的单目标定就是第一种,常用的标定方法就是著名的张正友标定法。
2.为什么要进行相机标定?
相机标定的目的有两个:
- 第一,要还原摄像头成像的物体在真实世界的位置就需要知道世界中的物体到计算机图像平面是如何变换的,相机标定的目的之一就是为了搞清楚这种变换关系,求解内外参数。
- 第二,摄像机的透视投影有个很大的问题——畸变。摄像头标定的另一个目的就是求解畸变系数,然后用于图像矫正。
3.怎样进行相机标定?
相机标定方法有:传统相机标定法、主动视觉相机标定方法、相机自标定法。(重点是第一种,后面两种了解即可)
传统相机标定法需要使用尺寸已知的标定物,通过建立标定物上坐标已知的点(世界坐标)与其图像点(像素坐标)之间的对应,利用一定的算法获得相机模型的内外参数。根据标定物的不同可分为三维标定物和平面型标定物。三维标定物可由单幅图像进行标定,标定精度较高,但高精密三维标定物的加工和维护较困难。平面型标定物比三维标定物制作简单,精度易保证,但标定时必须采用两幅或两幅以上的图像。传统相机标定法在标定过程中始终需要标定物,且标定物的制作精度会影响标定结果。同时有些场合不适合放置标定物也限制了传统相机标定法的应用。
目前出现的自标定算法中主要是利用相机运动的约束。相机的运动约束条件太强,因此使得其在实际中并不实用。利用场景约束主要是利用场景中的一些平行或者正交的信息。其中空间平行线在相机图像平面上的交点被称为消失点,它是射影几何中一个非常重要的特征,所以很多学者研究了基于消失点的相机自标定方法。自标定方法灵活性强,可对相机进行在线定标。但由于它是基于绝对二次曲线或曲面的方法,其算法鲁棒性差。
基于主动视觉的相机标定法是指已知相机的某些运动信息对相机进行标定。该方法不需要标定物,但需要控制相机做某些特殊运动,利用这种运动的特殊性可以计算出相机内部参数。基于主动视觉的相机标定法的优点是算法简单,往往能够获得线性解,故鲁棒性较高,缺点是系统的成本高、实验设备昂贵、实验条件要求高,而且不适合于运动参数未知或无法控制的场合。
OK,我们大致知道了传统相机标定法的原理,那么接下来我们该思考,如何来建立标定板上的点和像素点之间的对应关系呢?也就是如何用一个简化的数学模型来代表复杂的三维到二维的成像过程?这就需要我们通过建立相机模型来进行分析,也就是标定过程中的最核心的部分。
4.相机模型
【此处参考原文链接:https://blog.csdn.net/Aoulun/article/details/104780993】
前面我们知道了标定的主要目的是为了建立摄像机图像像素位置与物体空间位置之间的关系,即世界坐标系与像素坐标系之间的关系。而这些关系里面主要有两种模型需要解算:小孔成像模型与畸变模型,其中前者是线性的,后者是非线性的。
4.1小孔成像模型
问:为什么小孔到像平面的距离是焦距,为什么要搞一个虚拟像平面?
第一篇博客中已经说过,像平面就是成像的位置,这个是用户自己设定的,就是CCD传感器的位置,而焦平面就是镜头的焦距所在平面。当像平面刚好和焦平面重合时,此时所成的像是最清晰的。也就是我们经常说的“刚好对焦上了”。我们用一个图来说明。
实际上,由于物理条件的限制,像平面和焦平面是不可能完全重合的。如果改变了镜头的形状和尺寸,那么焦平面的位置也会发生变化。对焦的时候就需要重新调整CCD的位置,使其与焦平面重合。这解释了为什么是焦距。
我们还是用上面的小孔成像简化图来说明。因为真正的像平面所成的像是倒立的,而我们实际中,更习惯于正立的看待问题,所以就用虚拟的像平面代替真正的像平面。如果不做特殊说明,我们在下面的描述中,就用像平面代替虚拟像平面。相应的,成像简化图就变为如下所示。
数学表示如下:
问题又来了,三维中的点是如何投影到像平面?如果我知道三维中的一个点,能计算到它投影到像平面的哪个像素吗?
为了解决这个问题,我们就必须定义坐标系。一个坐标系是不够的,需要多个坐标系同时使用。下面我们就来详细认识一下各个坐标系以及之间的转换关系。
4.1.1坐标系变换
首先可以看个总体图来初步认识各个坐标系之间的关系。
理解四个坐标系是进行相机标定的基础,它们是:
- 图像像素坐标系
- 图像物理坐标系
- 相机坐标系
- 世界坐标系
(1)图像像素坐标系、图像物理坐标系
- 图像像素坐标系:其原点O位于图像的左上角,𝑢、𝑣坐标轴分别与图像的两条边重合。像素坐标为离散值(0,1,2...),以像素(pixel)为单位。像素的横坐标u与纵坐标𝑣分别是在其图像数组中所在的列数与所在行数。由于(𝑢,𝑣)只代表像素的列数和行数,而像素在图像中的位置并没有用物理单位表示出来,所以,我们还要建立以物理单位(如毫米)表示的图像坐标系𝑥-𝑦。
- 图像物理坐标系:为了将图像与物理空间相关联,需要将图像转换到物理坐标系下。原点O 位于图像中心(理想状态下),是相机光轴与像平面的交点(称为主点)。x,y坐标轴分别与𝑢、𝑣轴平行。两坐标系实为平移关系,平移量为(𝑢0,𝑣0)。𝑑𝑥与𝑑𝑦分别表示每个像素在横轴𝑥和纵轴𝑦上的物理尺寸。
(1-1 )图像坐标系到像素坐标系的转换关系(平移+单位缩放)
则图像中的每个像素在𝑢-𝑣坐标系中的坐标和在𝑥-𝑦坐标系中的坐标之间都存在如下的关系:
扩展【解释为何要使用齐次坐标】:相机参数标定(camera calibration)及标定结果如何使用_单目相机内参标定结果怎么看-CSDN博客上面的矩阵公式运用了齐次坐标,初学者可能会感到有些迷惑。大家会问:怎样将普通坐标转换为齐次坐标呢?齐次坐标能带来什么好处呢?这里对齐次坐标做一个通俗的解释。此处只讲怎么将普通坐标改写为齐次坐标及为什么引入齐次坐标。这里只做一个通俗但不太严谨的表述。力求简单明了。针对齐次坐标的严谨的纯数学推导,可参见“周兴和版的《高等几何》---1.3拓广平面上的齐次坐标”。玉米曾详细读过《高等几何》这本书,但觉得离计算机视觉有点远,是讲纯数学的投影关系的,较为生涩难懂。
齐次坐标可以理解为在原有坐标后面加一个“小尾巴”。将普通坐标转换为齐次坐标,通常就是在增加一个维度,这个维度上的数值为1。如图像坐标系(u,v)(𝑢,𝑣)转换为(u,v,1)(𝑢,𝑣,1)一样。对于无穷远点,小尾巴为0。注意,给零向量增加小尾巴,数学上无意义。
那么,为什么计算机视觉在坐标运算时要加上这个“小尾巴”呢?
- 将投影平面扩展到无穷远点。如对消隐点(vanishing point)的描述;
- 使得计算更加规整;
如果用普通坐标来表达的话,会是下面的样子:
这样的运算形式会给后面的运算带来一定的麻烦,所以齐次坐标是一个更好的选择。
齐次坐标还有一个重要的性质,伸缩不变性。即:设齐次坐标𝑀,则α𝑀=𝑀。
(2)相机坐标系
相机坐标系也是一个三维直角坐标系,原点位于镜头光心处,Xc、Yc轴分别与像面的两边平行,z轴为镜头光轴,与像平面垂直。
(2-1)相机坐标系到图像坐标系的转换关系
首先,让我们来看一下透视投影是如何将相机坐标系与图像坐标系联系起来的吧。这里,先对透视投影做一个介绍:
透视投影(perspective projection): 用中心投影法将形体投射到投影面上,从而获得的一种较为接近视觉效果的单面投影图。有一点像皮影戏。它符合人们心理习惯,即离视点近的物体大,离视点远的物体小,不平行于成像平面的平行线会相交于消隐点(vanish point)
点(Xc,Yc,Zc)为空间中任意一点,其通过投影中心的光线投影到图像平面上,在图像物理空间的投影点为p(x,y),扩展到相机坐标系下其坐标为(x,y,f)。根据相似三角形原理,有:
转为齐次形式为:
该式完成了相机坐标系到图像坐标系的转换关系。
(3)世界坐标系
世界坐标系也称为测量坐标系、参考坐标系,是一个三维直角坐标系,以其为基准可以描述相机和待测物体的空间位置。世界坐标系的位置可以根据实际情况自由确定。
(3-1)世界坐标系到相机坐标系的转换关系
世界坐标系到相机坐标系的变换,实际上就是一个刚体变换,可以由旋转矩阵 R 和平移矢量 t 来表示。首先,让我们来看一下刚体变换是如何将世界坐标系与图像坐标系联系起来的吧。这里,先对刚体变换做一个介绍:
刚体变换(regidbody motion):三维空间中,当物体不发生形变时,对一个几何物体作旋转, 平移的运动,称之为刚体变换。
因为世界坐标系和摄像机坐标都是右手坐标系,所以其不会发生形变。我们想把世界坐标系下的坐标转换到摄像机坐标下的坐标。空间中一个坐标系,总可以通过刚体变换转换到另外一个坐标系。
对应的其次表达式为:
其中,R是3×3的正交单位矩阵(即旋转矩阵),t为平移向量,R、t与摄像机无关,所以称这两个参数为摄像机的外参数(extrinsic parameter),可以理解为两个坐标原点之间的距离,因其受𝑥,𝑦,𝑧三个方向上的分量共同控制,所以其具有三个自由度。
(4)总结
通过前面的几个步骤,我们已经得到了各个坐标系之间的相互转换关系(不考虑畸变):
进一步的就可以得到从像素坐标系到世界坐标系的变换关系:
进一步化简:
这个公式就是整个单目相机在理想情况下的成像公式,可以建立世界坐标系到像素坐标系的一一映射。
OK,到此我们就清楚的了解了相机标定的第一个目的---求解内外参数 以及 之间的转换关系。
4.2畸变模型
上面提到的过程是理想情况下世界坐标系到像素坐标系的转换。我们在相机坐标系到图像坐标系变换时谈到透视投影。摄像机拍照时通过透镜把实物投影到像平面上,但是透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。因此我们需要考虑成像畸变的问题。透镜的畸变主要分为径向畸变和切向畸变,还有薄透镜畸变等等,但都没有径向和切向畸变影响显著,所以我们在这里只考虑径向和切向畸变。
4.2.1径向畸变
径向畸变原因:在相机制造过程中,很难保证镜头的厚度完全均匀,由于制造工艺的原因,通常为这种情况为中间厚、边缘薄,因而光线在远离透镜中心的地方,会发生更大程度的扭曲,这种现象在鱼眼相机(桶形畸变)中尤为明显。
径向畸变主要有两种类型:枕型畸变和桶型畸变,示意图如下:
像平面中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。畸变的数学模型可以用主点(principle point)周围的泰勒级数展开式的前几项进行描述,通常使用前两项,即𝑘1和𝑘2,对于畸变很大的镜头,如鱼眼镜头,可以增加使用第三项𝑘3来进行描述,成像仪上某点根据其在径向方向上的分布位置,调节公式为:
式中(𝑥0,𝑦0)是畸变点在像平面的原始位置,(𝑥,𝑦)是畸变较正后新的位置。
4.2.2切向畸变
切向畸变是由于透镜本身与相机传感器平面(像平面)或图像平面不平行而产生的,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致。畸变模型可以用两个额外的参数𝑝1和𝑝2来描述:
4.2.3合并考虑
径向畸变和切向畸变模型中一共有5个畸变参数,在Opencv中他们被排列成一个5×15×1的矩阵,依次包含𝑘1、𝑘2、𝑝1、𝑝2、𝑘3,经常被定义为Mat矩阵的形式,如Mat distCoeffs=Mat(1,5,CV_32FC1,Scalar::all(0));这5个参数就是相机标定中需要确定的相机的5个畸变系数。求得这5个参数后,就可以校正由于镜头畸变引起的图像的变形失真,
将径向畸变和切向畸变合并,只需要将两个畸变矫正直接加起来即可,公式如下:
𝑘1、𝑘2、𝑘3为径向畸变;𝑝1、𝑝2为切向畸变。
合并考虑畸变原因:其实也很简单,两种畸变是同时发生在成像过程中的,发生的原因也是相互独立的,而且也都是关于距离的表达式,你似乎也找不到更好的方式来综合考虑这两种误差,实践证明,这种合并考虑畸变的情况效果还不错,
下图显示根据镜头畸变系数校正后的效果:
5.总结
通过上面的推导,我们可以总结一下,要实现从物空间任意一点到相机图像的投影我们需要计算得到哪些参数:
利用相机标定的算法(张正友标定法),我们可以求解出这些参数,从而可以实现从像到物或从物到像的相互映射。
6.相关问题及知识点补充
常用术语:
内参矩阵: Intrinsic Matrix
焦距: Focal Length
主点: Principal Point
径向畸变: Radial Distortion
切向畸变: Tangential Distortion
旋转矩阵: Rotation Matrices
平移向量: Translation Vectors
平均重投影误差: Mean Reprojection Error
重投影误差: Reprojection Errors
重投影点: Reprojected Points
①单目相机标定最少需要几张图?
②
7.参考文章
第二更,相机参数标定基础:从小孔成像开始到单双目标定_小孔成像相机参数设置-CSDN博客
第六节、双目视觉之相机标定 - 大奥特曼打小怪兽 - 博客园 (cnblogs.com)