Python教程

学习(1)相机标定之张正友标定法数学原理详解(含python源码)

本文主要是介绍学习(1)相机标定之张正友标定法数学原理详解(含python源码),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

https://zhuanlan.zhihu.com/p/94244568

 

一、相机标定的目的

我们首先要明白两个问题:1、相机是如何成像的?2、相机标定的目的是什么?

1、相机是如何成像的呢?

相机成像系统中,共包含四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。对于这四个坐标系中之间的关系还不太明白成像原理的同学需要先查一查学习一下。

这四个坐标系之间的转化关系为:

其中, [公式] 为在世界坐标系下一点的物理坐标, [公式] 为该点对应的在像素坐标系下的像素坐标, [公式] 为尺度因子。

我们将矩阵:

[公式]

称为相机的内参矩阵,内参矩阵取决于相机的内部参数。其中, [公式] 为像距, [公式] 分别表示 [公式] 方向上的一个像素在相机感光板上的物理长度(即一个像素在感光板上是多少毫米), [公式] 分别表示相机感光板中心在像素坐标系下的坐标, [公式] 表示感光板的横边和纵边之间的角度( [公式] 表示无误差)。

我们将矩阵: [公式] 称为相机的外参矩阵,外参矩阵取决于相机坐标系和世界坐标系的相对位置, [公式] 表示旋转矩阵, [公式] 表示平移矢量。

即单点无畸变的相机成像模型如下:

[公式]

2、相机标定的目的是什么?

为什么要进行相机标定呢?比如,当我们拿到一张图片,进行识别之后,得到的两部分之间的距离为多少多少像素,但是这多少多少像素究竟对应实际世界中的多少米呢?这就需要利用相机标定的结果来将像素坐标转换到物理坐标来计算距离(当然这里值得说明,仅仅利用单目相机标定的结果,是无法直接从像素坐标转化到物理坐标的,因为透视投影丢失了一个维度的坐标,所以测距其实需要双目相机)。

相机标定的目的其实很简单,我们要想对一个成像系统建模,进而进行相应的计算,所必须的参数就是相机的内参矩阵: [公式] 和相机的外参矩阵 [公式] ,因此,相机标定的第一个目的就是获得相机的内参矩阵和外参矩阵。

 

 

3、畸变与畸变矫正

另外,相机拍摄的图片还存在一定的畸变,畸变包括桶形畸变和枕形畸变。对于畸变原理还不太明白的同学需要先查一查学习一下。

畸变模型包括径向畸变和切向畸变。

径向畸变公式(3阶)如下:

[公式]

切向畸变公式如下:

[公式]

其中,[公式]分别为理想的无畸变的归一化的图像坐标、畸变后的归一化图像坐标, 为图像像素点到图像中心点的距离,即 [公式] 。

相机标定的第二个目的就是获得相机的畸变参数,如上式中的 [公式]等,进而对拍摄的图片进行去畸变处理。

二、张正友标定法简介

张正友标定法利用如下图所示的棋盘格标定板,在得到一张标定板的图像之后,可以利用相应的图像检测算法得到每一个角点的像素坐标 [公式] 。

张正友标定法将世界坐标系固定于棋盘格上,则棋盘格上任一点的物理坐标 [公式],由于标定板的世界坐标系是人为事先定义好的,标定板上每一个格子的大小是已知的,我们可以计算得到每一个角点在世界坐标系下的物理坐标[公式]

我们将利用这些信息:每一个角点的像素坐标 [公式] 、每一个角点在世界坐标系下的物理坐标[公式],来进行相机的标定,获得相机的内外参矩阵、畸变参数。

三、标定相机的内参矩阵和外参矩阵

张正友标定法标定相机的内外参数的思路如下:

1)、求解内参矩阵与外参矩阵的积;

2)、求解内参矩阵;

3)、求解外参矩阵。

1、求解内参矩阵与外参矩阵的积

将世界坐标系固定于棋盘格上,则棋盘格上任一点的物理坐标 [公式] ,因此,原单点无畸变的成像模型可以化为下式。其中, [公式] 为旋转矩阵 [公式] 的前两列。为了简便,将内参矩阵记为 [公式] 。

[公式]

我们对于上式做一定的说明。对于不同的图片,内参矩阵[公式] 为定值;对于同一张图片,内参矩阵[公式],外参矩阵 [公式] 为定值;对于同一张图片上的单点,内参矩阵[公式],外参矩阵 [公式],尺度因子 [公式] 为定值。

我们将 [公式] 记为矩阵 [公式] , [公式] 即为内参矩阵和外参矩阵的积,记矩阵 [公式] 的三列为 [公式] ,则有:

[公式]

利用上式,消去尺度因子 [公式],可得:(此处感谢 

@wx61637761f416747d

 科学严谨的态度终于解决了我关于尺度因子的矛盾之处)

 

[公式]

