3. 标定板设计:HALCON标准标定板、自定义标定板与描述文件生成

标定板这东西,说白了就是给相机看的「尺子」。你想想看,相机要测量三维空间,总得有个已知尺寸的参照物吧?标定板就是干这个的。我见过不少新手,上来就随便打印一张棋盘格,结果标定精度惨不忍睹。嗯,这里面的门道,咱们今天一次说清楚。

3.1 HALCON标准标定板(CalPlate)

HALCON官方推荐的标准标定板,其实是一种特殊的圆点阵列板。它长这样:黑色背景上排列着白色圆点,最中间有个大圆点作为参考方向。我个人习惯叫它「CalPlate」,因为HALCON内部就是这么命名的。

标准标定板有几个关键参数:

参数 说明 典型值
Mark 圆点直径 1.5 mm
Distance 圆点中心间距 3.75 mm
NumCols / NumRows 圆点阵列的列数和行数 7 x 7
ReferenceMark 参考圆点(大圆点)直径 3.0 mm

为什么用圆点而不是棋盘格?我在项目中遇到过,棋盘格角点检测对图像模糊比较敏感,而圆点质心定位更鲁棒。尤其是镜头畸变大的时候,圆点形状虽然会变形,但质心位置依然准确。HALCON的标定算子就是为这种圆点板量身定做的。

我的习惯: 如果项目精度要求高,我会选陶瓷基板的标定板,热膨胀系数小。塑料基板便宜,但温度一变,尺寸就飘了。

3.2 自定义标定板

标准标定板虽好,但有时候就是不够用。比如你要标定超大视野的相机,或者标定非矩形排列的多相机系统,这时候就得自己设计标定板了。

自定义标定板的核心原则就一条:特征点必须能被稳定、精确地检测。我见过有人用二维码当标定板,结果检测速度慢得让人抓狂。

常见的自定义标定板类型:

  • 非标准圆点阵列:圆点大小、间距、行列数自己定,但必须保证所有圆点在同一平面。
  • 棋盘格变体:比如不对称棋盘格,用于区分方向。
  • 混合图案:圆点+编码标记,既用于标定又用于位姿识别。

设计自定义标定板时,有几个坑你得避开:

我曾经踩过的坑: 有一次我设计了一个圆点间距不均匀的标定板,想着能覆盖更多视野区域。结果HALCON的标定算子直接报错——它默认圆点是等间距的。后来我老老实实改成均匀阵列,问题就解决了。

自定义标定板的参数设计建议:

参数 建议范围 原因
圆点直径 视野宽度的 1/100 ~ 1/50 太小检测不到,太大边缘畸变严重
圆点间距 直径的 2~3 倍 太近容易粘连,太远浪费空间
阵列大小 至少 4x4,推荐 7x7 点数太少,畸变模型拟合不准
参考标记 至少一个明显不同的特征 用于确定标定板方向

3.3 描述文件(.descr)的生成

标定板设计好了,怎么让HALCON认识它?答案就是描述文件,后缀是 .descr。这个文件说白了就是标定板的「身份证」,里面记录了所有圆点的精确世界坐标。

生成描述文件有两种方式:

  1. 用HALCON算子生成:调用 gen_caltab 算子,指定参数后自动生成。
  2. 手动编写:按格式写一个文本文件,改后缀名就行。

我个人强烈推荐第一种方式。手动编写太容易出错了,我早期干过这事,坐标写错一位,标定结果全废。

用算子生成的代码示例:

* 生成标准标定板描述文件
gen_caltab (
    7, 7,           * 列数, 行数
    0.00375,        * 圆点间距 (米)
    0.0015,         * 圆点直径 (米)
    'caltab.descr', * 输出文件名
    'caltab.ps'     * 可选: 输出PostScript文件用于打印
)

生成的 .descr 文件内容大致长这样:

# 标定板描述文件
# 格式: 圆点编号 X坐标 Y坐标 Z坐标
1  0.000000  0.000000  0.000000
2  0.003750  0.000000  0.000000
3  0.007500  0.000000  0.000000
...
49  0.022500  0.022500  0.000000

注意看,所有点的Z坐标都是0,因为标定板是平面。X和Y坐标的单位是米,这是HALCON的硬性要求。

关键点: 描述文件中的坐标顺序必须与图像中检测到的圆点顺序一致。HALCON默认从左到右、从上到下编号。如果你自己设计标定板,编号规则必须匹配。

3.4 知识体系总览

为了让你更直观地理解标定板设计的全貌,我画了一张结构图:

标定板设计知识体系 标准标定板 自定义标定板 描述文件 .descr 圆点阵列 + 参考大圆点 参数:Mark/Distance/NumCols 适用:高精度、单相机标定 非标准圆点 / 棋盘格变体 设计原则:特征稳定可检测 适用:大视野、多相机系统 gen_caltab 算子自动生成 格式:编号 X Y Z 单位:米,Z=0 核心原则 标定板设计 → 描述文件生成 → HALCON标定流程

3.5 实战建议

最后,给你几条实在的建议:

  • 第一次做标定,直接用标准标定板。HALCON官方提供的参数是经过验证的,别自己瞎改。
  • 描述文件生成后,用 read_caltab 读一下,确认坐标数据没问题。我习惯在标定前先可视化一下标定板点云。
  • 标定板要平整。贴在玻璃板上比贴在纸板上好得多。我曾经用一张皱巴巴的打印纸做标定,结果畸变参数完全不对。
  • 保存好你的描述文件。同一个标定板,描述文件是唯一的。丢了就得重新测量,那叫一个麻烦。
小技巧: 如果你用同一个标定板做多次标定(比如不同光照条件),可以把描述文件放在项目目录的 calib/ 文件夹下,统一管理。我每个项目都这么干,找起来方便。