机器视觉中相机内参与外参分别是什么,有什么作用

在机器视觉中,相机标定的核心目标是确定相机的**内参(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. **如何更新外参?**  
   - 若相机移动,需重新标定外参;内参一般无需重新标定(除非调整镜头焦距或光圈)。

---

通过理解内参与外参的物理意义和数学关系,可以更好地应用标定结果,提升机器视觉系统的精度和鲁棒性。

你可能感兴趣的:(Halcon,笔记,VisionPro学习笔记,python,opencv,机器学习,计算机视觉,知识图谱)