此时,尺度因子 [公式]已经被消去,因此上式对于同一张图片上所有的角点均成立。[公式] 是像素坐标系下的标定板角点的坐标, [公式] 是世界坐标系下的标定板角点的坐标。通过图像识别算法,我们可以得到标定板角点的像素坐标[公式],又由于标定板的世界坐标系是人为定义好的,标定板上每一个格子的大小是已知的,我们可以计算得到世界坐标系下的[公式]

由这里的 [公式] 是齐次矩阵,有8个独立未知元素。每一个标定板角点可以提供两个约束方程( [公式] 的对应关系、 [公式] 的对应关系提供了两个约束方程),因此,当一张图片上的标定板角点数量等于4时,即可求得该图片对应的矩阵 [公式] 。当一张图片上的标定板角点数量大于4时,利用最小二乘法回归最佳的矩阵 [公式]

2、求解内参矩阵

我们已知了矩阵 [公式] ,接下来需要求解相机的内参矩阵 [公式] 。

 

我们利用[公式]作为旋转矩阵 [公式] 的两列,存在单位正交的关系,即:

[公式]

则由 [公式] 和 [公式] 的关系,可知:

[公式]

代入可得:

[公式]

另外,我们发现,上述两个约束方程中均存在矩阵 [公式] 。因此,我们记[公式] ,则 [公式]为对称阵。我们试图先求解出矩阵 [公式] ,通过矩阵 [公式] 再求解相机的内参矩阵 [公式] 。

同时,为了简便,我们记相机内参矩阵 [公式] 为:

[公式]

则:

[公式]

则用矩阵 [公式]表示矩阵 [公式] 得:

[公式]

注意:由于[公式]为对称阵,上式出现了两次 [公式] 。

这里,我们可以使用 [公式] 将前面通过 [公式] 单位正交得到的约束方程化为:

[公式]

因此,为了求解矩阵[公式] ,我们必须计算 [公式] 。则:

[公式]

上述方程看起来有点复杂,但是其实不然,我们可以记:

[公式]

则上述方程化为: [公式]

此时,通过 [公式] 单位正交得到的约束方程可化为:

[公式]

即:

[公式]

其中,矩阵 [公式]

由于矩阵 [公式] 已知,矩阵 [公式] 又全部由矩阵 [公式] 的元素构成,因此矩阵[公式]已知。

此时,我们只要求解出向量 [公式] ,即可得到矩阵 [公式] 。每张标定板图片可以提供一个 [公式] 的约束关系,该约束关系含有两个约束方程。但是,向量 [公式] 有6个未知元素。因此,单张图片提供的两个约束方程是不足以解出来向量 [公式]。因此,我们只要取3张标定板照片,得到3个[公式] 的约束关系,即6个方程,即可求解向量 [公式]。当标定板图片的个数大于3时(事实上一般需要15到20张标定板图片),可采用最小二乘拟合最佳的向量 [公式] ,并得到矩阵 [公式]

[公式]

根据矩阵 [公式] 的元素和相机内参 [公式] 的对应关系(如上式),可得到:

[公式]

即可求得相机的内参矩阵 [公式] 。

3、求解外参矩阵

这里再次强调一下,对于同一个相机,相机的内参矩阵取决于相机的内部参数,无论标定板和相机的位置关系是怎么样的,相机的内参矩阵不变。这也正是在第2部分“求解内参矩阵”中,我们可以利用不同的图片(标定板和相机位置关系不同)获取的矩阵 [公式] ,共同求解相机内参矩阵 [公式] 的原因。

但是,外参矩阵反映的是标定板和相机的位置关系。对于不同的图片,标定板和相机的位置关系已经改变,此时每一张图片对应的外参矩阵都是不同的。

在关系: [公式] 中,我们已经求解得到了矩阵 [公式] (对于同一张图片相同,对于不同的图片不同)、矩阵 [公式] (对于不同的图片都相同)。通过公式: [公式] ,即可求得每一张图片对应的外参矩阵 [公式] 。

注意,这里值得指出,完整的外参矩阵为 [公式] 。但是,由于张正友标定板将世界坐标系的原点选取在棋盘格上,则棋盘格上任一点的物理坐标 [公式],将旋转矩阵的 [公式] 的第三列 [公式] 消掉,因此, [公式] 在坐标转化中并没有作用。但是 [公式] 要使得 [公式] 满足旋转矩阵的性质,即列与列之间单位正交,因此可以通过向量 [公式] 的叉乘,即 [公式] ,计算得到[公式]

此时,相机的内参矩阵和外参矩阵均已得到。

注:以上推导都是假设不存在畸变参数的情况下成立的。但是事实上,相机是存在畸变参数的,因此,张正友标定法还需要通过L-M算法对于参数进行迭代优化。

四、标定相机的畸变参数

张正友标定法仅仅考虑了畸变模型中影响较大的径向畸变。

径向畸变公式(2阶)如下:

[公式]

