用OpenCV快速完成相机标定

搞图像处理离不开相机标定。但是在某些小项目中,我们希望尽可能快速简单地完成相机标定这一过程,而不希望为了获得几个相机参数而大动干戈的写代码。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快速完成相机标定_第1张图片

把OpenCV的相关的include,lib等库文件加入到项目属性中。(具体过程见另一篇博客)

将刚才拍摄的标定图片放入到项目目录下的某个文件夹,例如“VID5”文件夹。

修改代码

对源代码需要做两处修改。

  • 在代码最开头加入#pragma warning(disable : 4996) 屏蔽4996号Error。否则无法通过编译。
    4996号Error
  • 将第233行的”default.xml“改为”in_VID5.xml“。当然,也可以反过来,把”in_VID5.xml“文件的文件名改为”default.xml“。只要一致即可。

对”in_VID5.xml“文件,或者说已经改为”default.xml“的文件进行如下修改并保存:

  • 9
  • 6
  • 26.1
  • `“VID5.xml” “

最后打开”VID5.xml“文件,在之间加入标定图片的地址并保存。例如:


VID5/xx1.jpg
VID5/xx2.jpg
VID5/xx3.jpg
VID5/xx4.jpg
VID5/xx5.jpg
VID5/xx6.jpg
VID5/xx7.jpg
VID5/xx8.jpg

编译和运行程序

打开VS项目,编译并运行程序。标定图片即角点会依次显示在屏幕上。直到命令窗口显示Calibration succeeded. avg re projection error = xxxx说明标定完成。

这是可以打开out_camera_data.xml查看标定结果了。一般来说,最重要的结果是相机的内参数矩阵和畸变修正系数。即:

<Camera_Matrix type_id="opencv-matrix">
  <rows>3rows>
  <cols>3cols>
  <dt>ddt>
  <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>5rows>
  <cols>1cols>
  <dt>ddt>
  <data>
    1.3202671408300112e-01 -7.5480401784082296e-01 0. 0.
    1.8509510584787703e+00
  data>
Distortion_Coefficients>

分别对应标定原理中的

wxy1=fx000fy0cxcy1XwYwZw(1) (1) w ( x y 1 ) = ( f x 0 c x 0 f y c y 0 0 1 ) ( X w Y w Z w )
和畸变参数 [k1,k2,p1,p2,k3]T [ k 1 , k 2 , p 1 , p 2 , k 3 ] T 。另外还要注意标定用的图片分辨率。尤其是对清晰度可调的相机,标定数据与分辨率是有关的。

至此标定过程顺利完成。

你可能感兴趣的:(学习笔记,相机标定,OpenCV)