天天看点

立体视觉入门指南:相机标定之Zhang式标定法

作者丨李迎松@知乎

亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知距离,导航避障,从而翱翔于天地之间。而当今世界是智能化的世界,我们的科学家们探索各种机器智能技术,让机器能够拥有人类的三维感知能力,并希望在速度和精度上超越人类,比如自动驾驶导航中的定位导航,无人机的自动避障,测量仪中的三维扫描等,都是高智机器智能技术在3D视觉上的具体实现。

立体视觉是三维重建领域的重要方向,它模拟人眼结构用双相机模拟双目,以透视投影、三角测量为基础,通过逻辑复杂的同名点搜索算法,恢复场景中的三维信息。它的应用十分之广泛,自动驾驶、导航避障、文物重建、人脸识别等诸多高科技应用都有它关键的身影。

本课程将带大家由浅入深的了解立体视觉的理论与实践知识。我们会从坐标系讲到相机标定,从被动式立体讲到主动式立体,甚至可能从深度恢复讲到网格构建与处理,感兴趣的同学们,来和我一起探索立体视觉的魅力吧!

本课程是电子资源,所以行文并不会有太多条条框框的约束,但会以逻辑清晰、浅显易懂为目标,水平有限,若有不足之处,还请不吝赐教!

大家好,上一篇:立体视觉入门指南:关键矩阵(本质矩阵,基础矩阵,单应矩阵)https://zhuanlan.zhihu.com/p/377794028

中,我们对立体视觉的3个关键矩阵:本质矩阵 E 、基础矩阵 F、单应性矩阵H作了较为详细的描述,同时给出了本质矩阵、单应性矩阵的求解方法以及本质矩阵分解外参R,t 的具体公式。更加难能可贵的是,我们在博文最后提供了几个作业题并在Github开源了参考答案代码【我知道很多心理都在默念李博666】【当然肯定也有一些人在默念这太easy了李博能不能上点难度】。无论如何,博主觉得这是一件有意义的事情,只希望没有误人子弟。

而本篇的内容,则是立体视觉的绝对核心模块:相机标定。虽然它因为技术相对成熟,如今研究的人不多,也容易被人忽略,往往用一个开源算法库如Opencv或者Matlab标定工具箱就直接搞定,但实际在立体视觉工程化、产品化时,开源工具由于其精度不高、灵活度低而不建议直接使用,企业往往是自己开发相机标定算法。相机标定作为立体视觉的核心模块,掌握其理论是相当必要的,对我们深入理解立体视觉技术大有帮助,有开山辟路之效

立体视觉入门指南:相机标定之Zhang式标定法

所谓标定,即是由大量观测值拟合参数模型的过程,且在此拟合的参数模型是已知的,所以应尽可能探索能便捷获取大量观测值的方案,如果观测值之间还满足一些其他的几何约束就更有助于求解具体单个参数值。

今天所述的Zhang式标定法1即提供了一种便捷获取大量观测值的的方案,同时观测值之间还满足一类明显的几何约束(即平面约束),可直接求解出内外参。其操作方式非常简单,只需要拍摄带有标定板图案的平面,即可完成相机标定,使标定难度极大降低,如果不追求高精度,打印一张棋盘格标定板图案粘贴到近似平的硬纸板上即可完成标定,加快了立体视觉的入门和普及,影响深远,是相机标定领域绝对的经典。

本篇即带大家深入了解Zhang式相机标定法,掌握本篇对立体视觉的理论掌握及工程实战来说都是非常必要的。

实施方法

Zhang式标定法能够被广泛应用,其中一个重要原因是其实施方法十分简单,不需要专业的工艺制作即可完成。

第一步,设计一张具有明显角点特征,且已知每个角点二维坐标的图案作为标定图案,常见的图案有三种:

立体视觉入门指南:相机标定之Zhang式标定法

规则的图案设计可以方便的计算出角点在图案内的二维坐标,拿棋盘格来说,角点之间的间隔像素数是固定的,假设左上角角点的坐标为(0,0),则其他角点的像素坐标都可以通过格子的偏移量计算出来,而一张已知DPI的标定板图像,在打印后每个角点的二维空间坐标也是完全已知的(通过像素换算成空间尺寸)。

