相机标定从入门到精通:坐标系统、成像模型与三大经典标定算法全解

双目视觉想要做到毫米级甚至亚毫米级测量,相机标定是绕不开的第一道关。它决定了你后续三维重建、尺寸测量的精度天花板。这一章我们就把高宏伟《计算机双目立体视觉》第二章彻底吃透,从坐标系、针孔模型、畸变模型,到DLT、Tsai两步法、张氏平面法,再到预标定、光心优化、实验对比,一次性讲全讲透。


一、为什么标定是双目视觉的“命门”?

先给大家一个灵魂比喻
相机就像人的眼睛,内参是眼球结构(焦距、瞳孔位置、晶状体畸变),外参是脑袋朝向和位置。
不标定 = 戴着度数不对的眼镜看世界,后面无论多厉害的立体匹配算法,都算不准距离、测不准尺寸。

在这里插入图片描述

标定的核心任务只有一件:
建立世界坐标 → 相机坐标 → 图像物理坐标 → 像素坐标的完整映射关系,并修正镜头畸变。


二、四大坐标系:一切标定的起点(全文精读)

书里第二章最基础也最重要的,就是四个坐标系的转换关系,所有公式都从这里来。

在这里插入图片描述

2.1 四大坐标系详解

  1. 世界坐标系 (Xw,Yw,Zw)(X_w,Y_w,Z_w)(Xw,Yw,Zw)

    • 客观世界的绝对坐标系,单位:米/毫米
    • 通俗解释:你站在房间里,墙角为原点,地面为XY平面,竖直向上为Z轴。
  2. 相机坐标系 (Xc,Yc,Zc)(X_c,Y_c,Z_c)(Xc,Yc,Zc)

    • 原点:相机光心(投影中心)
    • Z轴:相机光轴(朝向拍摄方向)
    • 通俗解释:以相机“眼睛”为中心的局部坐标系。
  3. 图像物理坐标系 (x,y)(x,y)(x,y)

    • 原点:主点(光轴与成像平面交点)
    • 单位:毫米
    • 通俗解释:感光芯片上的真实物理位置。
  4. 像素坐标系 (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 三类畸变

  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:径向畸变系数
  2. 切向畸变(离心畸变)

    • 镜头与芯片不平行导致
    • 公式:
      Δ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:切向畸变系数
  3. 薄棱镜畸变

    • 装配误差导致,一般忽略

工程通用畸变模型(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 QA=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角点自动匹配与存储

标定精度靠角点,书里提出了全自动角点排序存储算法

  1. 检测棋盘格角点
  2. 按 u、v 坐标排序
  3. 左右相机角点一一对应
  4. 自动存储,无需人工点选

6.2 改进光心(主点)计算方法

很多人直接把图像中心当主点 (u0,v0)(u_0,v_0)(u0,v0),误差可达20像素
书里给出三种高精度方法:

  1. 直接光学法
  2. 变焦距法
  3. 径向一致约束法(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. 手机双摄拍人像
    标定不准 → 背景虚化把头发、耳朵一起模糊,人物边缘抠图失败。

  2. 工业机器人抓取
    标定误差 1 像素 → 距离 1 米时误差 3~5 mm
    抓不住零件、撞坏夹具。

  3. 自动驾驶
    标定畸变没修正 → 车道线变弯,车距算错,直接追尾。


十、本章总结

  1. 四大坐标系:世界→相机→图像物理→像素
  2. 针孔模型:内参K × 外参[R|T]
  3. 畸变5参数:k1,k2,p1,p2,k3
  4. 三大算法
    • DLT:快但糙
    • Tsai:高精度工业
    • 张氏:最实用、最通用
  5. 预标定+光心优化:精度提升关键
  6. 合格标准:重投影误差 < 0.5 像素,工业 < 0.2 像素

掌握这一章,你就掌握了双目视觉精度的根

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