在机器视觉中,相机标定的核心目标是确定相机的**内参(Intrinsic Parameters)**和**外参(Extrinsic Parameters)**。它们是描述相机成像模型和空间位置的关键参数,以下是详细解释:
---
### **1. 内参(Intrinsic Parameters)**
**定义**:
内参描述相机的**固有属性**,与相机的物理结构和成像特性相关。这些参数在相机生产后即固定(除非更换镜头或调整焦距),标定后用于将三维世界点映射到二维图像平面。
**具体参数**(以面阵相机为例):
| 参数名 | 符号 | 物理意义 | 单位 |
|--------------|-------|-----------------------------------|------------|
| 焦距 | \(f\) | 光心到成像平面的距离 | 像素(px) |
| 主点坐标 | \(c_x, c_y\) | 光轴与图像平面的交点(图像中心) | 像素(px) |
| 畸变系数 | \(k_1, k_2, p_1, p_2\) | 径向畸变(\(k_1, k_2\))和切向畸变(\(p_1, p_2\)) | 无 |
| 像素尺寸 | \(s_x, s_y\) | 单个像素的物理尺寸(通常设为1) | 微米/像素 |
**数学表达**(相机成像模型):
\[
\begin{cases}
u = f_x \cdot \frac{X_c}{Z_c} + c_x + \text{畸变修正} \\
v = f_y \cdot \frac{Y_c}{Z_c} + c_y + \text{畸变修正}
\end{cases}
\]
其中:
- \((u, v)\) 是图像坐标系中的点坐标。
- \((X_c, Y_c, Z_c)\) 是三维点在相机坐标系中的坐标。
- \(f_x = \frac{f}{s_x}\),\(f_y = \frac{f}{s_y}\)(像素单位焦距)。
**作用**:
- **图像去畸变**(如`map_image`算子)。
- **像素坐标到相机坐标的转换**(用于三维测量)。 **示例**(Halcon内参输出格式):
```python
# 面阵相机(Division畸变模型):
CameraParam = [Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]
# 面阵相机(Polynomial畸变模型):
CameraParam = [Focus, K1, K2, K3, P1, P2, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]
```
---
### **2. 外参(Extrinsic Parameters)**
**定义**:
外参描述相机在**世界坐标系中的位姿**(位置和方向),即从世界坐标系到相机坐标系的刚体变换。外参会因相机移动或场景变化而改变。
**具体参数**:
| 参数名 | 符号 | 物理意义 | 数学表示 |
|--------------|-------|-----------------------------------|------------|
| 旋转矩阵 | \(R\) | 3×3矩阵,表示相机坐标系的旋转 | \(R \in \mathbb{R}^{3×3}\) |
| 平移向量 | \(T\) | 3×1向量,表示相机坐标系的原点偏移 | \(T \in \mathbb{R}^{3}\) |
**数学表达**(坐标系变换):
\[
\begin{bmatrix}
X_c \\ Y_c \\ Z_c
\end{bmatrix}
= R \cdot
\begin{bmatrix}
X_w \\ Y_w \\ Z_w
\end{bmatrix}
+ T
\]
其中:
- \((X_w, Y_w, Z_w)\) 是世界坐标系中的点坐标。
- \((X_c, Y_c, Z_c)\) 是对应的相机坐标系坐标。
**作用**:
- **世界坐标系与相机坐标系的转换**(如机器人抓取中的定位)。
- **多相机联合标定**(确定不同相机间的相对位置)。
**示例**(Halcon外参输出格式):
外参通常以**位姿(Pose)**形式存储,包含旋转和平移信息,例如:
```python
Pose = [Tx, Ty, Tz, Rx, Ry, Rz, 'type'] # 平移+旋转向量(Rodrigues表示法)
```
---
### **内参与外参的核心区别**
| 特征 | 内参 | 外参 |
|--------------|-------------------------------|-------------------------------|
| **变化性** | 固定(与相机硬件相关) | 可变(与相机位姿相关) |
| **用途** | 校正图像畸变、投影模型计算 | 坐标系转换、空间定位 |
| **标定目标** | 确定焦距、主点、畸变系数 | 确定相机在世界坐标系中的位姿 |
---
### **实际应用场景**
1. **图像去畸变**(依赖内参):
```python
map_image(Image, Map, CameraParamIn, CameraParamRectified, 'bilinear')
```
2. **三维测量**(依赖内参+外参):
- 将图像点反投影到相机坐标系:
\[
Z_c \cdot \begin{bmatrix}u \\ v \\ 1\end{bmatrix} =
K \cdot \begin{bmatrix}X_c \\ Y_c \\ Z_c\end{bmatrix}, \quad K = \begin{bmatrix}
f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1
\end{bmatrix}
\]
- 结合外参进一步转换到世界坐标系。
3. **多相机标定**(依赖外参):
- 通过不同相机的外参,计算它们之间的相对位姿,实现多视角三维重建。
---
### **标定结果验证**
1. **重投影误差(Reprojection Error)**:
- 使用`get_calib_data`获取标定后的内参和外参,重新投影标定板角点到图像平面,计算与实测点的像素误差(RMS应小于0.5像素)。 2. **可视化验证**:
```python
# 显示理论轮廓(绿色)与实际检测点(红色)
get_calib_data_observ_contours(Contours, CalibDataID, 'caltab', 0, 0, 0)
dev_display(Image)
dev_set_color('green')
dev_display(Contours)
dev_set_color('red')
disp_caltab(Image, CalibDataID, 0, 0, 0)
```
---
### **常见问题**
1. **为什么需要标定外参?**
- 外参将相机的局部坐标系与全局世界坐标系对齐,使测量结果具有实际物理意义(如毫米单位)。
2. **内参不准确会导致什么问题?**
- 图像畸变校正失败、三维测量误差放大、多相机融合不一致。
3. **如何更新外参?**
- 若相机移动,需重新标定外参;内参一般无需重新标定(除非调整镜头焦距或光圈)。
---
通过理解内参与外参的物理意义和数学关系,可以更好地应用标定结果,提升机器视觉系统的精度和鲁棒性。