相机标定与畸变

核心03-相机与三维几何预计 30 分钟标定畸变张正友方法重投影误差

前置知识点

kp-010 针孔相机模型与投影

一句话定义

相机标定通过拍摄已知几何图案(通常是棋盘格)的多个姿态,联合求解内参 K、外参 [R|t] 与畸变系数,使三维点经投影后的重投影误差最小。

为什么重要

畸变让直线变弯、让测量失真:AR 叠加要「贴得准」、立体视觉要「行对齐」、SLAM 要「投影一致」,前提都是一套可靠的 K 与畸变参数;标定是所有度量级视觉任务的第一道工序,也是判断一套视觉系统是否「做得认真」的试金石。

直观类比

给相机做一次「验光」:拿一张已知方格的视力表(棋盘格)摆出十几个姿势,让相机记录「它以为的方格位置」,再调整处方(K 与畸变系数),直到它说的位置与真实位置平均偏差最小——处方好不好,用重投影误差这个「视力值」来量化。

前置知识

kp-010(投影方程与 K)。

核心概念

原理与机制

每个棋盘角点的世界坐标由「格点 + 平面假设」精确已知,图像中用角点检测(亚像素)得到观测坐标;于是每张图提供一组「3D 点 ↔ 2D 点」对应,标定就是解一个大的非线性最小二乘:未知量含 5 个内参(fx, fy, cx, cy, γ)、每张图 6 个外参、以及 4–8 个畸变系数。张正友方法先用线性解(忽略畸变)得到闭式初值,再整体非线性优化(Levenberg–Marquardt),避免直接优化陷入局部极小。畸变建模以归一化坐标 r² = x² + y² 为自变量,低阶多项式即可覆盖普通镜头;重投影误差好于 0.5 像素、畸变参数量级合理即视为标定可信。

公式与模型

x_d = x(1 + k1·r² + k2·r⁴ + k3·r⁶) + 2p1·x·y + p2·(r² + 2x²) y_d = y(1 + k1·r² + k2·r⁴ + k3·r⁶) + p1·(r² + 2y²) + 2p2·x·y 其中 r² = x² + y²,(x, y) 为归一化坐标,(xd, yd) 为畸变后坐标 RMS = √( Σ ‖ 观测角点 − 投影角点 ‖² / N )

图示

枕形畸变(虚线为理想直线) 多姿态棋盘 → 角点检测 → 线性初值 → 非线性优化 → K + 畸变系数 + 每图外参 验收:重投影 RMS 常见达标线 约 0.1 至 0.5 像素

实例与案例

打印机打印 A4 棋盘贴硬板(必须平整),从不同角度、覆盖画面各区域拍 15–20 张,OpenCV 一条管线出 K、畸变向量与每图外参。双目系统的双相机需分别标定再立体标定(求相对位姿),行对齐质量直接决定 kp-013 视差计算的搜索效率。工业尺寸测量要求标定板高精度(玻璃基板),并把温度漂移纳入复标周期。

import cv2, glob
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
und = cv2.undistort(img, mtx, dist, None, mtx)
rms = ret      # 重投影均方根误差(像素)

常见误区

与其他知识点的关系

标定出的 K 参与 kp-012 的 E→F 换算;去畸变是 kp-013 立体匹配的前置工序;SLAM(kp-014)的投影残差依赖全程固定一致的 K 与畸变参数。

自测题

  1. 为什么标定需要多个姿态的棋盘图像?

答案要点:单视角下内参与外参耦合(尺度/角度简并),多视角提供独立约束,才能把内参分离出来。

  1. 重投影误差 2 像素的标定能用吗?

答案要点:视用途而定;AR/测量级场景偏大,通常应排查角点检测或标定板平整度,压到 0.5 像素以内。

  1. 径向与切向畸变分别来自什么?

答案要点:径向来自镜头曲面形状(桶形/枕形),切向来自镜头组与传感器平面不平行(装配偏斜)。

延伸阅读

相关知识点

kp-013 立体视觉与深度kp-014 三维重建与视觉 SLAM 概览