《计算机双目立体视觉》高宏伟:第2章-相机标定
相机标定从入门到精通:坐标系统、成像模型与三大经典标定算法全解
双目视觉想要做到毫米级甚至亚毫米级测量,相机标定是绕不开的第一道关。它决定了你后续三维重建、尺寸测量的精度天花板。这一章我们就把高宏伟《计算机双目立体视觉》第二章彻底吃透,从坐标系、针孔模型、畸变模型,到DLT、Tsai两步法、张氏平面法,再到预标定、光心优化、实验对比,一次性讲全讲透。
一、为什么标定是双目视觉的“命门”?
先给大家一个灵魂比喻:
相机就像人的眼睛,内参是眼球结构(焦距、瞳孔位置、晶状体畸变),外参是脑袋朝向和位置。
不标定 = 戴着度数不对的眼镜看世界,后面无论多厉害的立体匹配算法,都算不准距离、测不准尺寸。

标定的核心任务只有一件:
建立世界坐标 → 相机坐标 → 图像物理坐标 → 像素坐标的完整映射关系,并修正镜头畸变。
二、四大坐标系:一切标定的起点(全文精读)
书里第二章最基础也最重要的,就是四个坐标系的转换关系,所有公式都从这里来。

2.1 四大坐标系详解
-
世界坐标系 (Xw,Yw,Zw)(X_w,Y_w,Z_w)(Xw,Yw,Zw)
- 客观世界的绝对坐标系,单位:米/毫米
- 通俗解释:你站在房间里,墙角为原点,地面为XY平面,竖直向上为Z轴。
-
相机坐标系 (Xc,Yc,Zc)(X_c,Y_c,Z_c)(Xc,Yc,Zc)
- 原点:相机光心(投影中心)
- Z轴:相机光轴(朝向拍摄方向)
- 通俗解释:以相机“眼睛”为中心的局部坐标系。
-
图像物理坐标系 (x,y)(x,y)(x,y)
- 原点:主点(光轴与成像平面交点)
- 单位:毫米
- 通俗解释:感光芯片上的真实物理位置。
-
像素坐标系 (u,v)(u,v)(u,v)
- 原点:图像左上角
- 单位:像素
- 通俗解释:我们在电脑上看到的图片坐标。
三、针孔成像模型:最核心的投影公式
这是双目视觉最核心公式,必须背下来。

3.1 像素与世界坐标的投影关系
Zc[uv1]=[f/dxsu00f/dyv0001][RT][XwYwZw1]=[kusu00kvv0001][RT][XwYwZw1] Z_{c}\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} =\begin{bmatrix} f/dx & s & u_{0} \\ 0 & f/dy & v_{0} \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} R & T \end{bmatrix} \begin{bmatrix} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{bmatrix} =\begin{bmatrix} k_{u} & s & u_{0} \\ 0 & k_{v} & v_{0} \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} R & T \end{bmatrix} \begin{bmatrix} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{bmatrix} Zc uv1 = f/dx00sf/dy0u0v01 [RT] XwYwZw1 = ku00skv0u0v01 [RT] XwYwZw1
=K[RT][XwYwZw1]=P[XwYwZw1] = \boldsymbol{K} \begin{bmatrix} \boldsymbol{R} & \boldsymbol{T} \end{bmatrix} \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix} = \boldsymbol{P} \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix} =K[RT] XwYwZw1 =P XwYwZw1
每个符号的通俗解释
- ZcZ_cZc:点在相机前方的深度(距离)
- u,vu,vu,v:像素坐标(你看到的图片位置)
- fx,fyf_x,f_yfx,fy:焦距(像素单位)→ 相机“望远能力”
- u0,v0u_0,v_0u0,v0:主点坐标 → 光轴打在芯片的中心点
- RRR:旋转矩阵 → 相机转头
- TTT:平移向量 → 相机挪位置
- Xw,Yw,ZwX_w,Y_w,Z_wXw,Yw,Zw:世界坐标 → 物体真实位置
这就是内参矩阵 K × 外参矩阵 [R|T] 的标准形式。
四、镜头畸变模型:为什么直线会变弯?
真实镜头不是理想针孔,会产生畸变,不修正永远测不准。

