相机标定(实践)

时间:2025-05-06 09:40:12

本博客为原创,转载请注明来自Jasmine_shine的专栏。

关于相机标定,最常用的方法莫过于matlab和opencv了。这两者的目标都是得到相机的内参矩阵(3*3)和误差矩阵(5*1),至于原理我还来不及研究,已经迫不及待的想要了解怎么采用这两种现成的工具怎么实现了?

首先,在标定之前先采集标定板的图片,连接好要标定的摄像头,做好一个标定板。opencv自带了一个标定板,你可以打印出来的,这个文档存放在sources文件夹下,如我的存放路径是:D:\Program Files\opencv\sources\doc\。按照旋转、平移的角度,转动标定板,拍摄一组照片,作为标定的依据。记住,尽量让标定板占满整幅画面。

接下来就是标定工具的选择了,相对来说,opencv的比较繁琐一些,下面主要讲解Opencv是如何实现标定的?至少先把这一套流程走完先。

opencv自带了标定的2个函数,存放路径在D:\Program Files\opencv\sources\samples\cpp,分别是imagelist_creator.cpp,用于生成图片的序号;和,用于生成内参和误差矩阵。具体用法是:
在vs2010下新建控制台应用程序的工程,载入imagelist_creator.cpp文件,编译生成exe文件。进入dos系统,也就是,进入你所在的工程,分别执行

工程名.exe imagelist.xml a1.png a2.png a3.png a4.png a5.png

这样就会生成一个的文件了。文件内容大致是:

<?xml version="1.0"?>
<opencv_storage>
<images>
  "" "" "" "" "" "" "" ""
  "" ""</images>
</opencv_storage>

现在已经生成了图片的序列文件了,下一步就是采用calibration生成内参矩阵和误差矩阵。同理,新建一个win32控制台应用程序的工程,加载,并编译生成可执行文件*.exe,在cmd下输入

*.exe -w 8 -h 6 -s 0.025 -o camera.yaml -op -oe imagelist.xml

-w 8 是指标定板的长边的内角点数,-h 6 是指标定板宽的内角点数,同时把和所有的图片放到与*.exe同一路径下,目的是为了方便找到这些文件。回车后就会生成一个的文件,大致如下:

%YAML:1.0
calibration_time: "12/11/15 10:29:34"
nframes: 9
image_width: 640
image_height: 480
board_width: 8
board_height: 6
square_size: 1.
flags: 0
camera_matrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 8.1851236466343710e+002, 0., 3.0903984677764441e+002, 0.,
       8.1746895098846801e+002, 2.0063288110431276e+002, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
   rows: 5
   cols: 1
   dt: d
   data: [ 2.5939251617159848e-001, -2.2449638446166724e+000,
       3.7120604052127667e-003, 6.2924995823829537e-004,
       4.0328352932945775e+000 ]

除了以上这些,还会生成一些文件。因为没有用到,不作解释。
这样,采用opencv得到了相机的内参和误差矩阵。注意,在dos下的命令不同于linux,进入e盘就直接输入

e:

参看e盘下的所有文档,键入

dir

关于matlab的工具箱就稍微简单一些,可以参考,/bouguetj/calib_doc/。下载工具箱后直接打开,按照读取图片,提取角点的顺序进行。可能在官网上不能直接下载工具箱,建议到I love matlab或其他网站下载。

下一讲:相机校正