10  相机标定与几何

10.1 引言:为什么需要相机标定?

当我们用手机拍照时,很少思考这样一个问题:照片中的每个像素是如何与现实世界中的物体建立对应关系的?这个看似简单的问题,实际上涉及复杂的几何变换过程。相机标定正是要解决这个基础问题:建立图像坐标与现实世界坐标之间的精确映射关系。

10.2 核心概念

针孔相机模型是理解相机成像的基础。想象一个不透光的盒子,前面开一个小孔,后面放一块感光板。外界的光线通过小孔投射到感光板上,形成倒立的图像。这就是最简单的针孔相机模型。

现代数码相机的工作原理与此类似,只是用透镜组替代了小孔,用图像传感器替代了感光板。透镜组的作用是聚焦光线,提高成像质量;图像传感器则将光信号转换为数字信号。

坐标系变换关系描述了从三维世界到二维图像的完整过程。这个过程涉及四个坐标系:世界坐标系、相机坐标系、图像坐标系和像素坐标系。理解这些坐标系之间的关系,是掌握相机几何的关键。

Code
graph LR
    subgraph 三维世界
        P["物体点P(X,Y,Z)"]
    end

    subgraph 相机系统
        O["光心O"]
        F["图像平面"]
    end

    subgraph 成像结果
        P2["像点p(u,v)"]
    end

    P -->|光线| O
    O -->|投影| P2

    classDef worldNode fill:#5c6bc0,stroke:#3949ab,color:white,stroke-width:2px,font-weight:bold,font-size:14px,border-radius:8px
    classDef cameraNode fill:#26a69a,stroke:#00897b,color:white,stroke-width:2px,font-weight:bold,font-size:14px,border-radius:8px
    classDef imageNode fill:#ec407a,stroke:#d81b60,color:white,stroke-width:2px,font-weight:bold,font-size:14px,border-radius:8px
    classDef worldSubgraph fill:#e8eaf6,stroke:#3949ab,stroke-width:2px,color:#283593,font-weight:bold
    classDef cameraSubgraph fill:#e0f2f1,stroke:#00897b,stroke-width:2px,color:#00695c,font-weight:bold
    classDef imageSubgraph fill:#fce4ec,stroke:#d81b60,stroke-width:2px,color:#ad1457,font-weight:bold

    class P worldNode
    class O,F cameraNode
    class P2 imageNode
    class 三维世界 worldSubgraph
    class 相机系统 cameraSubgraph
    class 成像结果 imageSubgraph

    linkStyle 0 stroke:#5c6bc0,stroke-width:2px,stroke-dasharray:5 5
    linkStyle 1 stroke:#ec407a,stroke-width:2px

graph LR
    subgraph 三维世界
        P["物体点P(X,Y,Z)"]
    end

    subgraph 相机系统
        O["光心O"]
        F["图像平面"]
    end

    subgraph 成像结果
        P2["像点p(u,v)"]
    end

    P -->|光线| O
    O -->|投影| P2

    classDef worldNode fill:#5c6bc0,stroke:#3949ab,color:white,stroke-width:2px,font-weight:bold,font-size:14px,border-radius:8px
    classDef cameraNode fill:#26a69a,stroke:#00897b,color:white,stroke-width:2px,font-weight:bold,font-size:14px,border-radius:8px
    classDef imageNode fill:#ec407a,stroke:#d81b60,color:white,stroke-width:2px,font-weight:bold,font-size:14px,border-radius:8px
    classDef worldSubgraph fill:#e8eaf6,stroke:#3949ab,stroke-width:2px,color:#283593,font-weight:bold
    classDef cameraSubgraph fill:#e0f2f1,stroke:#00897b,stroke-width:2px,color:#00695c,font-weight:bold
    classDef imageSubgraph fill:#fce4ec,stroke:#d81b60,stroke-width:2px,color:#ad1457,font-weight:bold

    class P worldNode
    class O,F cameraNode
    class P2 imageNode
    class 三维世界 worldSubgraph
    class 相机系统 cameraSubgraph
    class 成像结果 imageSubgraph

    linkStyle 0 stroke:#5c6bc0,stroke-width:2px,stroke-dasharray:5 5
    linkStyle 1 stroke:#ec407a,stroke-width:2px

