从零吃透张氏标定:原理、流程与实战(最经典的相机标定算法)
在机器视觉、三维重建、SLAM、AR/VR 领域,相机标定是绕不开的第一步。而张氏标定法(Zhang’s Calibration) 凭借精度高、操作简单、仅需打印棋盘格的优势,成为工业界和学术界最主流的标定算法,没有之一。
本文从原理、数学模型、标定流程、代码实战四个维度,把张氏标定讲透,让你从理论到实践完全掌握。
一、什么是相机标定?为什么需要它?
相机本质是把三维世界坐标投影到二维图像像素的设备,但这个过程会产生两类误差:
- 内参误差:相机自身的焦距、主点、像素缩放等固有属性;
- 畸变误差:镜头物理特性导致的图像边缘拉伸/收缩(径向畸变、切向畸变)。
标定的目标:求解相机内参矩阵 + 畸变系数 + 拍摄时的外参(旋转+平移),为后续三维计算提供精准的数学模型。
传统标定 vs 张氏标定
| 方法 | 设备要求 | 复杂度 | 精度 | 主流场景 |
|---|---|---|---|---|
| 传统标定法 | 高精度三维标定块 | 极高 | 高 | 实验室精密测量 |
| 张氏标定 | 打印棋盘格(2D平面) | 极低 | 极高 | 工业视觉、机器人、无人机 |
核心结论:张氏标定用最简单的设备实现了工业级精度,这就是它统治行业的原因。
二、张氏标定核心数学模型(小白也能看懂)
1. 相机投影基础公式
三维点 PwP_wPw → 图像像素点 ppp 的完整投影链:
- fx,fyf_x,f_yfx,fy:焦距(像素单位)
- cx,cyc_x,c_ycx,cy:主点(图像中心)
- RRR:旋转矩阵(3×3)
- ttt:平移向量(3×1)
- sss:尺度因子
2. 张氏标定的核心创新
张正友教授在 2000 年提出单平面标定:
让相机拍摄不同角度、不同位置的平面棋盘格,利用平面约束(标定板 Z=0) 大幅简化计算。
核心推导:
因为标定板在世界坐标系中 Zw=0Z_w=0Zw=0,外参可以简化为单应性矩阵(Homography) HHH:
H=K[R1 R2 t]H = K[R_1\ R_2\ t]H=K[R1 R2 t]
通过至少3张棋盘格图像求解多组 HHH,即可联立方程解出 KKK 和畸变系数。
3. 畸变模型(标定必求参数)
张氏标定默认求解5个畸变系数(OpenCV 标准模型):
k1,k2,p1,p2,k3 k_1,k_2,p_1,p_2,k_3 k1,k2,p1,p2,k3
- k1,k2,k3k_1,k_2,k_3k1,k2,k3:径向畸变(桶形/枕形畸变)
- p1,p2p_1,p_2p1,p2:切向畸变(镜头安装偏心)
三、张氏标定完整流程(标准工业流程)
准备工作
- 打印棋盘格:A4纸打印标准棋盘格(推荐 9×6 角点,方格尺寸 20mm~30mm);
- 固定棋盘格:贴在平整硬板上,保证无弯曲;
- 拍摄图像:相机固定,移动棋盘格,拍摄10~20张不同姿态的图片。
✅ 拍摄要点
- 棋盘格占画面 1/3~2/3;
- 覆盖图像四个角+中心;
- 包含倾斜、旋转、远近不同姿态;
- 图片清晰无模糊。
标定步骤
- 角点提取:自动检测棋盘格角点坐标;
- 单应性矩阵求解:每张图计算一个单应矩阵;
- 内参初值求解:用多组单应矩阵解出内参;
- 畸变系数优化:最小二乘法拟合畸变;
- 全局非线性优化:LM算法优化所有参数,得到最终精准结果。
四、OpenCV Python 实战代码(直接运行)
这是开箱即用的张氏标定代码,只需替换图片路径即可。
1. 依赖安装
pip install opencv-python numpy
2. 完整标定代码
import cv2
import numpy as np
import glob
# ===================== 1. 参数配置 =====================
# 棋盘格角点尺寸 (横向角点数, 纵向角点数)
CHECKERBOARD = (9, 6)
# 每个方格的物理尺寸 (单位:mm)
SQUARE_SIZE = 25.0
# 标定图片路径(替换成你的图片路径)
img_paths = glob.glob("./calib_images/*.jpg")
# 终止条件:角点亚像素优化
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# ===================== 2. 准备世界坐标点 =====================
objp = np.zeros((CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2) * SQUARE_SIZE
# 存储3D点和2D点
obj_points = [] # 世界坐标系3D点
img_points = [] # 图像坐标系2D点
# ===================== 3. 提取角点 =====================
valid_img_num = 0
for path in img_paths:
img = cv2.imread(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, None)
if ret:
valid_img_num += 1
obj_points.append(objp)
# 亚像素优化,提高精度
corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
img_points.append(corners2)
# 绘制角点
cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret)
cv2.imshow("Corners", img)
cv2.waitKey(100)
cv2.destroyAllWindows()
print(f"有效标定图片数量:{valid_img_num}")
# ===================== 4. 执行张氏标定 =====================
print("\n========== 开始标定 ==========")
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
obj_points, img_points, gray.shape[::-1], None, None
)
# ===================== 5. 输出结果 =====================
print("\n===== 相机内参矩阵 K =====")
print(mtx)
print("\n===== 畸变系数 [k1,k2,p1,p2,k3] =====")
print(dist)
print("\n===== 标定重投影误差 (越小越好) =====")
print(f"误差:{ret:.4f} 像素")
# ===================== 6. 畸变校正(测试) =====================
test_img = cv2.imread(img_paths[0])
h, w = test_img.shape[:2]
new_mtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
# 校正图像
dst = cv2.undistort(test_img, mtx, dist, None, new_mtx)
# 保存结果
cv2.imwrite("calib_result.jpg", dst)
print("\n畸变校正完成,结果已保存为 calib_result.jpg")
3. 结果解读
- 内参矩阵:相机核心参数,用于三维投影计算;
- 畸变系数:用于图像去畸变;
- 重投影误差:标定精度指标,<0.5px 为优秀,<1px 为良好。
五、关键问题与避坑指南
1. 标定失败/误差大?
- 棋盘格不平整(最大原因);
- 图片模糊、过曝、欠曝;
- 姿态太少,没有倾斜角度;
- 角点检测错误。
2. 最少需要几张图?
理论:3张
工业推荐:10~20张
3. 棋盘格怎么选?
- 角点:9×6 最通用;
- 方格尺寸:20~30mm(相机焦距不同可调整)。
六、总结
张氏标定是2D平面标定的巅峰,它用极简方案解决了机器视觉的核心问题:
- 原理:利用平面约束 + 单应性矩阵求解内参、畸变、外参;
- 流程:打印棋盘格 → 多角度拍摄 → 角点提取 → 非线性优化;
- 实战:OpenCV 一行函数完成标定,重投影误差是精度金标准。
掌握张氏标定,你就掌握了机器视觉三维计算的钥匙,无论是做测量、定位、重建都能轻松上手。
总结
- 张氏标定是工业界最主流的相机标定方法,无需高精度设备,精度极高;
- 核心是平面棋盘格+单应性矩阵,求解内参+畸变+外参三大参数;
- 重投影误差**<1像素**代表标定合格;
- 提供的Python代码可直接用于项目,适配所有常规相机。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)