第二步,将标定板图案以某种方式置于一个平面上。比如最简单的方式是将标定图原尺寸打印出来,然后找一块近似平的平板,将打印后的标定图案粘贴至平板上;更专业高精度的方式是找专业厂家制作高精平板(如陶瓷板)并将标定图案以某种工艺刻印到平板上。这一步的目的是让标定图案的角点都位于一个平面上。

立体视觉入门指南:相机标定之Zhang式标定法

图片来源:Calibration Patterns Explained

如此,第一步所描述的二维坐标可以转换成第三维  坐标等于0的三维坐标(将世界坐标系的原点放在标定板的某个角点,Z轴垂直于标定板)。

第三步,移动相机到N(N>=3)个不同的位姿拍摄标定板图案。

立体视觉入门指南:相机标定之Zhang式标定法

第四步,对上一步拍摄的标定板图案进行角点提取,解算标定参数。

立体视觉入门指南:相机标定之Zhang式标定法

matlab软件标定示意图

以上便是相机标定的实施步骤,总结来说,在一个平面标定板上有一组已知空间坐标的角点,相机在多个不同位姿下拍摄角点图案并提取角点的像素坐标,即可完成相机内外参数的解算。这句总结蕴含2个重要的知识点:

1.标定图案中角点的空间坐标是已知的,且它们都位于一个平面上, Z坐标等于0

2.相机需要在多个不同的位姿拍摄角点图案并提取像素坐标

可以看到Zhang式标定法确实是易于实施的方法,其中蕴含的标定理论,是非常有价值的,对于立体视觉的初学者来说,掌握其理论很有必要,还请务必阅读本篇接下来的内容。

理论基础

定义

立体视觉入门指南:相机标定之Zhang式标定法

单应性矩阵

在实施方法中,我们一定能够关注到一个非常关键的信息:标定图案被置于一个平面上。它的目的是为了让标定图案中的角点都位于一个空间平面上,从而当相机拍摄角点成像后,空间平面和像平面之间存在一个单应性变换关系,即可通过一个单应性矩阵H将角点的空间坐标转换成图像坐标。

立体视觉入门指南:相机标定之Zhang式标定法

对内参的约束

立体视觉入门指南:相机标定之Zhang式标定法

由上式可知,单应性矩阵H和内参矩阵A的元素之间满足两个线性方程约束。如果能够计算出单应性矩阵,直观上感觉应该可通过解线性方程解出内参矩阵。具体是否可以呢?我们继续往下看。

相机参数求解

本小节将带大家了解相机参数的具体解法,回答上节遗留的问题,即是否能够通过公式(7)来求解相机参数。

本小节将分为3个部分,第一部分介绍直接由式(7)求解相机参数的闭合解公式;第二部分介绍相机参数的最大似然解法;第三部分介绍考虑相机畸变后的畸变参数解法。

闭合解

立体视觉入门指南:相机标定之Zhang式标定法
立体视觉入门指南:相机标定之Zhang式标定法

这是一个典型的线性方程组,系数矩阵的行数为2,求解6维向量 b 。由公式(4),当相机在1个位姿下拍摄标定板图案后,经过角点的像素坐标提取,可得所有角点的世界坐标系和像素坐标系的对应关系,进而通过线性方程组的最小二乘解法求解当前位姿下的单应性变换矩阵 H ,可得公式(11)的具体表达式。

但公式(11)的系数矩阵只有2行,要求解6维向量b是不够的。所以我们需要相机在n个位姿下拍摄标定图案,得到n个单应性矩阵,以及行数为2n的系数矩阵,当 n>=3 时,便可求解6维向量 b 。也就是说至少3张图片才能完成相机标定。最后得到的总方程组可表达为:

立体视觉入门指南:相机标定之Zhang式标定法
立体视觉入门指南:相机标定之Zhang式标定法