图11.1:针孔相机模型展示了光线通过光心投射到图像平面的几何关系

Code
graph TD
    A["世界坐标系<br/>(Xw, Yw, Zw)"] -->|旋转R + 平移t| B["相机坐标系<br/>(Xc, Yc, Zc)"]
    B -->|透视投影<br/>除以Zc| C["归一化坐标系<br/>(x, y)"]
    C -->|内参矩阵K<br/>fx, fy, cx, cy| D["像素坐标系<br/>(u, v)"]

    subgraph 外参变换
        E["刚体变换<br/>6个自由度"]
    end

    subgraph 内参变换
        F["传感器特性<br/>4个参数"]
    end

    A -.-> E
    C -.-> F

    classDef coordNode fill:#42a5f5,stroke:#1565c0,color:white,stroke-width:2px,font-weight:bold,font-size:14px,border-radius:8px
    classDef paramNode fill:#9c27b0,stroke:#6a1b9a,color:white,stroke-width:2px,font-weight:bold,font-size:14px,border-radius:8px
    classDef extSubgraph fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,color:#0d47a1,font-weight:bold
    classDef intSubgraph fill:#f3e5f5,stroke:#6a1b9a,stroke-width:2px,color:#4a148c,font-weight:bold

    class A,B,C,D coordNode
    class E,F paramNode
    class 外参变换 extSubgraph
    class 内参变换 intSubgraph

    linkStyle 0 stroke:#1565c0,stroke-width:2px
    linkStyle 1 stroke:#0097a7,stroke-width:2px
    linkStyle 2 stroke:#ad1457,stroke-width:2px
    linkStyle 3,4 stroke:#6a1b9a,stroke-width:1.5px,stroke-dasharray:3 3

    %% 移除渐变定义,使用单色填充

graph TD
    A["世界坐标系<br/>(Xw, Yw, Zw)"] -->|旋转R + 平移t| B["相机坐标系<br/>(Xc, Yc, Zc)"]
    B -->|透视投影<br/>除以Zc| C["归一化坐标系<br/>(x, y)"]
    C -->|内参矩阵K<br/>fx, fy, cx, cy| D["像素坐标系<br/>(u, v)"]

    subgraph 外参变换
        E["刚体变换<br/>6个自由度"]
    end

    subgraph 内参变换
        F["传感器特性<br/>4个参数"]
    end

    A -.-> E
    C -.-> F

    classDef coordNode fill:#42a5f5,stroke:#1565c0,color:white,stroke-width:2px,font-weight:bold,font-size:14px,border-radius:8px
    classDef paramNode fill:#9c27b0,stroke:#6a1b9a,color:white,stroke-width:2px,font-weight:bold,font-size:14px,border-radius:8px
    classDef extSubgraph fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,color:#0d47a1,font-weight:bold
    classDef intSubgraph fill:#f3e5f5,stroke:#6a1b9a,stroke-width:2px,color:#4a148c,font-weight:bold

    class A,B,C,D coordNode
    class E,F paramNode
    class 外参变换 extSubgraph
    class 内参变换 intSubgraph

    linkStyle 0 stroke:#1565c0,stroke-width:2px
    linkStyle 1 stroke:#0097a7,stroke-width:2px
    linkStyle 2 stroke:#ad1457,stroke-width:2px
    linkStyle 3,4 stroke:#6a1b9a,stroke-width:1.5px,stroke-dasharray:3 3

    %% 移除渐变定义,使用单色填充

图11.2:从世界坐标系到像素坐标系的完整变换链

10.3 理论基础:分步推导

相机投影变换可以分解为三个连续的步骤,每一步都有明确的几何意义。

步骤1:世界坐标到相机坐标

世界坐标系是我们建立的参考坐标系,通常选择场景中的某个固定点作为原点。相机坐标系则以相机光心为原点,光轴为Z轴。从世界坐标到相机坐标的变换包括旋转和平移:

\begin{bmatrix} X_c \\ Y_c \\ Z_c \end{bmatrix} = \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix} \begin{bmatrix} X_w \\ Y_w \\ Z_w \end{bmatrix} + \begin{bmatrix} t_x \\ t_y \\ t_z \end{bmatrix}

