3. 数据采集环境搭建:固定相机与标定板、调整焦距与光圈、确保光照均匀、避免反光与阴影、采集距离与角度规划
环境搭建这件事,说实话,比很多人想象的要重要得多。我见过不少同学拿着标定脚本跑了一整天,结果内参算出来全是 NaN,或者重投影误差大得离谱。最后排查下来,不是算法问题,是相机没固定好,或者光照不均匀导致角点检测全偏了。
这一章,我就把我在项目里踩过的坑、总结的经验,一条一条拆给你看。
3.1 固定相机与标定板
先问一个问题:标定过程中,相机和标定板到底谁动谁不动?
答案是:相机固定,标定板移动。这是最标准的做法。
为什么?因为我们要标定的是相机的内参(焦距、主点、畸变系数),这些参数只跟相机本身有关。如果相机也在动,那外参(旋转和平移)就会跟着变,内参的求解就会引入额外的自由度,容易发散。
核心原则:标定过程中,相机位置、焦距、光圈、白平衡全部锁定,只改变标定板的位姿。
具体操作上,我有几个建议:
- 相机固定:用三脚架或者工业相机支架把相机锁死。别用手持,哪怕你觉得自己手很稳。我试过手持采集 50 张图,结果有 30 张因为微小的抖动导致角点亚像素精度不够。
- 标定板固定:标定板最好贴在硬质平板上(亚克力板或者铝板),不要用软纸板。软纸板一弯,角点坐标就变了,标定出来的畸变参数全是错的。
- 标定板移动:用手或者机械臂改变标定板的姿态。注意,每次移动后,标定板要静止 1-2 秒再拍照,避免运动模糊。
小技巧:如果你用的是棋盘格标定板,建议在板子背面贴一张磨砂黑纸。这样可以减少透过棋盘格缝隙的光线干扰,角点检测会更稳定。
3.2 调整焦距与光圈
焦距和光圈,这两个参数一旦定了,整个标定过程中就不能再碰。否则你标定出来的内参跟实际使用时的内参对不上。
我个人习惯的做法是:
- 先调焦距:把标定板放在你实际工作距离的中间位置(比如你平时拍 1 米远的物体,就把标定板放在 1 米处),调整焦距让棋盘格清晰。注意,是整个画面清晰,不只是中心区域。
- 再调光圈:光圈决定了景深和进光量。光圈太大(比如 F1.4),景深太浅,标定板稍微倾斜一点就模糊了。光圈太小(比如 F16),衍射效应会降低图像锐度。我一般推荐 F4-F8 之间,具体看镜头。
- 锁定:调好后,用胶带把对焦环和光圈环贴住。别信什么「自动对焦」,标定必须手动对焦并锁定。
注意:如果你用的是变焦镜头,请把焦距拧到某个固定焦段(比如 35mm),然后用胶带锁死。变焦镜头在变焦过程中,镜片组会移动,内参也会变。标定结果只对当前焦段有效。
3.3 确保光照均匀
光照不均匀,角点检测的精度会直接下降。我遇到过最典型的情况是:标定板左边亮右边暗,结果左边角点检测精度 0.1 像素,右边直接跳到 0.5 像素,整体重投影误差被拉高。
怎么做?
- 使用漫射光源:环形灯或者柔光箱是最好的选择。避免点光源(比如台灯),因为点光源会在标定板上产生高光斑。
- 环境光:如果是在室内,尽量关掉顶灯,只用均匀的侧光。顶灯容易在棋盘格上产生阴影。
- 检查均匀性:拍一张标定板的照片,用直方图看一下。理想情况下,直方图应该是单峰且集中在中间区域。如果出现双峰(一边亮一边暗),说明光照不均匀。
我的经验:在户外标定时,尽量选择阴天。阴天的光线是天然的漫射光,均匀性比大太阳天好得多。大太阳天标定,棋盘格上经常出现镜面反射,角点直接丢失。
3.4 避免反光与阴影
反光和阴影是标定数据采集的两大杀手。反光会让棋盘格上的白色区域过曝,角点被「吃掉」;阴影会让黑色区域变成灰色,对比度下降,角点检测不准。
具体避坑指南:
- 反光:如果标定板表面有反光,可以尝试旋转标定板的角度,或者用偏振片。我曾经在标定一个玻璃柜里的相机时,标定板反光严重,最后在镜头前加了一片偏振滤镜才解决。
- 阴影:检查标定板周围有没有遮挡物。比如,你的手或者三脚架的影子落在标定板上,这种阴影会导致局部对比度下降。我建议用遥控器或者延时拍摄,人离开标定区域。
- 背景:标定板背后的背景最好是纯色且远离标定板。背景太杂乱,或者背景上有类似棋盘格的纹理,会影响角点检测的鲁棒性。
严重警告:不要用手机屏幕或者显示器显示棋盘格来当标定板。屏幕有刷新率、摩尔纹、亮度不均匀等问题,标定出来的内参精度极差。请使用打印并贴附在硬质平板上的物理标定板。
3.5 采集距离与角度规划
这一步决定了你的标定数据是否「覆盖全面」。内参求解需要标定板在图像的不同位置、不同距离、不同角度出现,才能约束住所有参数。
我一般按照以下策略采集:
| 维度 | 要求 | 说明 |
|---|---|---|
| 距离 | 覆盖工作距离的 70%-130% | 比如工作距离 1 米,采集 0.7 米、1.0 米、1.3 米三个距离 |
| 角度 | X/Y/Z 轴旋转 ±30° | 绕 X 轴(俯仰)、Y 轴(偏航)、Z 轴(旋转)都要有 |
| 位置 | 覆盖图像四角和中心 | 标定板要出现在画面的左上、右上、左下、右下、中心 |
| 数量 | 15-25 张有效图像 | 不是越多越好,20 张左右覆盖全面即可 |
具体采集流程,我建议按这个顺序来:
- 中心位置 + 正对相机:先拍 3 张,作为基准。
- 中心位置 + 倾斜:绕 X 轴倾斜 ±20°、±30°,各拍 1 张;绕 Y 轴同理。
- 四角位置 + 正对:把标定板移到画面四个角,各拍 1 张。
- 四角位置 + 倾斜:在四角位置分别做小角度倾斜,各拍 1 张。
- 不同距离:靠近和远离相机,各拍 2-3 张。
- 绕 Z 轴旋转:把标定板旋转 45°、90°,各拍 1 张。
这样下来大概 20 张左右,覆盖非常全面。
关键指标:采集完成后,用 OpenCV 的 findChessboardCorners 检查一下,确保每张图都能检测到所有内角点。如果有 3 张以上检测失败,说明你的环境或者标定板有问题,需要重新调整。
3.6 本章知识体系
下面这张图总结了数据采集环境搭建的完整流程和关键节点: