第三节:相机标定基础
相机标定这事儿,说难不难,说简单也不简单。我刚开始做结构光的时候,觉得标定就是拍几张棋盘格照片跑个算法完事。结果呢?第一次重建出来的点云歪歪扭扭,像喝醉了酒。后来才明白——标定是结构光的根基,根基不稳,后面全是白搭。
今天咱们就聊聊张正友标定法、棋盘格怎么做、照片怎么拍。嗯,都是实战中踩过的坑。
3.1 张正友标定法:到底在干什么?
张正友标定法,说白了就是——用一张已知尺寸的棋盘格,通过多角度拍摄,反推出相机的内参和外参。
你想想看,相机把三维世界投影到二维图像上,这个过程是有数学模型的。我们想知道的,就是那个模型的参数:焦距、主点、畸变系数等等。张正友的方法妙就妙在——你不需要知道相机在空间中的精确位置,只需要棋盘格是平的、格子尺寸已知就行。
核心流程其实就四步:
- 检测角点:从图像里找到棋盘格的内角点
- 计算单应矩阵:每张图都能算出一个从棋盘格平面到图像平面的映射
- 求解内参:利用多个单应矩阵的约束,解出相机内参
- 优化畸变:考虑镜头畸变,做非线性优化
我个人习惯:标定完成后,一定要做一次重投影误差检查。如果平均误差超过0.3像素,我建议重新拍。我在项目中遇到过0.5像素的误差,重建出来的物体表面全是波纹,根本没法用。
这里我画了一张流程图,帮你理清张正友标定法的整体逻辑:
3.2 棋盘格制作要求:别在这上面省钱
棋盘格看着简单,但坑特别多。我见过有人用A4纸打印贴在墙上,结果纸皱了,标定出来焦距偏了5%。
这里列几个硬性要求:
| 项目 | 要求 | 原因 |
|---|---|---|
| 材质 | 陶瓷基板或玻璃基板 | 热胀冷缩小,不易变形 |
| 打印精度 | ≥600dpi,建议1200dpi | 角点位置精度直接影响标定 |
| 棋盘格尺寸 | 每个格子边长10~30mm | 太小看不清,太大覆盖不了视场 |
| 内角点数量 | 建议9×7或11×8 | 太少约束不够,太多检测易出错 |
| 黑白对比度 | 黑白分明,无反光 | 角点检测需要清晰边缘 |
我曾经踩过的坑:用亚克力板做的棋盘格,结果在强光下反光严重,角点检测全偏了。后来换了哑光陶瓷板,问题解决。记住——棋盘格一定要哑光处理。
另外,棋盘格要贴在绝对平整的平面上。我习惯用玻璃板加双面胶,贴好后用直尺检查有没有气泡。嗯,这一步别偷懒。
3.3 标定图片采集规范:角度、距离、光照
照片拍得好不好,直接决定标定质量。我见过有人拍了50张,结果全是正面拍的,标定出来畸变参数完全不对。
3.3.1 角度要求
说白了,你要让棋盘格在相机视场里「动起来」:
- 俯仰角:从-45°到+45°均匀分布
- 偏转角:左右各30°以上
- 旋转角:绕光轴旋转0°、90°、180°各拍几张
- 避免:所有照片角度太接近,那等于只拍了一张
你想想看,如果所有照片都是正面拍的,那畸变参数怎么解?镜头边缘的畸变信息根本采集不到。
3.3.2 距离要求
距离变化也很关键:
- 工作距离附近:在你实际使用相机的距离范围内多拍
- 远近结合:从最近到最远,覆盖整个景深范围
- 棋盘格占比:每张图中棋盘格占画面1/4到1/2
- 注意:太远时角点会模糊,太近时可能超出视场
我的经验:先确定你的结构光系统工作距离,比如是300mm。那么就在200mm、300mm、400mm各拍一组。每组5~6张不同角度。这样标定出来的参数在实际使用中最准。
3.3.3 光照要求
光照问题,我吃过亏。有一次在实验室标定好好的,拿到产线就崩了。为什么?光照变了。
- 均匀照明:避免强光斑和阴影
- 避免反光:棋盘格表面不能有镜面反射
- 亮度适中:黑白格子灰度差>100(8位图)
- 环境光稳定:不要在闪烁的日光灯下拍
这里给个具体的操作建议:
# 标定图片采集检查清单
1. 总张数:15~25张
2. 角度覆盖:俯仰±45°,偏转±30°
3. 距离覆盖:工作距离±30%
4. 光照检查:无高光、无阴影、均匀
5. 清晰度:角点边缘锐利,无运动模糊
6. 棋盘格位置:尽量分布在画面各个区域
3.4 标定结果验证:别急着用
标定完别急着往下走。我习惯做三件事验证:
- 重投影误差:平均误差<0.2像素算优秀,<0.5像素可接受
- 畸变矫正预览:把一张照片做畸变矫正,看看直线是不是变直了
- 重复性测试:同一位置拍两次,标定结果差异<1%
避坑指南:如果重投影误差很大,别急着调算法。先检查——棋盘格是不是皱了?照片是不是模糊了?光照是不是不均匀了?80%的问题出在数据采集阶段,不是算法问题。
好了,相机标定这块就聊到这儿。记住一句话:标定做得有多细,重建就有多准。别嫌麻烦,这一步值得花时间。
公众号:蓝海资料掘金营,微信deep3321