其中,\mathbf{R} = [r_{ij}]3 \times 3旋转矩阵,\mathbf{t} = [t_x, t_y, t_z]^T是平移向量。旋转矩阵描述了相机的姿态,平移向量描述了相机的位置。这一步消除了相机位置和姿态对成像的影响,将所有点都表示在相机坐标系中。

步骤2:相机坐标到归一化坐标

归一化坐标系是一个虚拟的坐标系,位于距离光心单位距离的平面上。从相机坐标到归一化坐标的变换实现了透视投影:

x = \frac{X_c}{Z_c}, \quad y = \frac{Y_c}{Z_c}

这一步体现了透视投影的核心特征:远处的物体看起来更小。深度信息Z_c在这一步丢失了,这正是从三维到二维投影的本质。

步骤3:归一化坐标到像素坐标

最后一步考虑了图像传感器的物理特性,将归一化坐标转换为像素坐标:

u = f_x \cdot x + c_x, \quad v = f_y \cdot y + c_y

其中,f_xf_y是焦距在x和y方向的像素表示,c_xc_y是主点坐标。这四个参数构成了相机的内参矩阵\mathbf{K}

\mathbf{K} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}

10.4 算法实现

相机标定的核心是求解内参矩阵K和外参矩阵[R|t]。最常用的方法是基于棋盘格标定板的线性方法。

def camera_calibration_core(object_points, image_points):
    """相机标定核心算法逻辑"""
    # 1. 构建齐次线性方程组:每个点对应两个约束方程
    A = []
    for (X, Y, Z), (u, v) in zip(object_points, image_points):
        # 投影方程的线性化:u = (p11*X + p12*Y + p13*Z + p14) / (p31*X + p32*Y + p33*Z + 1)
        A.append([X, Y, Z, 1, 0, 0, 0, 0, -u*X, -u*Y, -u*Z, -u])
        A.append([0, 0, 0, 0, X, Y, Z, 1, -v*X, -v*Y, -v*Z, -v])

    # 2. SVD求解最小二乘问题:Ah = 0
    U, S, Vt = np.linalg.svd(np.array(A))
    h = Vt[-1, :]  # 最小奇异值对应的解

    # 3. 重构投影矩阵并分解得到内外参
    P = h.reshape(3, 4)
    K, R, t = decompose_projection_matrix(P)

    return K, R, t
Code
flowchart TD
    A["采集标定图像<br/>多个角度的棋盘格"] --> B["提取角点坐标<br/>亚像素精度"]
    B --> C["建立对应关系<br/>3D世界点 ↔ 2D图像点"]
    C --> D["构建线性方程组<br/>Ah = 0"]
    D --> E["SVD求解<br/>最小二乘解"]
    E --> F["分解投影矩阵<br/>提取内参和外参"]
    F --> G["非线性优化<br/>最小化重投影误差"]
    G --> H["畸变参数估计<br/>径向和切向畸变"]
    H --> I["标定结果验证<br/>重投影误差分析"]

    subgraph 数据准备
        A
        B
        C
    end

    subgraph 线性求解
        D
        E
        F
    end

    subgraph 非线性优化
        G
        H
    end

    subgraph 结果验证
        I
    end

    %% 移除渐变定义,使用单色填充

    classDef prepNode fill:#42a5f5,stroke:#1565c0,color:white,stroke-width:2px,font-weight:bold,border-radius:8px
    classDef solveNode fill:#ffb74d,stroke:#e65100,color:white,stroke-width:2px,font-weight:bold,border-radius:8px
    classDef optNode fill:#66bb6a,stroke:#1b5e20,color:white,stroke-width:2px,font-weight:bold,border-radius:8px
    classDef valNode fill:#f48fb1,stroke:#880e4f,color:white,stroke-width:2px,font-weight:bold,border-radius:8px

    classDef prepSubgraph fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,color:#0d47a1,font-weight:bold
    classDef solveSubgraph fill:#fff3e0,stroke:#e65100,stroke-width:2px,color:#bf360c,font-weight:bold
    classDef optSubgraph fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px,color:#1b5e20,font-weight:bold
    classDef valSubgraph fill:#fce4ec,stroke:#880e4f,stroke-width:2px,color:#880e4f,font-weight:bold

    class A,B,C prepNode
    class D,E,F solveNode
    class G,H optNode
    class I valNode

    class 数据准备 prepSubgraph
    class 线性求解 solveSubgraph
    class 非线性优化 optSubgraph
    class 结果验证 valSubgraph

    linkStyle 0,1,2,3,4,5,6,7 stroke-width:2px

flowchart TD
    A["采集标定图像<br/>多个角度的棋盘格"] --> B["提取角点坐标<br/>亚像素精度"]
    B --> C["建立对应关系<br/>3D世界点 ↔ 2D图像点"]
    C --> D["构建线性方程组<br/>Ah = 0"]
    D --> E["SVD求解<br/>最小二乘解"]
    E --> F["分解投影矩阵<br/>提取内参和外参"]
    F --> G["非线性优化<br/>最小化重投影误差"]
    G --> H["畸变参数估计<br/>径向和切向畸变"]
    H --> I["标定结果验证<br/>重投影误差分析"]

    subgraph 数据准备
        A
        B
        C
    end

    subgraph 线性求解
        D
        E
        F
    end

    subgraph 非线性优化
        G
        H
    end

    subgraph 结果验证
        I
    end

    %% 移除渐变定义,使用单色填充

    classDef prepNode fill:#42a5f5,stroke:#1565c0,color:white,stroke-width:2px,font-weight:bold,border-radius:8px
    classDef solveNode fill:#ffb74d,stroke:#e65100,color:white,stroke-width:2px,font-weight:bold,border-radius:8px
    classDef optNode fill:#66bb6a,stroke:#1b5e20,color:white,stroke-width:2px,font-weight:bold,border-radius:8px
    classDef valNode fill:#f48fb1,stroke:#880e4f,color:white,stroke-width:2px,font-weight:bold,border-radius:8px

    classDef prepSubgraph fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,color:#0d47a1,font-weight:bold
    classDef solveSubgraph fill:#fff3e0,stroke:#e65100,stroke-width:2px,color:#bf360c,font-weight:bold
    classDef optSubgraph fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px,color:#1b5e20,font-weight:bold
    classDef valSubgraph fill:#fce4ec,stroke:#880e4f,stroke-width:2px,color:#880e4f,font-weight:bold

    class A,B,C prepNode
    class D,E,F solveNode
    class G,H optNode
    class I valNode

    class 数据准备 prepSubgraph
    class 线性求解 solveSubgraph
    class 非线性优化 optSubgraph
    class 结果验证 valSubgraph

    linkStyle 0,1,2,3,4,5,6,7 stroke-width:2px

图11.3:相机标定算法的主要步骤和数据流

10.5 标定精度评估

相机标定的效果可以通过多个指标来评估。重投影误差是最直观的评价标准,它衡量了标定结果的几何精度。

畸变校正效果:未标定的图像往往存在明显的畸变,特别是广角镜头拍摄的图像。标定后可以有效校正这些畸变,恢复图像的真实几何关系。

重投影误差分析:优秀的标定结果应该具有较小且均匀分布的重投影误差。如果误差过大或分布不均,说明标定质量有问题,需要重新采集数据或调整标定方法。

Code
graph TD
    A["世界坐标系<br/>(Xw, Yw, Zw)"] -->|旋转R + 平移t| B["相机坐标系<br/>(Xc, Yc, Zc)"]
    B -->|透视投影<br/>除以Zc| C["归一化坐标系<br/>(x, y)"]
    C -->|内参矩阵K<br/>fx, fy, cx, cy| D["像素坐标系<br/>(u, v)"]

    subgraph 外参变换
        E["刚体变换<br/>6个自由度"]
    end

    subgraph 内参变换
        F["传感器特性<br/>4个参数"]
    end

    A -.-> E
    C -.-> F

    classDef coordNode fill:#42a5f5,stroke:#1565c0,color:white,stroke-width:2px,font-weight:bold,font-size:14px,border-radius:8px
    classDef paramNode fill:#9c27b0,stroke:#6a1b9a,color:white,stroke-width:2px,font-weight:bold,font-size:14px,border-radius:8px
    classDef extSubgraph fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,color:#0d47a1,font-weight:bold
    classDef intSubgraph fill:#f3e5f5,stroke:#6a1b9a,stroke-width:2px,color:#4a148c,font-weight:bold

    class A,B,C,D coordNode
    class E,F paramNode
    class 外参变换 extSubgraph
    class 内参变换 intSubgraph

    linkStyle 0 stroke:#1565c0,stroke-width:2px
    linkStyle 1 stroke:#0097a7,stroke-width:2px
    linkStyle 2 stroke:#ad1457,stroke-width:2px
    linkStyle 3,4 stroke:#6a1b9a,stroke-width:1.5px,stroke-dasharray:3 3

    %% 移除渐变定义,使用单色填充

graph TD
    A["世界坐标系<br/>(Xw, Yw, Zw)"] -->|旋转R + 平移t| B["相机坐标系<br/>(Xc, Yc, Zc)"]
    B -->|透视投影<br/>除以Zc| C["归一化坐标系<br/>(x, y)"]
    C -->|内参矩阵K<br/>fx, fy, cx, cy| D["像素坐标系<br/>(u, v)"]

    subgraph 外参变换
        E["刚体变换<br/>6个自由度"]
    end

    subgraph 内参变换
        F["传感器特性<br/>4个参数"]
    end

    A -.-> E
    C -.-> F

    classDef coordNode fill:#42a5f5,stroke:#1565c0,color:white,stroke-width:2px,font-weight:bold,font-size:14px,border-radius:8px
    classDef paramNode fill:#9c27b0,stroke:#6a1b9a,color:white,stroke-width:2px,font-weight:bold,font-size:14px,border-radius:8px
    classDef extSubgraph fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,color:#0d47a1,font-weight:bold
    classDef intSubgraph fill:#f3e5f5,stroke:#6a1b9a,stroke-width:2px,color:#4a148c,font-weight:bold

    class A,B,C,D coordNode
    class E,F paramNode
    class 外参变换 extSubgraph
    class 内参变换 intSubgraph

    linkStyle 0 stroke:#1565c0,stroke-width:2px
    linkStyle 1 stroke:#0097a7,stroke-width:2px
    linkStyle 2 stroke:#ad1457,stroke-width:2px
    linkStyle 3,4 stroke:#6a1b9a,stroke-width:1.5px,stroke-dasharray:3 3

    %% 移除渐变定义,使用单色填充

图11.4:镜头畸变校正前后的效果对比,注意图像边缘的几何变化

Code
graph TD
    subgraph 误差计算
        A["观测点<br/>(u_obs, v_obs)"]
        B["重投影点<br/>(u_proj, v_proj)"]
        C["误差向量<br/>Δu = u_obs - u_proj<br/>Δv = v_obs - v_proj"]
    end

    subgraph 误差分析
        D["均方根误差<br/>RMSE = √(Σ(Δu² + Δv²)/N)"]
        E["最大误差<br/>Max Error"]
        F["误差分布<br/>空间统计"]
    end

    subgraph 质量评估
        G["优秀: RMSE < 0.5像素"]
        H["良好: 0.5 < RMSE < 1.0"]
        I["需改进: RMSE > 1.0"]
    end

    A --> C
    B --> C
    C --> D
    C --> E
    C --> F

    D --> G
    D --> H
    D --> I

    %% 使用简单的填充色替代渐变
    classDef calcNode fill:#64b5f6,stroke:#1565c0,color:white,stroke-width:2px,font-weight:bold,font-size:13px,border-radius:8px
    classDef analysisNode fill:#ba68c8,stroke:#6a1b9a,color:white,stroke-width:2px,font-weight:bold,font-size:13px,border-radius:8px
    classDef excellentNode fill:#66bb6a,stroke:#2e7d32,color:white,stroke-width:2px,font-weight:bold,font-size:13px,border-radius:8px
    classDef goodNode fill:#ffb74d,stroke:#ef6c00,color:white,stroke-width:2px,font-weight:bold,font-size:13px,border-radius:8px
    classDef poorNode fill:#ef5350,stroke:#c62828,color:white,stroke-width:2px,font-weight:bold,font-size:13px,border-radius:8px

    classDef calcSubgraph fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,color:#0d47a1,font-weight:bold
    classDef analysisSubgraph fill:#f3e5f5,stroke:#6a1b9a,stroke-width:2px,color:#4a148c,font-weight:bold
    classDef qualitySubgraph fill:#f1f8e9,stroke:#2e7d32,stroke-width:2px,color:#1b5e20,font-weight:bold

    class A,B,C calcNode
    class D,E,F analysisNode
    class G excellentNode
    class H goodNode
    class I poorNode

    class 误差计算 calcSubgraph
    class 误差分析 analysisSubgraph
    class 质量评估 qualitySubgraph

    linkStyle 0,1 stroke:#7b1fa2,stroke-width:2px
    linkStyle 2,3,4 stroke:#7b1fa2,stroke-width:2px
    linkStyle 5 stroke:#4caf50,stroke-width:2px
    linkStyle 6 stroke:#ff9800,stroke-width:2px
    linkStyle 7 stroke:#f44336,stroke-width:2px