其中,[公式]分别为理想的无畸变的归一化的图像坐标、畸变后的归一化图像坐标, [公式] 为图像像素点到图像中心点的距离,即 [公式] 。

图像坐标和像素坐标的转化关系为:

[公式]

其中,[公式]为理想的无畸变的像素坐标。由于 [公式] 接近于 [公式] ,则上式近似为:

[公式]

同理可得畸变后的像素坐标[公式]的表达式为:

[公式]

代入径向畸变公式(2阶)则有:

[公式]

可化简得:

[公式]

即为:

[公式]

每一个角点,只要知道畸变后的像素坐标 [公式] 、理想的无畸变的像素坐标 [公式] ,就可以构造两个上述等式。那么,有m幅图像,每幅图像上有n个标定板角点,则将得到的所有等式组合起来,可以得到mn个未知数为 [公式] 的约束方程,将约束方程系数矩阵记为 [公式] ,等式右端非齐次项记为 [公式] ,可将其记着矩阵形式:

[公式] 之后,利用最小二乘法可得:

[公式]

此时,相机的畸变矫正参数已经标定好。

那么,如何获得畸变后的像素坐标 [公式] 和理想的无畸变的像素坐标 [公式] 呢?

[公式] 可以通过识别标定板的角点获得, [公式] 可以通过如下方法近似求得。世界坐标系下每一个角点的坐标[公式]是可以计算得到的,我们利用已经求得的外参矩阵 [公式] 和内参矩阵 [公式] 进行反投影。

[公式]

利用上式,消去尺度因子 [公式],可得:

[公式]

即可得到理想的、无畸变的像素坐标[公式]。当然,由于外参矩阵 [公式] 和内参矩阵 [公式] 是在有畸变的情况下获得的,这里得到的像素坐标[公式]并不是完全理想的、无畸变的。我们的总逻辑是,在进行内参矩阵和外参矩阵的求解的时候,我们假设不存在畸变;在进行畸变系数的求解的时候,我们假设求得的内参矩阵和外参矩阵是无误差的。最后,我们再通过L-M算法对于参数进行迭代优化。

需要指出,上述公式推导的时候以2阶径向畸变为例,但实际上更高阶的径向畸变同理,只是需要的约束方程个数更多而已。

 

注:以下部分为个人提出的方法。

在 [公式] 矩阵的构建过程中,需要用到 [公式] 。而由于张正友标定法不能直接求出焦距 [公式] ,理想的无畸变的归一化的图像坐标 [公式] 无法求解,造成 [公式] 矩阵无法构建的问题。

但是个人思考了一种解决方案。

世界坐标系下的标定板角点的坐标 [公式] 乘上刚体变换矩阵(外参矩阵)即可转化为相机坐标系下的标定板角点坐标 [公式] 。

[公式]

此时,相机坐标系下的标定板角点坐标 [公式] 乘上透视投影矩阵可得:

[公式]

其中,[公式]为理想的无畸变的归一化的图像坐标。即为:

[公式]

记 [公式] ,则有 [公式]

带入 [公式] 中,可得:

[公式]

我们将上式重新记为[公式],此时这个系数矩阵 [公式] 是可以完全求出来的,利用最小二乘法求解 [公式] 为:

[公式]

这里解得的 [公式] 虽然不是真正的畸变系数,但是由于焦距 [公式] 是定值,因此 [公式] 也是定值,当求得[公式]之后,可以将畸变模型化为:

[公式]

此时可以直接在像素坐标系下对畸变参数进行矫正。

五、L-M算法参数优化

从上述推导过程就可以看出,张正友标定法是有很多近似的,所以仅仅利用上述的过程进行标定误差肯定是很大的。所以张正友标定法还利用L-M(Levenberg-Marquardt)算法对参数进行了优化。

下一次需要做标定写报告时更新这一部分。

 

六、相机标定的步骤

1)、准备一个张正友标定法的棋盘格,棋盘格大小已知,用相机对其进行不同角度的拍摄,得到一组图像;

2)、对图像中的特征点如标定板角点进行检测,得到标定板角点的像素坐标值,根据已知的棋盘格大小和世界坐标系原点,计算得到标定板角点的物理坐标值;

3)、求解内参矩阵与外参矩阵。

根据物理坐标值和像素坐标值的关系,求出 [公式] 矩阵,进而构造[公式]矩阵,求解[公式]矩阵,利用[公式]矩阵求解相机内参矩阵 [公式] ,最后求解每张图片对应的相机外参矩阵 [公式] ;

4)、求解畸变参数。

利用[公式]构造[公式]矩阵,计算径向畸变参数;

5)、利用L-M(Levenberg-Marquardt)算法对上述参数进行优化。

七、源代码

python基于opencv的源代码:

Calibration_ZhangZhengyou_Method

 

 

这篇关于学习(1)相机标定之张正友标定法数学原理详解(含python源码)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!