标定板类型:棋盘格、圆点阵、Charuco与二维码
做标定这么多年,我接触过的标定板类型少说也有十几种。但真正在实际项目中经得起考验的,其实就四种:棋盘格、圆点阵、Charuco 和二维码标定板。每种都有它的脾气,选对了事半功倍,选错了……嗯,我吃过不少亏。
棋盘格标定板
这是最经典、最常用的标定板。说白了,就是黑白相间的方格阵列。为什么大家都爱用它?因为角点检测太稳定了。
核心优势:亚像素角点提取精度高,算法成熟,OpenCV 里直接调 findChessboardCorners 就能用。
我在项目中遇到过一个问题:用棋盘格标定鱼眼相机时,边缘区域的格子变形太严重,角点经常检测失败。后来我学乖了——棋盘格只占视场的 1/3 到 1/2,别铺满。
| 参数 | 说明 | 我的建议 |
|---|---|---|
| 内角点数量 | 如 9×6 表示 9 列 6 行内角点 | 至少 8×6,太少容易欠约束 |
| 方格尺寸 | 实际物理边长,单位 mm | 10-30mm 最常用,别小于 5mm |
| 黑白对比度 | 反射率差异越大越好 | 哑光材质,别用反光膜 |
避坑:我曾经用高光相纸打印棋盘格,结果在强光下白色区域过曝,角点全糊了。后来全部改用哑光 PP 合成纸,再也没出过问题。
圆点阵标定板
圆点阵用圆形代替方格。你可能会问:圆点比方格好在哪?
答案是——椭圆拟合比角点检测更抗噪。当镜头畸变很大时,方格角点会变成弧形,检测精度直线下降。但圆点即使变成椭圆,圆心位置依然能精确拟合。
适用场景:大畸变镜头(如鱼眼、广角)、低纹理环境、需要高鲁棒性的工业检测。
我记得有一次给某工厂做机械臂手眼标定,现场光照极差,棋盘格死活检测不出来。换成圆点阵后,一次通过。从那以后,我包里永远备一张圆点阵板子。
圆点阵的布局有讲究:
- 对称排列:行列对齐,类似棋盘格布局
- 非对称排列:某行或某列少一个点,用于确定方向
- 编码圆点:通过圆点大小或间距编码 ID,支持部分遮挡
我个人习惯用非对称排列,因为 OpenCV 的 findCirclesGrid 默认支持这种模式,不需要额外写方向判断逻辑。
Charuco 标定板
Charuco 是棋盘格和 ArUco 二维码的结合体。它把 ArUco 标记嵌入棋盘格的白色方块中。为什么会有这种设计?
因为纯棋盘格有个致命弱点——必须看到完整棋盘才能检测。一旦被遮挡或部分出图,角点就全废了。Charuco 解决了这个问题:每个 ArUco 标记自带 ID,即使只看到 4 个标记,也能恢复出对应的棋盘格角点。
核心价值:支持部分遮挡、任意视角、自动识别标定板方向。非常适合在线标定和动态场景。
我曾经在一个产线项目中用 Charuco 做在线标定。相机装在机械臂上,每次换产都要重新标定。用 Charuco 后,操作工只需要对着板子随便拍几张,程序自动识别、自动标定,全程不用人工干预。
| 特性 | 棋盘格 | Charuco |
|---|---|---|
| 遮挡鲁棒性 | 差 | 强 |
| 自动方向识别 | 不支持 | 支持 |
| 角点数量 | 多 | 中等 |
| 实现复杂度 | 低 | 中 |
注意:Charuco 的 ArUco 字典要选对。我踩过坑——用了默认的 DICT_4X4_50,结果标记太小,远距离根本看不清。后来换成 DICT_6X6_250,识别率大幅提升。
二维码标定板
二维码标定板,就是在一张板上排列多个二维码(通常是 AprilTag 或 ArUco)。每个二维码携带独立 ID 和精确的角点位置。
它的最大优势是:单帧即可完成标定。传统棋盘格需要 10-20 张不同角度的图像,二维码标定板只需要 1 张。为什么?因为每个二维码的 ID 告诉你它在板上的精确位置,单帧就能提供足够的 3D-2D 对应点。
适用场景:单帧标定、大视场标定、多相机同步标定、需要快速部署的现场环境。
我记得有个项目需要在 5 分钟内完成 8 个相机的联合标定。用棋盘格的话,每个相机拍 15 张,8 个就是 120 张,光拍照就要半小时。换成 AprilTag 标定板后,每个相机只拍 1 张,5 分钟全部搞定。
二维码标定板的布局设计要点:
- ID 分布:确保每个二维码 ID 唯一,且空间位置已知
- 间距控制:二维码之间留白边,避免边缘重叠
- 尺寸统一:所有二维码使用相同尺寸,简化检测
- 背景对比:白色背景 + 黑色二维码,不要用彩色
选型决策指南
说了这么多,到底怎么选?我整理了一个决策流程,你对着走就行:
总结一下我的个人经验:
- 实验室环境:棋盘格,精度最高,调试最方便
- 工业现场:圆点阵,抗干扰能力强
- 在线/自动化:Charuco 或二维码,省人工
- 多相机/大视场:二维码标定板,单帧搞定
最后说一句:别迷信某一种标定板。我包里常备三种:棋盘格、圆点阵、Charuco。不同场景换着用,这才是工程师的务实做法。