graph TD
    subgraph 误差计算
        A["观测点<br/>(u_obs, v_obs)"]
        B["重投影点<br/>(u_proj, v_proj)"]
        C["误差向量<br/>Δu = u_obs - u_proj<br/>Δv = v_obs - v_proj"]
    end

    subgraph 误差分析
        D["均方根误差<br/>RMSE = √(Σ(Δu² + Δv²)/N)"]
        E["最大误差<br/>Max Error"]
        F["误差分布<br/>空间统计"]
    end

    subgraph 质量评估
        G["优秀: RMSE < 0.5像素"]
        H["良好: 0.5 < RMSE < 1.0"]
        I["需改进: RMSE > 1.0"]
    end

    A --> C
    B --> C
    C --> D
    C --> E
    C --> F

    D --> G
    D --> H
    D --> I

    %% 使用简单的填充色替代渐变
    classDef calcNode fill:#64b5f6,stroke:#1565c0,color:white,stroke-width:2px,font-weight:bold,font-size:13px,border-radius:8px
    classDef analysisNode fill:#ba68c8,stroke:#6a1b9a,color:white,stroke-width:2px,font-weight:bold,font-size:13px,border-radius:8px
    classDef excellentNode fill:#66bb6a,stroke:#2e7d32,color:white,stroke-width:2px,font-weight:bold,font-size:13px,border-radius:8px
    classDef goodNode fill:#ffb74d,stroke:#ef6c00,color:white,stroke-width:2px,font-weight:bold,font-size:13px,border-radius:8px
    classDef poorNode fill:#ef5350,stroke:#c62828,color:white,stroke-width:2px,font-weight:bold,font-size:13px,border-radius:8px

    classDef calcSubgraph fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,color:#0d47a1,font-weight:bold
    classDef analysisSubgraph fill:#f3e5f5,stroke:#6a1b9a,stroke-width:2px,color:#4a148c,font-weight:bold
    classDef qualitySubgraph fill:#f1f8e9,stroke:#2e7d32,stroke-width:2px,color:#1b5e20,font-weight:bold

    class A,B,C calcNode
    class D,E,F analysisNode
    class G excellentNode
    class H goodNode
    class I poorNode

    class 误差计算 calcSubgraph
    class 误差分析 analysisSubgraph
    class 质量评估 qualitySubgraph

    linkStyle 0,1 stroke:#7b1fa2,stroke-width:2px
    linkStyle 2,3,4 stroke:#7b1fa2,stroke-width:2px
    linkStyle 5 stroke:#4caf50,stroke-width:2px
    linkStyle 6 stroke:#ff9800,stroke-width:2px
    linkStyle 7 stroke:#f44336,stroke-width:2px

图11.5:重投影误差的空间分布和质量评估标准

10.6 小结

相机标定是三维视觉的基础,它建立了图像与现实世界之间的几何桥梁。通过理解针孔相机模型和坐标变换关系,我们可以准确地从二维图像中提取三维信息。标定质量直接影响后续所有三维视觉算法的精度,因此必须给予足够重视。