3. 张正友标定法概述
大家好,欢迎来到第三章。
这一章我们不讲公式,也不写代码。我想先跟你聊聊——我们为什么要做相机标定?
说白了,相机就是个“测量工具”。它把三维世界投影到二维图像上。但这个投影过程,不是完美的。镜头有畸变,传感器有安装误差,像素不是正方形……这些乱七八糟的因素加在一起,导致你拍出来的图像和真实世界之间,存在一个“扭曲”的关系。
标定,就是把这个扭曲关系给算出来。
3.1 为什么需要标定?
我刚开始做视觉项目时,犯过一个低级错误。当时做一个测量系统,相机固定好了,拍了张棋盘格,直接拿像素距离当真实距离算。结果呢?误差大到离谱。后来才发现,我连相机内参都没标,更别提畸变了。
你想想看,一个镜头,尤其是广角镜头,边缘的畸变能把直线拍成弧线。如果不做标定,你拿什么去做三维重建?拿什么去做精准测量?
标定的核心目的:
- 求解内参矩阵:焦距、主点坐标、像素倾斜因子
- 求解畸变系数:径向畸变、切向畸变
- 建立世界坐标到像素坐标的映射关系
没有标定,你的相机就是一个“盲人”。有了标定,它才能变成一个“测量仪”。
3.2 张正友标定法的核心思想
张正友教授在1998年提出的这个方法,为什么能成为行业标准?
我个人觉得,最大的贡献在于——它把标定这件事,从实验室搬到了普通人的桌面上。
在此之前,标定需要高精度的三维标定块,又贵又难用。张正友的方法,只需要你打印一张棋盘格,贴在平面上,拍几张不同角度的照片就行。
核心思想其实就一句话:利用平面棋盘格上的已知角点,建立单应性矩阵,再通过多张图片的约束,求解相机参数。
具体来说,它做了这么几件事:
- 假设棋盘格平面为 Z=0,简化世界坐标到图像坐标的映射
- 求解单应性矩阵 H,每张图片对应一个 H
- 利用 H 的约束条件,求解内参矩阵
- 利用内参反推外参(旋转矩阵和平移向量)
- 考虑畸变,用最小二乘法优化所有参数
嗯,这里要注意:它不是一个一次性求解的过程。它分两步走——先线性求解初值,再用非线性优化精调。这个思路,在计算机视觉里非常常见。
我的经验:张正友标定法对棋盘格的质量要求不高,但对图片数量和质量有要求。我曾经只拍了5张图,结果标定出来的畸变系数飘得厉害。后来加到15张,结果就稳了。
3.3 算法流程总览
我们来看一下整个流程。我习惯把它分成四个阶段:
| 阶段 | 输入 | 输出 | 关键操作 |
|---|---|---|---|
| 1. 数据准备 | 棋盘格图片 | 角点坐标 | 角点检测、亚像素精化 |
| 2. 线性求解 | 角点坐标 | 内参、外参初值 | 单应性矩阵分解、闭合解 |
| 3. 畸变估计 | 内参、外参初值 | 畸变系数初值 | 最小二乘求解畸变参数 |
| 4. 全局优化 | 所有初值 | 最终标定结果 | Levenberg-Marquardt 非线性优化 |
这个流程,说白了就是:先猜一个大概,再慢慢调准。
下面这张图,我把整个流程画出来了,你可以对照着看:
3.4 为什么张正友标定法这么流行?
我总结了几点:
- 操作简单:一张棋盘格,一台相机,搞定
- 精度高:只要图片质量好,标定结果可以媲美传统三维标定块
- 鲁棒性好:对棋盘格打印精度要求不高,普通打印机就能用
- 数学优雅:先线性后非线性,既有解析解又有优化解
注意:张正友标定法假设棋盘格是平面。如果你的棋盘格贴在不平的表面上,标定结果会出问题。我曾经见过有人把棋盘格贴在弯曲的纸箱上,结果标出来的畸变系数完全不对。
3.5 你需要准备什么?
在进入下一章之前,我建议你先准备好这些东西:
- 一张棋盘格:7×10 或 8×11 的格子,打印在 A4 纸上
- 一台相机:手机也行,但最好固定焦距
- 15-20 张不同角度的棋盘格照片:注意,角度要丰富,不要全在同一个平面
- OpenCV 环境:Python 或 C++ 都行
嗯,这里有个小技巧:拍照时,让棋盘格占画面的一半左右,不要太远也不要太近。太远了角点检测不准,太近了畸变影响太大。