相机标定中各种标定板介绍以及优缺点分析
作者:Jakob W
编译:ronghuaiyang(AI 公园)
导读
各种标定板的解释和分析。
准确标定像机对于所有的机器/计算机视觉的成功应用都是非常重要的。然而,对于标定板,有不同的模式可供选择。为了方便进行选择,本文将解释每种方法的主要好处。
标定板的选择,有CharuCo,棋盘格,不对称的圆和棋盘格。
标定板尺寸
在选择标定板时,一个重要的考虑因素是它的物理尺寸。这最终关系到最终应用的测量视场(FOV)。这是因为相机需要聚焦在特定的距离上标定。改变焦距长度会轻微地影响对焦距离,这会影响之前的标定。即使是光圈的改变通常也会对标定的有效性产生负面影响,这就是为什么要避免改动它们。
为了精确的标定,当摄像机看到标定目标填充大部分图像时,摄像机模型最好是受到约束的。通俗来说,如果使用一个小的标定板,许多相机参数的组合可以解释所观察到的图像。根据经验,当正面观察时,标定板的面积至少应该是可用像素面积的一半。
标定板类型
多年来已经引入了不同的标定板,每种标定板都有独特的属性和好处。
要选择正确的类型,首先要考虑使用哪种算法和算法实现。在OpenCV或MVTec Halcon等通用库中,标定板有一定的自由度,它们有各自的优点和局限性。
棋盘格
这是最流行、最常见的图案设计。通常通过首先对摄像机图像进行二值化并找到四边形(黑色的棋盘区域)来找到棋盘角点的候选点。过滤步骤只保留那些满足特定大小标准的四边形,并组织在一个规则的网格结构中,网格结构的尺寸与用户指定的尺寸匹配。
在对标定板进行初步检测后,可以以非常高的精度确定角点位置。这是因为角(数学上:鞍点)基本上是无限小的,因此在透视变换或镜头失真下是无偏的。
在OpenCV中,整个棋盘必须在所有图像中可见才能被检测到。这通常使得从图像的边缘获取信息变得困难。这些区域通常是很好的信息来源,因为它们适当地约束了镜头失真模型。
在检测出棋盘格后,可以进行亚像素细化,以找到具有亚像素精度的鞍点。这利用了给定角点位置周围像素的确切灰度值,并且精度比整数像素位置所允许的精度要精确得多。
你可以查看OpenCV棋盘检测器的源代码:
https://github.com/opencv/opencv/blob/master/modules/calib3d/src/calibinit.cpp。关于棋盘格目标的一个重要细节是,为了保持旋转不变,行数必须是偶数,列数必须是奇数,或者相反。例如,如果两者都是偶数,则存在180度旋转的歧义。对于单台相机的校准,这不是一个问题,但如果相同的点需要由两个或更多的相机识别(对于立体校准),这种模糊性必须不存在。这就是为什么我们的标准棋盘目标都具有偶数/奇数行/列的属性。
圆形网格
圆形网格也是一种流行且非常常见的校准目标设计,它基于圆形,或者是白色背景上的白色圆形,或者是白色背景上的黑色(黑色)圆形。在图像处理术语中,圆可以被检测为图像中的“斑点”。在这些二元斑点区域上应用一些简单的条件,如面积、圆度、凸度等,可以去除候选的坏特征点。
在找到合适的候选对象后,再次利用特征的规则结构对模式进行识别和过滤。圆的确定可以非常精确,因为可以使用圆外围的所有像素,减少了图像噪声的影响。然而,与棋盘中的鞍点不同的是,在相机视角下,圆形被成像为椭圆。这种观点可以通过图像校正来解释。然而,未知的镜头畸变意味着圆不是完美的椭圆,这增加了一个小的偏置。然而,我们可以将畸变模型看作是分段线性的(服从透视变换/单应性),因此在大多数透镜中,这种误差非常小。
对称圆网格和非对称圆网格的一个重要区别是,对称圆网格具有180度的模糊性,正如“棋盘”一节中所解释的那样。因此,对于立体校正,非对称网格是必要的。否则,这两种类型的性能都不会有太大的差别。
圆形网格检测的OpenCV源代码:
https://github.com/opencv/opencv/blob/master/modules/calib3d/src/circlesgrid.cpp。
CharuCo
CharuCo标定板克服了传统棋盘的一些限制。然而,它们的检测算法有点复杂。幸运的是,CharuCo检测是OpenCVs contrib库的一部分(从OpenCV 3.0.0开始),这使得集成这个高级方法非常容易。
CharuCo的主要优点是所有光检查器字段都是唯一编码和可识别的。这意味着即使是部分遮挡或非理想的相机图像也可以用于校准。例如,强烈的环形光可能会对标定目标产生不均匀的光照(半镜面反射区域),这将导致普通棋盘格检测失败。使用CharuCo,剩余的(好的)鞍点检测仍然可以使用。鞍点定位可以像棋盘一样使用亚像素检测来细化。
对于接近图像角落的观察区域,这是一个非常有用的属性。由于目标的定位使得摄像机只能看到它的一部分,所以我们可以从摄像机图像的边缘和角落收集信息。这通常会带来确定镜头失真参数时的非常好的鲁棒性。因此,我们强烈推荐使用CharuCo标定板,OpenCV 3.x是可用的。
自然,CharuCo目标可以用于立体校准。在这种情况下,需要执行一些代码来找到在每个摄像头中单独检测到的点,以及在两个摄像头中都检测到的点(交点)。
英文原文:
https://calib.io/blogs/knowledge-base/calibration-patterns-explained
本文仅做学术分享,如有侵权,请联系删文。