以上,内外参数全部解出,整个闭合解法完成。

备注:感谢微信公众号「3D视觉工坊」整理。

最大似然估计

闭合解法可得到代数距离最小的解,并没有考虑到各个参数实际的几何含义,由于噪声的存在,解并不会非常精确。我们可以通过最大似然估计法来获取更精确的解。

如果我们观测到标定板n张拍摄图像中的m个点对。假设所有点存在独立的等尺度的噪声,则最大似然估计即最小化如下表达式:

立体视觉入门指南:相机标定之Zhang式标定法

式(16)是一个非线性表达式,所以这是一个非线性最小化求解问题,可以用Levenberg-Marquardt算法来求解。想必部分同学知道求解该类问题需要一个相对准确的初始化值,这个值便可以使用前一节得到的闭合解来获取。

在工程实践中,我们通常用ceres-solver库来搞定这部分。

相机畸变

到目前为止,我们还没有考虑相机畸变,所有推导都是基于无畸变的理想情况,而实际情况是相机必然会有多多少少的畸变,主要包括两种:径向畸变和切向畸变。一般情况下,会考虑3项径向畸变 k1,k2,k3 和2项切向畸变p1,p2 。在Zhang式标定法中,只考虑了2项径向畸变 k1,k2 ,而实际应用时,我们会考虑更多项,原理相同,依次类推即可。

立体视觉入门指南:相机标定之Zhang式标定法

式(17)是一个线性方程组,求解k1,k2看上去是一件简单的事儿,但实际上却面临一个问题,即无法获取无畸变的理想坐标 (u,v),它需要已知准确的内外参通过投影公式(2)来求解,同学们可能会问:前两节不是解出了内外参数吗!?不要忘了,前面是没有考虑相机畸变的,内外参的求解实际是不精确的(把观测值当做无畸变坐标来求解的内外参,是有偏差的)。所以这成了一个鸡生蛋蛋生鸡的矛盾问题。

那就干脆不奢求通过线性方程求出精确畸变,将闭合解得到的内内外参代入公式(2)求出近似的理想坐标 (u,v),从而由公式(17)建立线性方程组求解近似的k1,k2 。

然后,我们建立新的最大似然估计表达式:

立体视觉入门指南:相机标定之Zhang式标定法

同样通过非线性求解方法来求解所有内外参数和畸变系数。而畸变系数的初值由上面所描述的方法来求解。

实际上,因为畸变系数是非常小值,所以直接将畸变系数的初值全部设置为0也是可以的,这就不需要解线性方程组了。

总结

下面对整个Zhang式标定的流程做一个总结:

1.打印标定图案并粘贴至一个平面上,称之为标定板。

2.通过移动相机或移动标定板在不同的位姿拍摄多张标定板图像(图像数>=3)。

3.在所有图像上检测特征点(角点或者圆心点)。

4.使用闭合解法求解所有内参数和外参数。

5.通过线性方程组求解近似的畸变系数(或者直接赋值为0)。

6.通过非线性优化计算精确的内外参数和畸变系数。

以上便是Zhang式标定法的所有理论讲解,希望同学们读完此篇能有醍醐灌顶之效,并能融会贯通,在实际工程应用中得心应手。

在Zhang式标定法的原文中,还有一些值得学习的高阶知识点并未在本篇中体现,包括关键公式(7)的几何解释,以及退化情况下的讨论,感兴趣的同学可以继续阅读原文来了解。

下一篇我们将带来相机标定的另一种方法:DLT直接线性变换法。

作业

这里为大家准备了一些练习题,可以通过实践加深理解:

1 通过opencv开源库提供的接口完成相机标定,可使用opencv提供的图像,也可使用自己的图像。

2 更高阶的是,你能够自己不依赖opencv库写一套相机标定算法吗?或者只使用opencv来检测角点坐标,其他步骤自己来实现。

参考答案地址:https://github.com/ethan-li-coding/StereoV3DCode

[代码持续更新,大家感兴趣可以star和watch,本篇代码暂缺]。

参考文献

继续阅读