Matlab标定工具箱使用教程
这个教程将带你完整地利用20到25张平面棋盘格图像进行相机标定。
这个教程将让你学会如何使用所有工具箱的特征:载入图像、提取图像角点、运行标定引擎、显示结果、控制精度
添加和删减图像、图像矫正、导出标定不同格式的数据...这个教程对于刚开始使用工具箱的人来说非常重要。
首先下载Matlab标定工具箱:
[http://www.vision.caltech.edu/bouguetj/calib_doc/download/index.html]
(http://www.vision.caltech.edu/bouguetj/calib_doc/download/index.html)
将其解压到Matlab的工作目录下,然后将其包含到matlab的工作路径下。
运行calib_gui就可以打开matlab标定工具箱主界面:
1、将标定用的图像单独存放于calib_example文件夹中。
2、在matlab中,进入到calib_example文件夹中。
3、读取图像:
点击标定工具窗口中的“Image names”按钮。输入标定图像的基名和图像的格式(例如标定图像的名称分别是
Img1.jpg,Img2.jpg,Img3.jpg...基名就是Img 图像格式就是jpg)
然后所有的标定图像都将加载进来,其对应的变量名分别是I_1,I_2,...图像数量对应的变量是n_ima。
载入完图像之后的图像如下:
之后载入的图像将以缩略图的形式显示出来:
一些图像内存不足的问题在此就不作详细的介绍了,现在一般的电脑RAM都是足够来做标定的。
4、提取角点:
点击标定工具箱上的“Extract grid corners”按钮。在matlab命令行会出现如下提示信息:
直接按“Enter”(没有参数)选择所有的图像,否则就需要输入图像索引如[2 5 8 10 12]来提取这些图像中的
角点。然后通过直接输入“Enter”来选择默认的角点寻找窗口尺寸:wintx=winty=5。这就产生了一个11X11个像素
有效的窗口尺寸:
角点提取引擎有一个对网格中的方格个数进行计数的自动机制。这个工具尤其对于图像数量大的时候非常便利,因为
用户不需要手工地输入X和Y方向方格的数量。然而对于极少数场合,这个工具可能不能得到正确的方格数量,这种情况
只有当镜头有很大的畸变。在这种情况下,角点提取这个过程,工具箱提供了一个可选项可供用户关闭自动计数方格。
在这个特殊的模式下,使用者优先对每张图像使用方格自动计数功能,因此,直接按“Enter”键默认。(通常情况
下都使用默认形式,然后如果确实有需要,再重新处理几张有问题的图像。)
然后第一张标定图像就会显示出来:
然后点击长方形棋盘格的四个边角点。选择的位置在下图中显示出来(注意:尽量精确地点击这四个角点,控制
在实际角点的5个像素范围内,否则一些角点可能会被检测器丢失掉)
点击的顺序规则:第一个点被用来作为棋盘格坐标系的原点。其他三个点可以以任何顺序点击。第一个点击的的点
非常重要,尤其是对于多相机的情况(例如当计算几个相机在空间之间的相互关系的时候)。当处理多相机系统时
对于不同的相机标定图像需要总是选择同一个棋盘格坐标系。三维标定可以运行stereo_gui.m.
第一个点的选择非常重要,一定要注意
经过上面的步骤之后,标定棋盘的边界就显示出来了:
输入网格中每个方格在X和Y方向上的尺寸dX和dY(在这里,dX=dY=30mm=default values):
注意:你可以直接输入“Enter”直接用默认参数,程序会自动对各个方向的方格数进行计数,然后在显示出没有
畸变的预估角点。
如果预估的角点很接近实际的图像角点,则下面的步骤就可以略过了(如果没有那么大的图像畸变)。在现在的
图像中:预估的角点足够接近实际的图像角点。因此,没有必要通过输入一个猜测的径向畸变系数去帮助软件去
检测图像角点。直接输入“Enter”,会使用这些初始的预估角点作为提取的角点:
然后图像角点就被自动地提取出来了,然后显示出来,如下图所示:
角点以大约0.1个像素的精度被提取出来。
对第2、3、4...图像采用上述同样的步骤。如下图是将图像2、3、4..图像的角点提取出来:
从上面观察到方格尺寸dX、dY总是被保持在它们的初始值(30mm).
有时,预估的角点不是那么足够地接近实际图像角点,在这种情况下,就有必要通过输入一个镜头畸变系数来调整
预估角点。第15张图像就是这种情况,在这张图像中,预估角点的图像如下图所示:
可以看到一些预估角点和实际图像的角点的差距很大,这样就会导致错误的角点提取。而这产生的原因就是因为
图像畸变。为了帮助系统更好地判断角点的位置,用户可以手动地输入一个镜头畸变系数Kc.为了输入镜头畸变
系数,我们需要在那个问题“Need of an initial guess for distortion?”这里输入一个非空参数,这里
我们输入畸变系数Kc=-0.3(一般这个系数在-1到1之间)。如下图所示:
根据这个畸变系数,新的预估角点位置如下图所示:
如果新的预估角点足够接近实际的图像角点(如上图所示),则输入任何不为空的字符(如1)作为问题“Satisfied
with distortion?”的回答。然后亚像素角点的位置就会使用新的带有图像畸变的预估位置进行计算。
如果我们还不满意,我们可以输入一个空的字符串作为问题"Satisfied with distortion?"(直接输入“Enter”)
然后尝试一个新的畸变系数Kc。你可能会重复很多次这样的过程直到对结果满意为止。
注意:上面用到的畸变的值仅仅是用来帮助提取角点,其不会影响下面主要的标定过程。换句话说,这里的畸变系数并不会作为最终的畸变结果,也不会用于优化畸变系数的初始值
最后检测到的角点如下图所示:
对剩下的几张图片重复上述过程(图片16-20).然而对这些图像,不要使用预先的畸变系数这个选项,尽管提取的
角点不是很正确。在下面的步骤中,我们将纠正它们(在这个例子中,我们不会使用畸变系数这个选项用于图像15
但是这样对于我们证明很有用)。
在角点提取之后,就会自动产生一个calib_data.mat的matlab数据文件。这个文件包含了整个角点提取过程中
的所有信息(图像坐标,对应的3D网格坐标,网格尺寸....)。这个文件是为了防止matlab突然崩溃而创立的。
载入这个文件可以避免你又重复一遍上面的过程。
在你自己标定的过程中,当图像中有大的畸变的时候,这个程序可能不能够在网格中自动对方格进行计数,在这种
情况下,X和Y方向的方格数量必须手动输入。这在这个例子中没有出现这种情况。
在你自己做标定的时候,还有一种情况会出现。如果镜头畸变非常严重(像鱼眼镜头),这个基于单个畸变系数的
简化的指导工具对角点的初始预估可能就不够用。
对于这几种麻烦的情况,在工具箱中的一个脚本程序支持完全手动的角点提取(例如每次点击一个角点)。脚本文
件叫做“manual_corner_exteaction.m”(在内存优化模式下,你可以使用"manual_corner_
extraction_no_read.m"),并且应该在传统的角点提取代码运行之后才能执行这个代码。(因为它基于传统的
角点提取的一些数据)。
显然,这种角点提取的方法当图像数量多的时候是非常耗时的。因为它作为当前面的尝试都失败的情况下的一种
救命稻草。但完全可以不用太担心这个,在这个例子中不会出现这种情况。
主