3、标定板设计:棋盘格、圆点阵、Charuco板、尺寸选择与打印规范

标定板这东西,说白了就是相机的“尺子”。你拿一把不准的尺子去量东西,结果肯定一塌糊涂。我见过不少新手,花大把时间调算法,最后发现问题是标定板本身就不合格。嗯,咱们先把这把“尺子”做对。

3.1 三种主流标定板:怎么选?

目前工业界和学术界常用的标定板主要有三种。我根据实际项目经验,把它们的特点整理了一下。

类型 核心原理 优点 缺点 我的推荐场景
棋盘格 角点检测(Harris/Shi-Tomasi) 检测算法成熟、速度快、实现简单 需要完全可见、对遮挡敏感、亚像素精度依赖插值 入门学习、简单环境、快速验证
圆点阵 椭圆拟合 + 圆心提取 圆心定位精度高、部分遮挡仍可检测 透视畸变下椭圆变形、需要排序算法 高精度工业测量、大视场角标定
Charuco板 ArUco码 + 棋盘格混合 支持部分遮挡、自动识别ID、无需全图可见 计算量稍大、对打印质量要求高 大场景标定、多相机系统、手持标定

核心结论:如果你只做一次标定,环境可控,用棋盘格最省事。如果你追求亚像素级的精度,或者标定板经常被遮挡,圆点阵和Charuco是更好的选择。我个人习惯在产线项目里用圆点阵,在移动机器人上用Charuco。

3.2 棋盘格:经典但别踩坑

棋盘格是最常见的标定板。但很多人忽略了两个关键点:内角点数量和奇偶性。

OpenCV的 findChessboardCorners 要求你传入的是 内角点 的数量。比如一个 9×6 的棋盘格,指的是内部有 9 列、6 行角点,而不是格子数。我曾经见过有人把格子数当角点数传进去,结果程序跑了一整天都没找到角点。

我的经验:棋盘格的行列数最好一奇一偶。比如 9×6 或 11×8。这样能保证检测时方向唯一,避免180度旋转歧义。全奇或全偶的棋盘格,在某些角度下会检测出两种方向,导致标定失败。

另外,棋盘格对打印平整度非常敏感。如果你把棋盘格贴在弯曲的表面上,角点位置会偏移,直接引入系统误差。我建议用3mm以上的亚克力板或铝板做底板,用喷墨打印纸贴上去,再覆一层哑光膜减少反光。

3.3 圆点阵:精度更高,但更讲究

圆点阵的精度优势在于:圆心定位可以做到亚像素级,而且对透视畸变的鲁棒性比角点好。但这里有个坑——椭圆拟合。

当相机光轴不垂直于标定板时,圆形在图像上会变成椭圆。如果你直接用椭圆中心当圆心,会引入偏差。正确的做法是:先做椭圆拟合,再用透视投影模型把椭圆中心反算回圆心。OpenCV的 findCirclesGrid 内部做了这个补偿,但前提是你传入了正确的相机内参初值。

避坑指南:我曾经在一个项目中直接用 findCirclesGrid 的默认参数,结果标定出来的畸变系数总是偏大。后来发现是因为标定板上的圆点间距不均匀——打印时纸张伸缩了。圆点阵对打印精度要求比棋盘格更高,建议用激光打印机 + 防水相纸。

圆点阵的排列方式也有讲究:

  • 对称排列:检测简单,但需要标定板完全在视野内。
  • 非对称排列:一行圆点偏移半个间距,可以唯一确定方向,适合部分遮挡场景。

我个人推荐使用非对称圆点阵(Asymmetric Circles Grid),它在实际使用中更灵活。

3.4 Charuco板:大场景的救星

Charuco板是ArUco码和棋盘格的结合体。每个格子内部嵌有一个唯一的ArUco码,这样即使只看到标定板的一部分,也能通过ID知道每个角点的世界坐标。

它的优势很明显:

  • 支持部分遮挡:你不需要把整个标定板都拍进画面。
  • 自动排序:每个角点都有唯一ID,不需要手动指定顺序。
  • 适合大场景:比如用无人机拍地面标定板,或者用鱼眼相机标定。

但Charuco也有代价:ArUco码的打印质量直接影响检测率。如果打印模糊、反光严重,码的识别率会急剧下降。我建议用600dpi以上的打印机,码的边长至少占20个像素以上。

生成Charuco板:OpenCV的 cv.aruco.CharucoBoard 可以直接生成。我一般设置 squaresX=11, squaresY=8, squareLength=30mm, markerLength=22mm。markerLength 比 squareLength 小一点,留出黑色边框,这样检测更稳定。

3.5 尺寸选择:不是越大越好

标定板的尺寸选择,很多人凭感觉。其实有一个简单的公式可以参考:

标定板边长 ≈ 相机视场角下工作距离处视野宽度的 1/3 到 1/2

举个例子:如果你的相机在1米处视野宽度是2米,那标定板的边长应该在 0.7米到1米之间。太小了,角点数量不够,标定精度差;太大了,边缘畸变区域拍不到,内参估计不准。

相机类型 典型工作距离 推荐标定板尺寸 格子/圆点大小
手机摄像头 0.3 - 1 m A4纸大小 (210×297mm) 20 - 30 mm
工业相机 (500万像素) 0.5 - 2 m 300×400 mm 25 - 40 mm
无人机/大场景 5 - 20 m 1.5×2 m 或更大 100 - 200 mm

关键原则:标定板上的每个格子或圆点,在图像中至少要占 20×20 像素。太小了,角点检测的亚像素精度会下降。你可以用这个公式反推:格子物理尺寸 = (像素要求 × 工作距离) / 焦距。

3.6 打印规范:细节决定成败

打印标定板不是随便找个打印店就能搞定的。我总结了几条硬性规范:

  1. 介质选择:哑光相纸或防水PP纸。不要用光面纸,反光会让检测算法崩溃。
  2. 底板要求:必须平整。推荐3mm以上亚克力板或铝板。不要用纸板,容易弯曲。
  3. 打印精度:至少600dpi。格子边缘要清晰,不能有锯齿或模糊。
  4. 尺寸验证:打印后用游标卡尺测量实际格子大小。纸张伸缩会导致理论值和实际值偏差,这个偏差会直接变成标定误差。
  5. 覆膜处理:哑光覆膜,减少反光,同时保护打印面。

我曾经踩过的坑:有一次用普通A4纸打印棋盘格,贴在纸板上就用了。结果标定出来的焦距总是偏大5%。后来发现是纸板受潮弯曲了,导致实际格子间距比理论值大了2mm。从那以后,我每次打印完都会用卡尺量三个不同位置的格子大小,取平均值作为实际输入值。

3.7 知识体系总览

下面这张图把标定板设计的核心逻辑串起来了。你可以把它当作一个决策流程图。

标定板设计决策流程 标定板设计决策流程 选择标定板类型 棋盘格 圆点阵 Charuco板 尺寸 = 视野宽度 × 1/3 格子 ≥ 20像素 码边长 ≥ 20像素 打印规范 哑光相纸 | 600dpi | 平整底板 验证步骤 游标卡尺测量 | 覆膜防反光 开始采集标定图像 先选类型 → 再定尺寸 → 最后打印 顺序不能乱