(1)工具包安装:工具包为Camera Calibration for matlab,首先把calib文件复制到matlab安装目录toolbox下,并在matlab中设置解压的calib文件夹的路径设置到MATLAB里,具体为①在主页->环境->设置路径->选择工具箱路径并确定,然后②在主页->环境->预设->常规->工具箱路径缓存中点击更新工具箱路径缓存,并应用和确认。
工具包下载,我的CSDN:
https://blog.csdn.net/Fateqzh?spm=1001.2100.3001.5343
永久链接:https://pan.baidu.com/s/1QDNV3Z7uOvK_TA90Uz-u-g 提取码:i0yl
1.单目相机标定
(2)此时,将你采集到的图片放到工具箱以外的文件夹中,在MATLAB中打开,我的文件路径为H:/cal_kinect/cal,如下图:
相机标定文件路径
注意上面的路径,必须选择图像所在的文件夹,不然下一步会出现错误“No image in this directory in either ras, bmp, tif, pgm, ppm or jpg format. Change directory and try again.”。
(3)回到MATLAB界面,输入命令,calib_gui,回车,选择standard(all the images are stored in memory),出现如下窗口,如下图所示:
calib工具界面
(4)standard下的界面
standard模式界面
点击“Image name”,出现你文件夹中图片名
目标文件夹中图片
此时会提示你输入Basename,Basename就是你的所有图片的名字中相同的部分。(值得注意的是我的matlab版本为2018a,无法跳出提示,可以直接输入接下来的步骤。)例如我的图片Basename就是r。
然后按照要求输入图片格式,例如我的图片是JPG格式就输入“j”。(格式简写:ras格式输入[]或r;bmp格式输入b;tif格式输入t;pgm格式输入p;jpg格式输入j;ppm格式输入m)
输入目标文件起始名及图片格式
回车,图片就读入到了MATLAB里,出现所有图片的缩略图,如下图:
识别得到所需的标定照片
(5)点击standard模式界面下的“Extract grid corners”,提取每幅图的角点,点击完成后出现如下界面:
过程参数
直接回车(没有参数)选择所有的图像,否则就需要输入图像索引,如[2 5 8 10 12]来提取这些图像中的角点。
然后通过直接输入“Enter”来选择默认的角点寻找窗口尺寸:wintx=winty=15。这就产生了一个15X15个像素有效的窗口尺寸。
角点提取引擎有一个对网格中的方格个数进行计数的自动机制。这个工具尤其对于图像数量大的时候非常便利,因为用户不需要手工地输入X和Y方向方格的数量。所以也可以直接回车(没有参数),然后第一张标定图像就会显示出来,如图:
标定所需的图片
(6)点击长方形棋盘格的四个边角点。选择的位置在下图中显示出来(注意:尽量精确地点击这四个角点,控制在实际角点的15个像素范围(角点寻找窗口)内,否则一些角点可能会被检测器丢失掉)。
点击的顺序规则:第一个点被用来作为棋盘格坐标系的原点,如下图中的O所示点。其他三个点可以以任何顺序点击。第一个点击的的点非常重要,尤其是对于多相机的情况(例如当计算几个相机在空间之间的相互关系的时候)。当处理多相机系统时对于不同的相机标定图像需要总是选择同一个棋盘格坐标系。经过上面的步骤之后,标定棋盘的边界就显示出来了。
角点点击顺序
(7)选完内点后,需要输入网格中每个方格在X和Y方向上的尺寸dX和dY(要根据自己的棋盘大小做调整),例如我的棋盘格标定板每格边长为20mm,因此设置为20mm的正方形。如下图。程序会自动对各个方向的方格数进行计数,然后在显示出没有畸变的预估角点,角点以大约0.1个像素的精度被提取出来。对第2、3、4...图像采用上述同样的步骤。
棋盘格边长输入
(8)在角点提取完之后,就可以单击standard模式界面上的“Calibration”来运行主要的相机标定程序。标定主要通过两个步骤来完成:初次初始化以及非线性优化。
初始化步骤中对标定参数进行闭环计算,这个过程不包括任何镜头畸变(程序名:init_calib_p
aram.m)
非线性优化过程中将对所有的标定参数最小化总体映射误差(从最小二乘的角度出发)。优化是对特定雅可比矩阵进行计算然后往梯度下降的方向进行的。
(9)单击standard模式界面上的“Reproject on images”来将网格角点映射到原始图像中。这些映射是基于当前的内参和外参计算出来的。输入一个空字符(直接按"Enter")作为“Number(s) of image(s) to show([]=all images)”来表示你想查看所有图像,下面的图像显示了所有检测到的角点的图像(叉)以及映射的网格角点(圆)。
再投影误差
(10)在standard模式界面上单击“Show Extrinsic”。外参(棋盘格相对于相机的相对位置)就以3D的形式显示出来了:
RGB相机视角
(11)在standard模式界面上“Analyse error”工具允许你去检查哪个点对应大的误差。单击“Analyse error”并且选择图像由上角的那个点。单击选中之后,下面的信息就会出现在命令行窗口,包括对应的点在第几张,角点坐标,误差等参数。
退出误差分析工具,在图像上的任何位置右击。
(12)单击“Save”保存标定结果(内参和外参)到matlab文件“Calib_Results.mat”。
2.双目相机标定
(1)上一步中保存双目的图片,包括15对左右摄像头获取的图像,还有两个独立标定的结果。
(2)在窗口处输入“stereo_gui",出现如图窗口。
双目标定界面
(3)点击第一个按钮“ Load left and right calibration files”。窗口提示输入左右标定文件名,分别先后输入对应文件名 Calib_Results_left.mat、Calib_Results_right.mat。
(4)运行全局双目优化算法通过点击按钮“Run stereo calibration ”。内外参数都被重新计算,所有未确定的参数也确定保证误差最小的基础上。会发现不确定的内参数都变小了,这是因为最优化算法的作用。默认情况下,优化算法会重新计算左右相机的内部参数,但是如果你不想让其优化,则在窗口运行recompute_instrinsic_left和或者recompute_instrinsic_right。
(5)双目相机的空间位置和标定平面可以可视化,通过点击按键“Show Extrinsics of the rig”。
(6)点击“ Savestereo calib results” ,存储标定数据结果。
(7)校正图像,点击“ Rectify the calibrationimages ”,对所有图片校正后图像存储在运行目录文件下。
这里得到的外参om与T为右摄像头相对于左摄像头的位置。
这里需要注意的是Matlab标定结果中的om向量,这个向量是旋转矩阵通过Rodrigues变换之后得出的结果,如果要在cv2.StereoRectify中使用的话,需要首先将这个向量用cv2.Rodrigues转换成旋转矩阵。
注意事项:
(1)上述自带工具包标定:进行双目标定时,双目相机的左右相机获取的图像必须有相同的大小尺寸;
(2)标定图片不宜过多,过多数据冗余和程序内存受限,过少噪声精度不足;
(3)尽量把所有网格包含在图像内,不要角度过于偏,过于远;
(4)打印的标定板所选区域格子数互质。