4.1 三类畸变
-
径向畸变
- 枕形/桶形畸变,边缘最明显
- 公式:
Δxr=x(k1r2+k2r4)Δyr=y(k1r2+k2r4) \Delta x_r = x(k_1 r^2 + k_2 r^4)\\ \Delta y_r = y(k_1 r^2 + k_2 r^4) Δxr=x(k1r2+k2r4)Δyr=y(k1r2+k2r4) - r=x2+y2r=\sqrt{x^2+y^2}r=x2+y2:到图像中心距离
- k1,k2k_1,k_2k1,k2:径向畸变系数
-
切向畸变(离心畸变)
- 镜头与芯片不平行导致
- 公式:
Δxd=2p1xy+p2(r2+2x2)Δyd=p1(r2+2y2)+2p2xy \Delta x_d = 2p_1xy + p_2(r^2+2x^2)\\ \Delta y_d = p_1(r^2+2y^2) + 2p_2xy Δxd=2p1xy+p2(r2+2x2)Δyd=p1(r2+2y2)+2p2xy - p1,p2p_1,p_2p1,p2:切向畸变系数
-
薄棱镜畸变
- 装配误差导致,一般忽略
工程通用畸变模型(5参数):
{xcorr=x(1+k1r2+k2r4)+2p1xy+p2(r2+2x2)ycorr=y(1+k1r2+k2r4)+p1(r2+2y2)+2p2xy \left\{ \begin{aligned} x_{corr} &= x(1+k_1r^2+k_2r^4)+2p_1xy+p_2(r^2+2x^2)\\ y_{corr} &= y(1+k_1r^2+k_2r^4)+p_1(r^2+2y^2)+2p_2xy \end{aligned} \right. {xcorrycorr=x(1+k1r2+k2r4)+2p1xy+p2(r2+2x2)=y(1+k1r2+k2r4)+p1(r2+2y2)+2p2xy
五、三大经典标定算法
书里第二章重点讲了DLT、Tsai两步法、张氏平面法,这是工业界最常用的三种。

5.1 直接线性变换 DLT
最简单、最快、但精度一般
- 最少需要 6个3D-2D对应点
- 把投影矩阵当成11个未知数,直接解线性方程组
- 优点:不用迭代、速度快
- 缺点:不考虑畸变、对噪声敏感
核心方程:
Q⋅A=0 Q \cdot A = 0 Q⋅A=0
通过SVD分解求最小特征值对应向量。
5.2 Tsai 两步标定法
工业高精度标定王者
- 第一步:线性求外参 R、T
- 第二步:非线性优化求焦距 fff、畸变系数 k1k_1k1
- 专门针对小畸变、长焦距镜头优化
- 精度极高,是早期机器视觉标配
核心公式(径向畸变):
Xd=Xu(1+k1r2) X_d = X_u (1+k_1r^2) Xd=Xu(1+k1r2)
5.3 张氏平面标定法
现在最流行、最实用的方法
- 只需要打印一张棋盘格,随便拍10~20张
- 不需要高精度标定台
- 先求单应性矩阵 HHH,再解内参,最后优化畸变
单应性矩阵:
s[uv1]=H[XwYw1] s \begin{bmatrix} u\\ v\\ 1 \end{bmatrix} = H \begin{bmatrix} X_w\\ Y_w\\ 1 \end{bmatrix} s
uv1
=H
XwYw1
六、相机预标定与光心优化
书里这部分是进阶干货,很多教材不讲,但对精度提升巨大。
6.1 Harris角点自动匹配与存储
标定精度靠角点,书里提出了全自动角点排序存储算法:
- 检测棋盘格角点
- 按 u、v 坐标排序
- 左右相机角点一一对应
- 自动存储,无需人工点选
6.2 改进光心(主点)计算方法
很多人直接把图像中心当主点 (u0,v0)(u_0,v_0)(u0,v0),误差可达20像素!
书里给出三种高精度方法:
- 直接光学法
- 变焦距法
- 径向一致约束法(RAC)
并给出了移动米尺法,工程上非常好用。
七、实验结果与对比
下面是书里第二章最关键的实验表格,直接决定你写简历用什么数据。
7.1 三种光心计算方法对比
| 方法 | 光心坐标 | X误差 | Y误差 | Z误差 |
|---|---|---|---|---|
| 改进径向一致约束法 | (195,149.5) | 0.495 | 0.865 | 1.819 |
| 直接光学法 | 高精度参考 | 0.51 | 0.85 | 1.80 |
| 直接取图像中心 | (176,144) | 1.421 | 1.381 | 显著偏大 |
结论:
光心不准 → Z深度误差直接翻倍!标定必须精确求解 (u0,v0)(u_0,v_0)(u0,v0)。
7.2 标定方法精度对比(表2-2 多畸变系数仿DLT最优)
| 算法 | 标定平均X误差 | 标定平均Y误差 | 标定平均Z误差 |
|---|---|---|---|
| 普通仿DLT | 0.103 | 0.081 | 0.448 |
| 改进仿DLT | 0.111 | 0.080 | 0.380 |
| 多畸变系数仿DLT | 0.086 | 0.076 | 0.341 |
结论:
同时考虑径向+切向畸变,精度提升最明显。
八、核心代码:张氏棋盘格标定
import cv2
import numpy as np
import glob
# 棋盘格规格
CHECKERBOARD = (9, 6)
square_size = 25.0 # mm
# 亚像素终止条件
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# 3D点
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
objpoints = []
imgpoints = []
images = glob.glob('./calib/*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, None)
if ret:
objpoints.append(objp)
corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
imgpoints.append(corners2)
# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
objpoints, imgpoints, gray.shape[::-1], None, None
)
print("=== 相机内参矩阵 K ===")
print(mtx)
print("=== 畸变系数 k1,k2,p1,p2 ===")
print(dist)
print("=== 重投影误差 =", ret, "像素 ===")
输出指标直接写简历:
- 重投影误差:0.15 像素以内
- 内参矩阵:fx,fy,cx,cy
- 畸变系数:k1,k2,p1,p2
九、趣味案例:标定不准有多坑?
-
手机双摄拍人像
标定不准 → 背景虚化把头发、耳朵一起模糊,人物边缘抠图失败。 -
工业机器人抓取
标定误差 1 像素 → 距离 1 米时误差 3~5 mm
抓不住零件、撞坏夹具。 -
自动驾驶
标定畸变没修正 → 车道线变弯,车距算错,直接追尾。
十、本章总结
- 四大坐标系:世界→相机→图像物理→像素
- 针孔模型:内参K × 外参[R|T]
- 畸变5参数:k1,k2,p1,p2,k3
- 三大算法:
- DLT:快但糙
- Tsai:高精度工业
- 张氏:最实用、最通用
- 预标定+光心优化:精度提升关键
- 合格标准:重投影误差 < 0.5 像素,工业 < 0.2 像素
掌握这一章,你就掌握了双目视觉精度的根。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)