4、图像采集实战:如何拍摄高质量标定图片
标定这事儿,算法再牛,也架不住输入图片质量差。我见过太多人拿着模糊、反光、角度单一的图片跑来问“为什么标定结果不准”。说白了,标定精度的一半以上,在拍照阶段就已经决定了。
这一章,咱们就聊聊怎么拍出能让算法“吃得舒服”的标定图片。嗯,这里要注意,不是随便拍几张棋盘格就完事了。
4.1 拍摄硬件与场景设置
先说说硬件。你不需要专业摄影棚,但有几个坑得避开。
| 硬件要素 | 推荐配置 | 避坑说明 |
|---|---|---|
| 相机 | 固定焦距、手动模式 | 别用自动变焦,焦距一变内参就变了 |
| 镜头 | 定焦镜头优先 | 变焦镜头请锁死在同一个焦段 |
| 光照 | 漫反射光源,均匀照明 | 避免单侧强光,会产生阴影和反光 |
| 标定板 | 亚光材质打印,贴平在硬板上 | 不要用光面纸,反光会让你崩溃 |
| 三脚架 | 建议使用 | 手持拍摄容易引入运动模糊 |
我的习惯: 每次标定前,我会先拍一张纯白纸检查光照均匀度。如果纸面有明显亮度梯度,那就调整光源位置再开始。这一步花不了30秒,但能省掉后面筛选图片的大量时间。
4.2 图片数量与角度要求
很多人问:“到底要拍多少张?” 我的答案是:20-30张有效图片。但“有效”两个字是关键。
为什么会这样?因为标定算法需要从不同视角观察标定板,才能稳定求解内参和畸变系数。角度太少,解出来的参数容易过拟合。
4.2.1 角度覆盖策略
我个人习惯把拍摄分成三个维度:
- 水平旋转:标定板在相机前方左右摆动,覆盖 -45° 到 +45°
- 俯仰变化:标定板上仰下俯,覆盖 -30° 到 +30°
- 距离变化:标定板从近到远,覆盖整个工作距离范围
你想想看,如果所有图片都是标定板正对着相机,那算法永远学不到透视畸变的信息。标定结果自然不准。
核心原则: 每张图片的标定板姿态,都应该和前一张有明显差异。不要连续拍10张几乎一模一样的照片,那是浪费存储空间。
4.2.2 数量与分布参考
| 场景 | 建议张数 | 角度分布要求 |
|---|---|---|
| 普通室内标定 | 20-25 | 水平±45°,俯仰±30°,距离3档 |
| 广角/鱼眼镜 | 30-40 | 增加边缘区域覆盖,标定板尽量靠近画面边缘 |
| 远距离监控 | 25-30 | 重点覆盖远距离,标定板尺寸要足够大 |
| 高精度测量 | 35-50 | 每个角度区间至少3张,重复拍摄取优 |
4.3 避免运动模糊与反光
这两个问题,是我在项目中遇到最多的“杀手”。
4.3.1 运动模糊
运动模糊会让角点检测产生亚像素偏移。一张模糊图片,可能拉低整体标定精度0.1个像素。听起来不多?对于高精度测量,这已经是灾难了。
我曾经在一个产线项目中,连续拍了200张图片,结果筛选下来只有40张能用。原因就是手持拍摄时手抖,加上快门速度太慢。
解决方案:
- 快门速度至少设为 1/100s 以上
- 使用三脚架或固定支架
- 如果必须手持,连拍模式 + 后期筛选
- 检查图片:放大到100%看棋盘格角点是否清晰锐利
注意: 不要相信你的眼睛在屏幕缩略图上的判断。一定要放大到100%检查边缘。模糊的图片,在缩略图里看起来可能“还行”,但算法会诚实地告诉你——它检测不到角点。
4.3.2 反光问题
反光会让棋盘格的黑白区域变成一片亮白,角点直接消失。我见过最夸张的一次,标定板上的反光区域占了半个画面,算法直接报错“找不到棋盘格”。
避坑指南:
- 使用亚光(哑光)标定板,不要用光面纸
- 光源从两侧45°方向打光,避免正面直射
- 如果环境光无法控制,可以稍微旋转标定板角度,让反光移出画面
- 实在不行,用偏振片贴在镜头前,能滤掉大部分反射光
4.4 数据筛选策略
拍完照片,别急着全部扔进标定程序。先做一轮筛选,能省下大量调试时间。
4.4.1 自动筛选流程
我一般写一个简单的筛选脚本,流程如下:
# 伪代码:标定图片自动筛选逻辑
for each image in 拍摄目录:
ret, corners = cv2.findChessboardCorners(img, pattern_size)
if not ret:
continue # 检测不到角点,直接丢弃
# 检查角点分布
if 角点覆盖面积 < 画面60%:
continue # 标定板太小,精度不够
# 检查清晰度(拉普拉斯方差)
laplacian_var = cv2.Laplacian(gray_img, cv2.CV_64F).var()
if laplacian_var < 阈值:
continue # 模糊图片,丢弃
# 检查角度重复度
if 当前姿态与已有图片相似度 > 90%:
continue # 角度太接近,不增加信息量
保留该图片到有效集合
我的经验值: 拉普拉斯方差的阈值,我通常设在 100-200 之间。具体值和你使用的标定板纹理、光照有关。可以先拍一张清晰图片算个基准值,然后以它的60%作为下限。
4.4.2 人工复核清单
自动筛选之后,我还会手动过一遍。重点看这几项:
- 画面边缘是否有裁剪?标定板不能出界
- 是否有局部过曝或过暗区域?
- 标定板是否平整?有没有褶皱或弯曲?
- 角度分布是否均匀?不要全是左边角度,右边一张都没有
4.5 知识体系:图像采集核心逻辑
下面这张图,是我自己总结的图像采集决策流程。每次做标定项目前,我都会对照着走一遍。
4.6 实战检查清单
最后,给你一份我每次采集前都会过一遍的清单。打印出来贴在相机旁边,比什么都管用。
| 检查项 | 通过标准 | 常见问题 |
|---|---|---|
| 焦距锁定 | 手动对焦,拍摄过程中不改变 | 自动对焦导致内参变化 |
| 光照均匀度 | 画面无过曝、无阴影、无反光 | 单侧光源造成亮度梯度 |
| 标定板平整 | 贴在刚性背板上,无褶皱 | 软纸打印,弯曲变形 |
| 角度覆盖 | 水平±45°,俯仰±30° | 所有图片都是正面拍摄 |
| 图片清晰度 | 100%放大后角点清晰可辨 | 手持拍摄快门太慢 |
| 数量要求 | 有效图片 ≥ 20张 | 拍了50张但一半不能用 |
最后提醒一句: 标定图片的质量,直接决定了标定结果的可用性。花1小时拍好照片,能省下后面10小时调试算法的时间。这个账,你算得明白。