

上图中,提到了世界坐标系在张正友标定法中的设计,可以理解为将世界坐标系的原点放到了棋盘格左上角点的位置,并且棋盘格平面上所有点的Z为0,将Z规定为0的话,可以简化掉一个维度(列向量r3)。去掉列向量r3的影响后,实际可以得到如下红框关系:

从这两个红框可以看出,去掉了Z这个维度影响后,整个运算相当于是从一个2D平面到另一个2D平面的变换,因此我们可以联想到先找到一个单应矩阵H。通过这个单应矩阵H建立和相机内外参的关联,当采集到足够多的点后,就能得到对应标定参数了。

上图中,将H矩阵写成列向量形式后,可以看到, 对这两个等式,左右两边分别乘上
, 可以得到r1, r2的表达式:

r1和r2是正交的,因此可以得到两个约束条件:

将r1,r2用K,h1, h2表示出来就是:

替换后的这两个等式,只包含单应矩阵的列向量和K(相机内参),h1, h2可以通过已知的世界坐标系的点和相机观测到的像素点得到单应矩阵后拿到,因此求解出K就能得到相机内参。

矩阵B定义出来相当于是一个中间变量,用来指代两个等式中重复的元素,它是一个对称矩阵,矩阵大小是3x3,因此只需要用一个6维向量b就能表示出来。

对于单应矩阵H,列向量h1,h2表示为

这里的对应列向量的三个元素值。通过计算
,可以得到如下等式

有了这个等式,就可以回到之前所说的两个约束条件得到的等式中去了。用B替换(严格意义上
),可以得到
, 以及
, 用上面的等式,将
替换成
的形式,整理后可得:

上面的等式其实是一个2x6的矩阵(V)和一个6x1的向量(b)组成的线性方程组。每采集一副影像,就能得到两个方程。因此有n幅图像就有2n个等式。

b向量里的值是我们要求解的,总共有6个元素(6个未知数),因此理想情况下,3张图像就能得到6个方程,就能求解出内参矩阵了。对于Vb=0的求解,有两种方式:

得到内参后,外参计算可以按照下面的等式:


重投影误差的示意图如下:

重投影误差可以理解为,我们找到了投影矩阵M,也有实际观测到的世界坐标系下的X点,以及在相平面上实际观测到的x点。通过将X点使用M进行变换,可以得到一个计算点,算出它和观测点x之间的差异,这个差异就是重投影误差。重投影误差是有实际物理意义的,我们如果找到了使得重投影误差最小的内外参数,就能保证我们得到的标定结果是最优的。


实际案例:

如上图,在拍摄到的图像中找到棋盘格的角点,然后将检测到的角点的世界坐标都算出来,记录拍摄图像上的角点的实际位置,然后将相关信息传给校准的API,得到校准结果,校准结果示例如下:

关于张正友标定法原理详细推导,可以参考如下链接: