相机标定——单目标定和双目标定

相机标定——单目标定和双目标定


1.标定目的

在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。

(双目)摄像机标定最主要的目的:是要得求出每个摄像机的相机内参数矩阵K和畸变系数矩阵D,左右两个摄像机的相对位置关系(即右摄像头相对于左摄像头的平移向量 t和旋转矩阵R)。  由于OpenCV中StereoCalibrate标定的结果极其不稳定,甚至会得到很夸张的结果,因此推荐采用Matlab进行标定,再将标定的结果读入OpenCV,来进行后续图像校准和匹配。

先进行单目分别标定,再进行双目标定

2.单目标定过程

(1)采集棋盘图。

尽量让棋盘占据照片中最多的画面,这样可以得到更多有关摄像头畸变方面的信息,同时拍摄的棋盘图是具有多个角度的,拍摄照片数量要多一点,推荐12张以上。

(2)matlab标定

打开matlab,选择APP->图像处理和计算机视觉->单目相机标定模块。如图1所示,进入图2所示界面。

相机标定——单目标定和双目标定_第1张图片图1 单目相机标定工具箱

 

相机标定——单目标定和双目标定_第2张图片图2 单目相机标定界面

 

(3)导入图片

选择图2中的Add Images导入之前拍摄的单目相机(双面时,为左侧相机或者右侧相机)下拍摄的所有图片,按住shift键进行图片多选,此时会弹出设置棋盘格宽度的对话框,如图3所示,输入棋盘单元格的宽度,按确定键。本文此处采用的是25mm的单元格。图片导入完成后界面如图4所示。

相机标定——单目标定和双目标定_第3张图片图3 输入棋盘单元格宽度

 

相机标定——单目标定和双目标定_第4张图片图4 导入图片后的界面

 

(4)设置校正参数。

如图5所示,主要在这4个部分设置校正参数,此处分别记为M1/M2/M3/M4。分别对这4个模块进行介绍。

M1:Radial Distortion.畸变参数(需理解畸变参数含义)。2 Coefficients 表示计算2个畸变参数:k1/k2;3 Coefficients 表示计算3个畸变参数:k1/k2/k3。一般来说选择计算2个畸变参数即可。计算3个畸变参数时,k3值比较小,大概量级为1e-5,可以忽略(实际计算过程中,如果考虑太多高阶的畸变参数,会导致标定求解的不稳定。如果选择了计算3个畸变参数,需要注意畸变矩阵的排列顺序:[k1,k2,p1,p2,k3])。

M2:该模块指偏斜系数以及切向畸变,现在相机质量比较高,可以不予勾选。

M3:可选参数设置。点开如图6所示,可以在其中输入一些初始参数,matlab将进行迭代计算,理论上可以减少迭代计算量。可以不输入,由matlab进行自主迭代。

M4:计算模块。点击之后,matlab将进行计算。

相机标定——单目标定和双目标定_第5张图片图5

相机标定——单目标定和双目标定_第6张图片图6 可选参数设置

 

(5)计算结果再分析

点击图5中Calibrate开始进行计算。Matlab会自动剔除一些不合格的图像,然后进行计算,界面如图7所示。

在图7中,右侧上方是照片的重投影误差(重投影概念:认为标定板上的物理点是理论值,它经过投影变换后会得到理论的像素点a,而测量的点经过畸变矫正后的像素点为a′,它们的欧氏距离||aa||即表示重投影误差。)。若下图标注的地方误差较大,可删除该张图像,matlab再次进行计算。从图7中可以看到照片6的重投影误差比较大,因此删除图像6进行重新计算(在图6上点击右键,然后点击删除即可,如图8所示)。计算完成之后,再次观察重投影误差是否比较小。直至重投影误差比较小,该过程即可结束,然后导出校正结果。

相机标定——单目标定和双目标定_第7张图片图7 计算结果界面

 

相机标定——单目标定和双目标定_第8张图片图8 删除重投影误差比较大的照片6

 

(6)导出计算结果

如图9所示,点击Export Camera Parameters导出校正结果。在弹出的对话框中点击确定即可,如图10所示。然后关闭相机校正模块,回到matlab主界面,如图11所示。在图11左侧工作区中点击刚才导出的变量名称,即可在右侧看到相应的矩阵,我们主要关心内参矩阵和畸变矩阵。

相机标定——单目标定和双目标定_第9张图片图9 导出计算结果

 

相机标定——单目标定和双目标定_第10张图片图10 将计算结果导出到工作空间

 

相机标定——单目标定和双目标定_第11张图片图11 matlab主界面

 

 

相机标定——单目标定和双目标定_第12张图片图12 计算结果

 

3双目标定

单目标定完成之后得到了相机的参数,对左右摄像头分别进行标定,得到两个摄像头各自的内参矩阵和畸变参数向量,接下来进行双目相机的标定。双目相机标定时的照片必须是左右相机同时拍摄的,因为只有同时拍摄才能得到同一物理点在左右相机图像平面上的投影。

双目标定的过程和单目标定过程基本一致,过程如下:

(1)选择matlab中的双目标定模块

相机标定——单目标定和双目标定_第13张图片图13 双目标定模块

 

(2)导入图片并设置棋盘格尺寸

导入左,右相机拍摄的图片文件夹,同时设置棋盘格宽度,如图14所示。点击确定之后,matlab会自动剔除一些质量不高的图片。因此拍摄时图片尽量多一些,图片要求和单目标定时要求一致,数量建议20张以上。

相机标定——单目标定和双目标定_第14张图片图14 导入图片

 

(3)设置参数

各参数设置和含义与单目标定时保持一致。此时可以输入单目标定时得到的内参矩阵(也可不输)。然后进行计算,计算过程和单目标定一致。

相机标定——单目标定和双目标定_第15张图片图15 设置参数

 

(4)导出结果

计算完成之后,参考单目标定过程,导出计算结果。如图16所示。

相机标定——单目标定和双目标定_第16张图片图16 双目标定结果

 

说明:左右两个相机的焦距应该保持一致,因为在后续的视差图转换为三维图时的Q矩阵(重投影矩阵)只有一个f值。所以必须要求至少焦距相近。而且立体成像的三角测量(Learning OpenCV书中提到)的前提假设就是fl=fr。(调整两个摄像头的焦距相同的方法:离两个相机相同远处放置标定板,分别调节两个相机的焦距,使得两个画面的清晰度相似。)

至此,双目标定完成。

双目标定参考文档(英文):https://ww2.mathworks.cn/help/vision/ug/stereo-camera-calibrator-app.html

 

 

经过双目标定得到摄像头的各项参数后,采用OpenCV中的stereoRectify(立体校正)得到校正旋转矩阵R、投影矩阵P、重投影矩阵Q,再采用initUndistortRectifyMap函数得出校准映射参数,然后用remap来校准输入的左右图像。

 

 

你可能感兴趣的:(C++,OpenCV)