标定为了做什么——我们肯定都或多或少地想过,我们能不能用一张图片就能知道图片中物体的尺寸。下一步我们会想如何得到尺寸呢?我们用勾股定理,只要我们知道距离就行。那么知道了相机到图像的距离和相机自身的焦距后就可以了么?显然这么做是没有精度可言的,因此相机标定就应运而生了。
1.首先明确一个概念,相机标定不是一劳永逸的,每次参数的改变都需要对相机重新标定。改变包括(焦距,定焦环,光圈和世界坐标的位置关系。)
2.摄像机虽然结构复杂,但有时候可以等效于针孔模型(小孔成像),在精度要求较高时,便不能直接进行等效替换。
3.当相机参数在使用过程会发生变化时,需要进行实时标定,方法有两种:①场景内存在标定块;②设备可以自定标(无需标定块)。

4.坐标系统:图像坐标系、摄像机坐标系、世界坐标系。

单位:图像坐标系是像素点,摄像机和世界的都是毫米。

张友正标定法 python 张友正相机标定_张友正标定法 python


图中可以清晰地看出我们的图像坐标系是由两个坐标系统组成的:像素坐标和物理坐标,像素坐标的单位是像素个数,物理坐标的单位是毫米。像素坐标原点是图像的左上角,这点和matlab定义是一样的,但是有一个需要注意,matlab是先行后列,就是(行数,列数),而此处定义的坐标是(列数,行数),这样定义是为了和x,y统一(u,v)和(x,y)。包括在matlab中,我都比较喜欢使用(y,x)这样定义索引。

这里引入矩阵是为了后面更好操作,如果不觉得麻烦,使用方程组也是可以的。

那个第二个矩阵用的比较多,因为我们很多情况下是知道一张图的像素坐标的,因为我们可以通过变换得到我们使用的物理坐标(01,x,y)。而这个也只是中间过程,最终我们达到的效果就是从图中像素点对应到实际物体中。这里我们引入摄像机坐标系后,其实我们已经可以确定物体与图像之间的关系了。其中Zc为摄像机光心,垂直于成像面;O~O1之间的线段为f,相机的焦距(这个焦距和我们调镜头的焦距以及图片信息里面的焦距是不同的)。

到这里,我们可以设想一下,我们想要描述一个物体和相机的相对位置关系,那么我们怎么知道包括相机在内的所有物体的坐标呢?这个坐标是需要统一的。因此引入世界坐标系,上升到两个坐标系的变化,求一个坐标系下的一个物体在另一个坐标系下的坐标,只需要进行坐标系的变换,既旋转和平移。

张友正标定法 python 张友正相机标定_世界坐标_02


这里的变换是利用中心投影(其实就是最简单的三角形关系),实现摄像机坐标与图像坐标的对应。Zc放到了方程以外,可知Zc在变换过程中不起作用,因此在这一步还没有解决点具体对应到多远的物体。

张友正标定法 python 张友正相机标定_世界坐标_03


其实我们比较简单地能够看出,我们摄像机坐标系的每一个轴都是由世界坐标的三个轴上经过旋转和平移来得到的。这里不用纠结具体为什么的原因,因为那又是另一门学问了。

张友正标定法 python 张友正相机标定_张友正标定法 python_04


内参和外参作为我们标定的最终数值,十分有用。内参是摄像机内部的参数,和外界无关;外参是摄像机坐标系和世界坐标系的关系。我们先细想一下,我们已知了世界坐标系,我们就可以通过上面的变化,得到图像坐标u,v,然而我们从u,v反推时,在不知道Zc的情况下,我们是得不到世界坐标系的。这也就说明了图像坐标可以按照变换反应为一条线,而点具体在线的什么部分是未知的。这一点可以看出两边在运算时可以将Zc消去,当然也可以乘以一个Zc。求参数——

上面我们已经建立了三个坐标系之间的关系,之后我们需要求出我们在这中间的一些未知参数。

首先我们按我之前提到的“输入输出”分析法进行分析一下。

输入:多组(世界坐标+像素坐标)

输出:方程中多个未知参数

此类问题为:多组数据求多个参数,数据远超方程个数,因此采用拟合的方法——最小二乘法。

①化简

我们直接用上面的矩阵进行求解肯定是非常费事的,因此这里有简化过程,直接把整个过程看成一个整体,也就是一个3X4的矩阵。

张友正标定法 python 张友正相机标定_世界坐标系_05


上面就是我们化简的结果,可以看出最终剩下了两个式子,12个未知数。

张友正标定法 python 张友正相机标定_张友正标定法 python_06


我们有11个未知量,需要11个方程组就能求解,也就是6个点(每个点对应两个方程组,每个点有图像像素值和世界坐标值)就可以求解了。

求解完成之后,我们就可以根据之前的公式进行反求解了,求解出内参和外参。

注意:

①上面的M求解完成后我们拥有了十一个未知数的解;我们的原内参独立变量有4个,外参R和t独立变量有6个,总共为十个变量。可以看出我们求的M内部的十一个变量,有一些是有一些内在联系的,因此此处需要格外注意。

先写到这,等下次更新。