3. 张正友标定法概述

大家好,欢迎来到第三章。

这一章我们不讲公式,也不写代码。我想先跟你聊聊——我们为什么要做相机标定?

说白了,相机就是个“测量工具”。它把三维世界投影到二维图像上。但这个投影过程,不是完美的。镜头有畸变,传感器有安装误差,像素不是正方形……这些乱七八糟的因素加在一起,导致你拍出来的图像和真实世界之间,存在一个“扭曲”的关系。

标定,就是把这个扭曲关系给算出来。

3.1 为什么需要标定?

我刚开始做视觉项目时,犯过一个低级错误。当时做一个测量系统,相机固定好了,拍了张棋盘格,直接拿像素距离当真实距离算。结果呢?误差大到离谱。后来才发现,我连相机内参都没标,更别提畸变了。

你想想看,一个镜头,尤其是广角镜头,边缘的畸变能把直线拍成弧线。如果不做标定,你拿什么去做三维重建?拿什么去做精准测量?

标定的核心目的:

  • 求解内参矩阵:焦距、主点坐标、像素倾斜因子
  • 求解畸变系数:径向畸变、切向畸变
  • 建立世界坐标到像素坐标的映射关系

没有标定,你的相机就是一个“盲人”。有了标定,它才能变成一个“测量仪”。

3.2 张正友标定法的核心思想

张正友教授在1998年提出的这个方法,为什么能成为行业标准?

我个人觉得,最大的贡献在于——它把标定这件事,从实验室搬到了普通人的桌面上。

在此之前,标定需要高精度的三维标定块,又贵又难用。张正友的方法,只需要你打印一张棋盘格,贴在平面上,拍几张不同角度的照片就行。

核心思想其实就一句话:利用平面棋盘格上的已知角点,建立单应性矩阵,再通过多张图片的约束,求解相机参数。

具体来说,它做了这么几件事:

  1. 假设棋盘格平面为 Z=0,简化世界坐标到图像坐标的映射
  2. 求解单应性矩阵 H,每张图片对应一个 H
  3. 利用 H 的约束条件,求解内参矩阵
  4. 利用内参反推外参(旋转矩阵和平移向量)
  5. 考虑畸变,用最小二乘法优化所有参数

嗯,这里要注意:它不是一个一次性求解的过程。它分两步走——先线性求解初值,再用非线性优化精调。这个思路,在计算机视觉里非常常见。

我的经验:张正友标定法对棋盘格的质量要求不高,但对图片数量和质量有要求。我曾经只拍了5张图,结果标定出来的畸变系数飘得厉害。后来加到15张,结果就稳了。

3.3 算法流程总览

我们来看一下整个流程。我习惯把它分成四个阶段:

阶段 输入 输出 关键操作
1. 数据准备 棋盘格图片 角点坐标 角点检测、亚像素精化
2. 线性求解 角点坐标 内参、外参初值 单应性矩阵分解、闭合解
3. 畸变估计 内参、外参初值 畸变系数初值 最小二乘求解畸变参数
4. 全局优化 所有初值 最终标定结果 Levenberg-Marquardt 非线性优化

这个流程,说白了就是:先猜一个大概,再慢慢调准。

下面这张图,我把整个流程画出来了,你可以对照着看:

张正友标定法算法流程总览 张正友标定法算法流程总览 阶段1:数据准备 拍摄棋盘格图片 → 角点检测 → 亚像素精化 阶段2:线性求解 计算单应性矩阵 H → 分解 H 求解内参、外参初值 阶段3:畸变估计 利用内参初值 → 最小二乘求解畸变系数 阶段4:全局优化(Levenberg-Marquardt) 输出:内参矩阵 + 畸变系数 + 每张图片的外参

3.4 为什么张正友标定法这么流行?

我总结了几点:

  • 操作简单:一张棋盘格,一台相机,搞定
  • 精度高:只要图片质量好,标定结果可以媲美传统三维标定块
  • 鲁棒性好:对棋盘格打印精度要求不高,普通打印机就能用
  • 数学优雅:先线性后非线性,既有解析解又有优化解

注意:张正友标定法假设棋盘格是平面。如果你的棋盘格贴在不平的表面上,标定结果会出问题。我曾经见过有人把棋盘格贴在弯曲的纸箱上,结果标出来的畸变系数完全不对。

3.5 你需要准备什么?

在进入下一章之前,我建议你先准备好这些东西:

  1. 一张棋盘格:7×10 或 8×11 的格子,打印在 A4 纸上
  2. 一台相机:手机也行,但最好固定焦距
  3. 15-20 张不同角度的棋盘格照片:注意,角度要丰富,不要全在同一个平面
  4. OpenCV 环境:Python 或 C++ 都行

嗯,这里有个小技巧:拍照时,让棋盘格占画面的一半左右,不要太远也不要太近。太远了角点检测不准,太近了畸变影响太大。