# 10. 相机标定
相机标定的目的,就是得到相机内参矩阵和畸变矩阵,以便于消除畸变和目标测距,矩阵如下:
```[tex]
\texttt{cameraMatrix:} \quad
\bf{A} =
\left[ \begin{matrix}
f_x & 0 & c_x\\
0 & f_y & c_y\\
0 & 0 & 1
\end{matrix} \right]
```
```[tex]
\\ \texttt{distCoeffs: }
(k_1, k_2, p_1, p_2, [,k_3[,k_4,k_5,k_6[,s_1,s_2,s_3,s_4[,\tau_x,\tau_y]]])
\text{of 4, 5, 8, 12 or 14 elements}
```
先说明什么叫做相机畸变,如下图。
|  |
| :----------------------------------------: |
| *枕形畸变(左) 与 桶形畸变(右)* |
此处先引入一个概念叫做鱼眼相机。
鱼眼相机可以被用于里程计(odometry)以及vslam(simultaneous localization and mapping)。其他应用中,有包括监控系统(surveillance system),GoPro,虚拟现实(VR)要求捕获360度视场角(fov),和一些拼接算法中。这些camera使用了一些列用了复杂的镜头扩大了相机的fov,使它能够捕获广阔的全景(panoramic)或者半球形(hemispherical)图像。但是,镜头是通过扭曲图像中的视线来实现这种超广角视角。所谓相机畸变,则要从相机成像说起,相机成像原理会使相片呈鱼眼形状蜷曲,
|  |
| :------------------------------------------------------: |
| *鱼眼模型成像图片(左) 与 消除鱼眼效应图片(右)* |
由于鱼眼镜头会产生极大的变形,因此针孔模型无法为鱼眼镜头建模。为此,我们需要进行相机标定来消除鱼眼模型的影响,进行测距
Camera Calibration是计算Camera的extrinsic(外参)和 intrinsic(内参)的过程。一旦你标定完成了一个camera,你即可从2维图像中去恢复3维图像。你同样可以在在一个鱼眼相机中获得未失真的图像。
相机标定可以使用 OpenCV code,也可以使用 matlab工具箱,下面我们介绍用OpenCV code进行相机标定。
为得到相机的 cameraMatrix 和 distCoeffs 两个矩阵,我们进行相机标定,采用OpenCV例程代码,详情见文件夹:opencv\samples\cpp\tutorial_code\calib3d\camera_calibration
| 文件名 | 作用 |
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| camera_calibration.cpp | 程序源文件 |
| in_VID5.xml | 程序的输入参数文件,将程序编译后改名为 default.xml (要求和编译的可执行二进制程序同级目录),每一个参数都有很好的注释。包含输入图片、视频、还是直接调用摄像头,标定板类型、标定板大小、输出文件等等。 |
| VID5.xml | 如果输入为图片,在此处键入图片路径。 |
| out_camera_data.yml | 以yml格式导出的标定内容,可以自行修改得到相机内参矩阵和畸变矩阵 |
需要使用标定板
|  |
| :-----------------------------: |
| *棋盘标定板* |
注意事项:
- 如果使用视频进行标定,有热键 ‘u’ 和 ‘g’ 。
- 输入尺寸影响标定结果。
- 在标定好后焦距不要变化。