标定工具箱下载地址:http://www.vision.caltech.edu/bouguetj/calib_doc/download/index.html
下载完成后解压到mtlab\toolbox路径下,并相应添加路径。
在matlab命令窗口运行主calib_gui,屏幕上会出现一个模式选择窗口:
两种操作模式:标准或内存有效。在标准模式下,所有用于校准的图像都会一次加载到内存中;内存有效模式下,每张图像都会一张一张地加载。
选择模式后出现主校准工具箱窗口:
下载示例图片并解压到TOOLBOX_calib目录下的新建文件夹calib_example中,把matlab的当前路径设置为calib_example。
一、读取图像:
单击相机校准工具窗口中的image names,输入校准图像的基本名称( Image)和图像格式( t)。 然后,所有图像(其中的20张)都将通过变量 I_1, I_2,…, I_20加载到内存中。图像数量存储在变量 n_ima中(此处= 20)。 Matlab窗口应如下所示:
可以通过运行mosaic生成图像的缩略图:
二、提取网格角:
单击“相机校准工具”窗口中的“Extract grid corners”。
一直按enter,默认处理所有图像,窗口大小:wintx = winty = 5,有效窗口大小为11x11像素。
角点提取可以自动计算网格中的方格数,可以让用户不必手动输入图像在x和y方向上的方格数。但是,在极少数情况下,当校准极度失真的镜头时,无法识别需要手动输入。保持默认模式,使用自动技术,按一个空参数的“ enter”。
分别点击除最外层的边缘四个角点,第一个点会作为原点,在剩下所有图片中第一个点不变,其他点顺序随意,尽量精确。
输入方格大小dx\dy,默认是30mm,根据实际输入。
选择完成后,自动提取角点位置和数量,如下图所示:
如果预测的角点接近真实的图像角点,按“ enter”,然后使用这些位置作为初始猜测角点。如果误差稍大,输入任意值后,提示输入kc,kc范围一般为[-1,1]。
同样的步骤做完剩下的图,当最后一张图做完之后,会生成一个calib_data文件到图像目录下,再次使用时,不用再重复以上步骤。
注意
执行自己的校准时,可能会出现另一个问题。如果镜片变形确实太严重(例如,对于鱼眼镜头),则基于单个变形系数kc的简单引导工具可能不足以为拐角位置提供足够好的初始猜测。对于极少数困难的情况,工具箱中包含一个脚本程序,该脚本程序允许完全手动提取角点。该脚本文件称为manual_corner_extraction.m(在内存高效模式下,应改用manual_corner_extraction_no_read.m),并应在传统角点提取代码之后执行。显然,这种角点提取方法在应用于很多图像时可能会非常耗时。因此,建议在所有其他操作都失败后,将其用作最后的选择。
三、主要校准步骤:
(1)初次校准
角点提取后,点击该按钮校准的的 camera calibration来运行的主摄像头校准程序。
校准分为两个步骤:首先进行初始化,然后进行非线性优化。
初始化步骤基于不包含任何镜头畸变的校准参数计算封闭式解决方案(程序名称: init_calib_param.m)。
非线性优化步骤将所有校准参数(固有的9 DOF:焦点,主点,畸变系数和6 * 20 DOF外部=> 129参数)上的总重投影误差(最小二乘)最小化。通过迭代梯度下降对雅可比矩阵(程序名称:go_calib_optim.m)进行显式(闭合形式)计算来实现优化。
校准参数存储在许多变量中,此时偏斜系数alpha_c和6阶径向失真系数(kc的最后一项)尚未估算。
点击Reproject on images以显示网格在原始图像上的投影。这些预测是根据当前的内部和外部参数计算的。输入一个空字符串(只需按“ enter”)表示显示所有图像:
单击analyse error,投影误差也以彩色编码的十字形显示:
单击Show Extrinsic,以3D图的形式显示外部参数(网格相对于摄像机的相对位置):
帧 (O c,X c,Y c,Z c)是摄像机参考帧。红色金字塔对应于由图像平面定义的相机的有效视场。要切换视图,只需单击位于图左下角的Switch to world-centered view按钮。在此新图形上,每个摄像机的位置和方向都由绿色金字塔表示。
(2)再次校准
回顾误差图,发现误差非常大。通过自动重新计算所有图像上的图像角点来进行校正:按下Recomp.corners,依旧默认wintx = winty = 5,11*11,处理所有图像。
单击Calibration,再次校准优化。
两个值0.12668和0.12604分别是x和y方向上的重投影误差的标准偏差(以像素为单位)。观察到校准参数的不确定性也会被估算。数值约为标准偏差的三倍。
优化之后,单击 Save将校准结果(内部和外部)保存在matlab文件 Calib_Results.mat中
再次单击在图像上重新投影以将网格重新投影到原始校准图像上。前四个图像如下所示:
单击analyse error以查看新的重新投影误差(注意该误差比以前小得多):
右键单击误差图后,单击Show Extrinsic以显示网格相对于摄像机的新3D位置:
(3)个别图校准
使用analyse error工具,可以检查哪些点对应于较大的误差。单击分析错误,然后单击此处显示的图形区域(图形右上角):
单击后,以下信息将出现在Matlab主窗口中:
这意味着相应点在图像18上,在校准网格中的网格坐标(0,0)处(在图案的原点处)。退出误差分析,打开图18,观察点(0,0)处,可以看到误差较大。
如果在一个或多个图像上角点提取得不好,用户可以使用不同的窗口大小(更大或更小)重新计算特定图像的角点。
例如,使用窗口大小(wintx = winty = 9)重新计算20个图像的图像角,图像5、7、8、19(使用wintx = winty) = 7)和图片18(使用wintx = winty = 8),运行三次Recomp.corners:
重新校准:
打开图18,观察误差变小:
最后再次单击保存以将校准结果(内部和外部)保存在matlab文件Calib_Results.mat中
四、失真影响
在matlab提示符下运行脚本visualize_distortions,然后生成以下三个图像:
第一张图显示了完整失真模型(径向+切向)对图像每个像素的影响。每个箭头表示由透镜畸变引起的像素的有效位移。观察到图像角落处的点最多移位了25个像素。第二张图显示了失真的切向分量的影响。在此图上,最大感应位移为0.14像素(在图像的左上角)。最后,第三张图显示了失真的径向分量的影响。此图与完全失真图非常相似,表明切向分量很可能在完整失真模型中被丢弃。在这三个图形上,十字形表示图像的中心,圆圈表示相机畸变中心的位置。