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 自定义标定板
标准标定板虽好,但有时候就是不够用。比如你要标定超大视野的相机,或者标定非矩形排列的多相机系统,这时候就得自己设计标定板了。
自定义标定板的核心原则就一条:特征点必须能被稳定、精确地检测。我见过有人用二维码当标定板,结果检测速度慢得让人抓狂。
常见的自定义标定板类型:
- 非标准圆点阵列:圆点大小、间距、行列数自己定,但必须保证所有圆点在同一平面。
- 棋盘格变体:比如不对称棋盘格,用于区分方向。
- 混合图案:圆点+编码标记,既用于标定又用于位姿识别。
设计自定义标定板时,有几个坑你得避开:
自定义标定板的参数设计建议:
| 参数 | 建议范围 | 原因 |
|---|---|---|
| 圆点直径 | 视野宽度的 1/100 ~ 1/50 | 太小检测不到,太大边缘畸变严重 |
| 圆点间距 | 直径的 2~3 倍 | 太近容易粘连,太远浪费空间 |
| 阵列大小 | 至少 4x4,推荐 7x7 | 点数太少,畸变模型拟合不准 |
| 参考标记 | 至少一个明显不同的特征 | 用于确定标定板方向 |
3.3 描述文件(.descr)的生成
标定板设计好了,怎么让HALCON认识它?答案就是描述文件,后缀是 .descr。这个文件说白了就是标定板的「身份证」,里面记录了所有圆点的精确世界坐标。
生成描述文件有两种方式:
- 用HALCON算子生成:调用
gen_caltab算子,指定参数后自动生成。 - 手动编写:按格式写一个文本文件,改后缀名就行。
我个人强烈推荐第一种方式。手动编写太容易出错了,我早期干过这事,坐标写错一位,标定结果全废。
用算子生成的代码示例:
* 生成标准标定板描述文件
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的硬性要求。
3.4 知识体系总览
为了让你更直观地理解标定板设计的全貌,我画了一张结构图:
3.5 实战建议
最后,给你几条实在的建议:
- 第一次做标定,直接用标准标定板。HALCON官方提供的参数是经过验证的,别自己瞎改。
- 描述文件生成后,用
read_caltab读一下,确认坐标数据没问题。我习惯在标定前先可视化一下标定板点云。 - 标定板要平整。贴在玻璃板上比贴在纸板上好得多。我曾经用一张皱巴巴的打印纸做标定,结果畸变参数完全不对。
- 保存好你的描述文件。同一个标定板,描述文件是唯一的。丢了就得重新测量,那叫一个麻烦。
calib/ 文件夹下,统一管理。我每个项目都这么干,找起来方便。