3、相机标定基础:标定板设计、角点检测与张正友法

好,咱们进入正题。相机标定这件事,说白了就是给相机做一次「视力检查」。你想想看,相机镜头天生就有畸变,广角镜头尤其明显——拍出来的直线是弯的,这谁受得了?标定的目的,就是算出畸变参数,然后把它矫正回来。

我个人习惯把标定分成三步:设计标定板 → 检测角点 → 求解参数。今天咱们就按这个顺序来聊。

3.1 标定板设计:棋盘格 vs 圆点阵

标定板长什么样?最常见的有两种:棋盘格圆点阵。我在项目中两种都用过,各有各的脾气。

棋盘格(Checkerboard)

棋盘格是最经典的。黑白格子交替排列,角点就是黑白交界的地方。为什么选它?因为角点检测特别稳定——你想想,黑白交界处的梯度变化最剧烈,算法很容易找到精确位置。

我的经验:棋盘格尺寸别太小。我见过有人用A4纸打印了10×7的格子,结果相机一远,格子糊成一团。建议每个格子边长20-30mm,至少保证图像里格子占20个像素以上。

圆点阵(Circle Grid)

圆点阵是另一种选择。白色背景上印黑色圆点,检测的是圆心位置。它的好处是:圆心定位精度理论上比角点更高(因为圆是中心对称的)。但有个坑——透视变形会让圆变成椭圆,这时候圆心检测就会偏。

对比项 棋盘格 圆点阵
检测目标 角点(黑白交界) 圆心
精度 亚像素级,稳定 受透视影响,需校正
鲁棒性 光照不均时表现好 反光时容易丢点
我的推荐 ✅ 新手首选 ✅ 高精度场景
注意:标定板一定要平整!我曾经用亚克力板打印棋盘格,结果板子有点弯,标定出来的畸变参数全是错的。后来换成玻璃板贴磨砂膜,问题才解决。

3.2 角点检测原理

角点检测,说白了就是找「图像里变化最剧烈的地方」。棋盘格的角点,是四个格子的交界处——上下左右灰度都不同,这种位置最容易被识别。

OpenCV里用的是findChessboardCorners(),它背后是Harris角点检测的改进版。核心思想很简单:

  1. 计算图像每个像素的梯度(x方向和y方向)
  2. 构造一个2×2的矩阵M,里面存的是梯度的平方和
  3. 计算M的特征值——如果两个特征值都很大,说明这里是角点

嗯,这里要注意:Harris检测只能找到「像素级」的角点。但标定需要更高的精度,所以还要做亚像素细化

亚像素细化原理:在粗定位的角点周围,用最小二乘法拟合一个二次曲面,然后找到曲面的极值点。这样精度能从1个像素提升到0.1个像素甚至更高。

OpenCV里调用cornerSubPix()就能做这一步。我建议你每次检测完角点,都画出来看看——如果角点位置明显偏了,说明标定板图像质量有问题。

3.3 张正友标定法核心思想

终于聊到重头戏了。张正友标定法,是1998年张正友教授提出的。它为什么牛?因为只需要拍几张标定板的照片,就能算出相机内参和畸变系数。在此之前,标定需要精密的3D标定块,操作复杂得很。

核心思想其实就一句话:利用平面标定板上的已知点,建立2D图像点到3D世界点的映射关系,然后求解相机参数

具体分四步走:

  1. 计算单应矩阵H——每张标定板图像,都对应一个3×3的单应矩阵,它描述了标定板平面到图像平面的透视变换
  2. 利用H求解内参——通过多张图像的单应矩阵,联立方程解出内参矩阵K
  3. 求解外参——内参已知后,每张图像的外参(旋转和平移)就能算出来了
  4. 优化所有参数——用最大似然估计,把内参、外参、畸变系数一起优化,让重投影误差最小

你可能会问:为什么需要多张图像?因为一张图像只能提供8个约束方程,而内参有5个未知数(fx, fy, cx, cy, skew),加上外参6个,一共11个。一张图不够,至少需要2张。但实际中我建议拍15-20张,覆盖不同角度和距离。

避坑指南:我曾经只拍了8张,结果标定出来的焦距值每次都不一样。后来发现是图像角度变化太小——所有照片都是正对着标定板拍的。记住:标定板要倾斜、旋转、远近都拍,这样才能把畸变参数充分激发出来。

3.4 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以把它当作标定工作的「路线图」:

相机标定核心流程 ① 标定板设计 棋盘格 / 圆点阵 尺寸、平整度、打印精度 ② 图像采集 15-20张不同角度 覆盖倾斜、旋转、远近 ③ 角点检测 Harris + 亚像素 findChessboardCorners ④ 张正友标定法 计算单应矩阵H → 求解内参K → 求解外参 → 全局优化 目标:最小化重投影误差 ⑤ 输出标定结果 内参矩阵K + 畸变系数(k1,k2,p1,p2,k3) 每步都需可视化验证 重投影误差 < 0.5像素

这张图里,每一步都环环相扣。标定板设计不好,角点检测就歪;角点检测不准,张正友法算出来的参数就飘。所以我的建议是:每一步做完都停下来检查一下——画角点、看重投影误差、检查畸变矫正效果。别等到最后才发现问题,那时候返工成本就高了。

好了,标定的理论基础就这些。下一节咱们会动手写代码,把今天讲的这些变成实际的标定程序。到时候你会看到,理论懂了,代码其实就那么几行。


公众号:蓝海资料掘金营,微信deep3321