### **Halcon相机标定核心要点**
1. **标定模式选择**
- **Division畸变模型**:适合低畸变镜头(如远心镜头),计算速度快,参数少。
- **Polynomial畸变模型**:适合高畸变镜头(如广角镜头),精度更高但计算复杂。
- *特殊提示*:线阵相机必须使用polynomial模型。
2. **标定板要求**
- 需使用Halcon支持的标定板(如棋盘格、圆点阵列),尺寸和间距需精确已知。
- 推荐采集15-20张不同位姿的标定板图像(覆盖整个视野,多角度倾斜)。
3. **关键算子解析**
- `find_calib_object`:自动检测标定板特征点,若失败需检查光照均匀性或标定板遮挡。
- `get_calib_data_observ_contours`:生成标定板的理论轮廓,用于可视化验证检测结果。
- `calibrate_cameras`:核心优化算法,会输出标定误差(RMS像素误差应小于0.5)。
4. **参数保存与应用**
- 内参(`cam_par`):焦距(f)、主点(cx,cy)、畸变系数(k1,k2,...)
- 外参(`pose`):相机坐标系到标定板坐标系的旋转平移矩阵
- *应用示例*:`map_image`用于图像去畸变,`trans_pose`用于坐标系转换。
---
### **标定常见问题**
1. **标定误差过大**
- 可能原因:标定板移动范围不足、特征点检测错误、镜头畸变模型选择不当。
- 解决方法:检查`get_calib_data_observ_points`返回的观测点坐标是否合理。
2. **线阵相机特殊处理**
- 需要设置运动方向(`MovementDirection`)和速度参数。
- 标定时需使用带运动信息的连续图像序列。
3. **多相机系统标定**
- 需创建多相机标定模型,使用`set_calib_data_slave_cam`设置从属相机。
- 要求不同相机视野有重叠区域。
---
### **标定结果验证**
1. **重投影误差检查**
```python
get_calib_data(CalibDataID, 'camera', 0, 'params', CameraParameters)
get_calib_data(CalibDataID, 'calib_obj_pose', [0,0], 'pose', Pose)
```
2. **可视化验证**
- 使用`disp_caltab`显示标定板理论位置
- 使用`dev_display`叠加显示实际检测点
---
### **后续应用方向**
1. **图像校正**
```python
map_image(Image, Map, CameraParameters, CameraParametersRectified, 'bilinear')
```
2. **三维测量**
- 结合双目视觉或多视角标定实现三维重建
- 使用`plane_scan`进行平面测量
---
通过系统化的标定流程,可以确保机器视觉系统获得亚像素级测量精度。实际应用中建议用Halcon的`Calibration Assistant`交互工具辅助调试,特别是在复杂光照或多相机场景下。
这张图片展示了一个关于使用Halcon软件进行相机标定的流程的PowerPoint幻灯片。Halcon是一款广泛应用于机器视觉领域的软件,它提供了一系列的工具和算法来处理图像和进行视觉检测。幻灯片中列出了标定相机的步骤,具体如下:
1. 根据相机类型(面阵、线阵)创建相机参数,可以选择低精度的division模式或高精度的polynomial模式。
2. 使用`create_calib_data`创建标定数据模型`CalibDataID`。
3. 使用`set_calib_data_cam_param`设置相机参数。
4. 使用`set_calib_data_calib_object`设置标定板。
5. 设置标定板数据的路径,读取采集的标定板图像。
6. 使用`find_calib_object`、`get_calib_data_observ_contours`算子提取标定板图像的角点中心、轮廓信息,存储在`CalibDataID`中。
7. 使用`calibrate_cameras`算子对相机进行标定,计算相机的内外参数。
8. 使用`get_calib_data`获取参数,使用`write_cam_par`将参数保存到文件。
9. 获取到相机的内部参数与外部参数后,就可以进行图像校正、测量等。
这些步骤是进行相机标定的基本流程,标定的目的是确定相机的内部参数(如焦距、主点等)和外部参数(如相机相对于世界坐标系的位置和姿态),以便在后续的图像处理和机器视觉任务中能够准确地进行图像校正和测量。
以下是Halcon相机标定流程中涉及的关键算子及其参数的详细解释,结合代码示例和参数说明,确保实际应用中的正确使用:
---
### **1. `create_calib_data`**
**功能**:创建标定数据容器(`CalibDataID`),存储所有标定相关的参数和观测数据。
**参数**:
- `CalibSetup`:标定类型,可选 `'camera'`(单相机)或 `'stereo'`(双目相机)。
- `NumCameras`:相机数量(单相机为1)。
- `NumCalibObjects`:标定板数量(通常为1)。
- `CalibDataID`(输出):生成的标定数据句柄。
**示例**:
```python
create_calib_data('camera', 1, 1, CalibDataID)
### **2. `set_calib_data_cam_param`**
**功能**:设置相机初始参数(内参和畸变模型)。
**参数**:
- `CalibDataID`:标定数据句柄。
- `CameraIdx`:相机索引(单相机为0)。
- `CameraType`:相机类型,如 `'area_scan_division'`(面阵+Division畸变)或 `'line_scan_polynomial'`(线阵+Polynomial畸变)。
- `CameraParam`:相机参数列表,格式取决于`CameraType`:
- **面阵相机**:`[Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]`
- `Focus`:焦距(像素单位)
- `Kappa`:畸变系数(Division模型为1个,Polynomial模型为3个)
- `Sx, Sy`:像素尺寸(μm/像素,可设为1.0)
- `Cx, Cy`:主点坐标(初始估计值,如图像中心)
- **线阵相机**:`[Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]`
- `Vx, Vy, Vz`:运动方向向量(需归一化)
**示例**(面阵相机):
```python
set_calib_data_cam_param(CalibDataID, 0, 'area_scan_division', [0.016, 0.0, 1.0, 1.0, 320, 240, 640, 480])
### **3. `set_calib_data_calib_object`**
**功能**:设置标定板参数(尺寸和特征点描述文件)。
**参数**:
- `CalibDataID`:标定数据句柄。
- `CalibObjIdx`:标定板索引(通常为0)。
- `CalibObjDescr`:标定板描述文件路径(`.descr`文件)。
**示例**:
`
``python
set_calib_data_calib_object(CalibDataID, 0, 'calib_board.descr')
```
---
### **4. `find_calib_object`**
**功能**:检测标定板图像中的特征点(角点或圆心)。
**参数**:
- `Image`:输入图像。
- `CalibDataID`:标定数据句柄。
- `CameraIdx`:相机索引(单相机为0)。
- `CalibObjIdx`:标定板索引(通常为0)。
- `CalibObjPoseIdx`:标定板位姿索引(每张图像对应一个唯一索引,从0开始递增)。
- `GenParamName`/`GenParamValue`:可选参数,如 `'alpha'`(平滑度)或 `'skip_find_caltab'`(跳过标定板定位)。
**示例**:
```python
for i in 0:19 # 处理20张标定板图像
read_image(Image, 'calib_image_' + i)
find_calib_object(Image, CalibDataID, 0, 0, i, [], [])
endfor
### **5. `get_calib_data_observ_contours`**
**功能**:获取标定板的理论轮廓(用于可视化验证)。
**参数**:
- `Contours`(输出):生成的理论轮廓。
- `CalibDataID`:标定数据句柄。
- `ContourName`:轮廓类型,如 `'caltab'`(标定板外框)或 `'marks'`(特征点)。
- `CameraIdx`:相机索引。
- `CalibObjIdx`:标定板索引。
- `CalibObjPoseIdx`:标定板位姿索引。
**示例**:
```python
get_calib_data_observ_contours(Contours, CalibDataID, 'caltab', 0, 0, 0)
dev_display(Contours) # 叠加显示理论轮廓
### **6. `calibrate_cameras`**
**功能**:执行标定优化,计算最终内外参数。
**参数**:
- `CalibDataID`:标定数据句柄。
- `Error`(输出):重投影误差(RMS像素误差,应小于0.5)。
- `GenParamName`/`GenParamValue`:可选参数,如:
- `'optimize_cam_par'`:是否优化内参(默认`'true'`)
- `'check_cond'`:检查矩阵条件数(防止过拟合)。
**示例**:
```python
calibrate_cameras(CalibDataID, Error)
print('标定误差:', Error)
```
---
### **7. `get_calib_data`**
**功能**:获取标定结果(内参或外参)。
**参数**:
- `CalibDataID`:标定数据句柄。
- `ItemType`:数据类型,如 `'camera'`(内参)、`'calib_obj_pose'`(外参)。
- `DataIdx`:索引(相机/标定板索引)。
- `DataName`:数据名称,如 `'params'`(内参列表)、`'pose'`(外参位姿)。
- `DataValue`(输出):返回的参数值。
**示例**:
```python
# 获取内参
get_calib_data(CalibDataID, 'camera', 0, 'params', CameraParam)
# 获取外参(第0张图像对应的位姿)
get_calib_data(CalibDataID, 'calib_obj_pose', [0,0], 'pose', Pose)
```
---
### **8. `write_cam_par`**
**功能**:将内参保存到文件。
**参数**:
- `CameraParam`:内参列表(来自`get_calib_data`)。
- `FileName`:保存路径(如`'cam_par.dat'`)。
**示例**:
```python
write_cam_par(CameraParam, 'cam_par.dat')
```
---
### **9. `map_image`(后处理)**
**功能**:应用标定结果进行图像去畸变。
**参数**:
- `Image`:原始图像。
- `Map`:映射数据(由`gen_image_to_world_plane_map`生成)。
- `CameraParamIn`:输入相机参数(原始内参)。
- `CameraParamOut`:输出相机参数(校正后内参,通常无畸变)。
- `Interpolation`:插值方法(如`'bilinear'`)。
**示例**:
```python
# 生成去畸变映射
gen_image_to_world_plane_map(Map, CameraParam, 'adaptive', 640, 480, 640, 480, CameraParamRectified)
# 应用映射
map_image(Image, Map, CameraParam, CameraParamRectified, 'bilinear')
```
---
### **关键参数总结表**
| 算子 | 核心参数 | 作用说明 |
|---------------------|----------------------------------------|--------------------------------------|
| `create_calib_data` | `CalibSetup`, `NumCameras` | 初始化标定容器 |
| `find_calib_object` | `CalibObjPoseIdx` | 关联图像与位姿索引 |
| `calibrate_cameras` | `Error` | 标定精度验证 |
| `map_image` | `CameraParamIn`, `CameraParamOut` | 图像去畸变的关键参数 |
---
### **注意事项**
1. **畸变模型选择**:
- 若使用`'area_scan_polynomial'`,内参格式为 `[Focus, K1, K2, K3, P1, P2, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]`。
2. **标定板描述文件**:
- 通过`gen_caltab`生成(需指定行数、列数、直径、间距等)。
3. **线阵相机标定**:
- 必须设置运动方向 (`Vx, Vy, Vz`),且需采集连续运动图像。
通过以上算子的详细参数设置和组合,可以完成从初始化到标定结果应用的全流程。建议使用Halcon的`Calibration Assistant`工具进行交互式调试,特别是在复杂场景下快速定位问题。