搞图像处理离不开相机标定。但是在某些小项目中,我们希望尽可能快速简单地完成相机标定这一过程,而不希望为了获得几个相机参数而大动干戈的写代码。OpenCV其实为我们提供了一个完整的标定代码,用这个现成的代码我们可以快速完成相机的标定,而几乎不需要写任何代码。而且支持链接相机、视频和图片组多种输入源,以及亚像素精度地角点探测。相机标定的理论知识在网上到处都是,在这篇博客中不再重复。这篇博客也不包含对代码的解释,具体对代码的解读可以阅读官方说明。这里简单粗暴,只有HOW TO。
环境
- Windows 10 64bit
- Visual Studio 2015
- OpenCV (安装过程见另一篇博客)
实现步骤
采集标定数据
- 下载或者自己制作棋盘格并打印出来。OpenCV提供了一个棋盘格https://docs.opencv.org/3.1.0/pattern.png
- 对着棋盘格用待标定相机拍N张照片,这个棋盘格应该完整的出现在视野当中。
- 记录横向纵向分别有多少个角点。比如上面给出的棋盘格横向有9个角点,纵向有6个角点。注意角点只存在与棋盘格内部,最外部边缘的不是角点。
- 测量每个小格的边长,单位mm。
新建工程项目
在VS 2015中新建项目,选择Empty Project,命名为Calibration。打开OpenCV源代码所在位置,进入目录samples\cpp\tutorial_code\calib3d\camera_calibration
。把该文件夹下四个文件拷贝到Calibration项目所在位置。四个文件分别为:
- camera_calibration.cpp 标定代码
- in_VID5.xml 标定过程参数设置
- VID5.xml 标定图片位置索引
如果手边没有OpenCV源代码,也可以从以下地址下载这三个文件:
https://docs.opencv.org/2.4/_downloads/camera_calibration.cpp
https://docs.opencv.org/2.4/_downloads/in_VID5.xml
https://docs.opencv.org/2.4/_downloads/VID5.xml
然后在Visual Studio中把camera_calibration.cpp
文件加入到项目源代码文件夹内。
把OpenCV的相关的include,lib等库文件加入到项目属性中。(具体过程见另一篇博客)
将刚才拍摄的标定图片放入到项目目录下的某个文件夹,例如“VID5
”文件夹。
修改代码
对源代码需要做两处修改。
- 在代码最开头加入
#pragma warning(disable : 4996)
屏蔽4996号Error。否则无法通过编译。
- 将第233行的”
default.xml
“改为”in_VID5.xml
“。当然,也可以反过来,把”in_VID5.xml
“文件的文件名改为”default.xml
“。只要一致即可。
对”in_VID5.xml
“文件,或者说已经改为”default.xml
“的文件进行如下修改并保存:
<BoardSize_Width> 9</BoardSize_Width> <!-- 这里输入横向角点个数-->
<BoardSize_Height>6</BoardSize_Height> <!-- 这里输入纵向角点个数-->
<Square_Size>26.1</Square_Size> <!-- 这里输入打印出的棋盘格每个小格的实际边长-->
- `“VID5.xml” “
最后打开”VID5.xml
“文件,在<images>
和</images>
之间加入标定图片的地址并保存。例如:
<images>
VID5/xx1.jpg
VID5/xx2.jpg
VID5/xx3.jpg
VID5/xx4.jpg
VID5/xx5.jpg
VID5/xx6.jpg
VID5/xx7.jpg
VID5/xx8.jpg
</images>
编译和运行程序
打开VS项目,编译并运行程序。标定图片即角点会依次显示在屏幕上。直到命令窗口显示Calibration succeeded. avg re projection error = xxxx
说明标定完成。
这是可以打开out_camera_data.xml
查看标定结果了。一般来说,最重要的结果是相机的内参数矩阵和畸变修正系数。即:
<Camera_Matrix type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>d</dt>
<data>
2.6780555209909307e+03 0. 1.6315000000000000e+03
0. 2.6780555209909307e+03 1.2235000000000000e+03
0. 0. 1.
</data>
</Camera_Matrix>
<Distortion_Coefficients type_id="opencv-matrix">
<rows>5</rows>
<cols>1</cols>
<dt>d</dt>
<data>
1.3202671408300112e-01 -7.5480401784082296e-01 0. 0.
1.8509510584787703e+00
</data>
</Distortion_Coefficients>
分别对应标定原理中的
至此标定过程顺利完成。