有两份资料,一是加州理工大学开发的标定工具箱,其中实现了全套张正友标定,网站也同样也有详细的使用文档。另一份是OpenCV的标定工具箱,其中使用的也是张正友标定,只不过略有简化。如果你不是直接使用C++书写标定程序的话,强烈推荐加州理工大学的标定工具箱。
张正友Matlab工具箱使用手册,这份文档详细介绍了该工具箱的使用。这篇博客是对这份文档的补充,所以,如果你本着学习工具箱使用方法而来,请点击题头的链接。学习玩使用手册,这篇博客的内容可能会对你进一步了解工具箱有一定帮助。
再附上张正友1998年的Paper,我们开始学习吧。
〇、阅读官网Demo或中文手册
单相机标定从calib_gui开始,进行完两个单相机标定后再进行双目标定,具体步骤官网和手册都很详细,这个不多介绍,自行学习。
一、相机标定过程注意事项
1.标定板精度一定要高;
2.标定板的平整程度对标定精度影响很大;
3.实验时保证市场大小与标定板大小相当,或者稍微大一些,以保证标定板平移时仍然在视场内;
4.先将光圈调到最大进行对角,对焦时考虑到全场清晰程度,以达到一种全场的均衡;
5.对焦完成后,把光圈减小,增加曝光,同时补光增加亮度,这样做是未来增加拍摄时的景深;
6.标定板亮度在150就可以,在180~200之间为宜,不能出现过曝光;
7.相机标定过程中相机调好就不能再动了,更不能去调整焦距和光圈;
8.采集时保证双相机的同步,这样可以避免时间变化带来的误差。
二、标定参数解读
1.单相机标定参数
(1)fc为焦距的像素尺寸,计算位F/DX,F/DY,F为集合焦距尺寸,DX,DY为像元尺寸。
(2)cc为主点位置
(3)alpha_c为倾斜稀疏,反映X轴和Y轴的夹角,该值为0,说明X轴与Y轴相互垂直
(4)kc为畸变系数,共有五个,前两个和最后一个为径向畸变,第三个和第四个为切向畸变,一般第五个为0,切向畸变也很小
(5)err为像素误差,单位为像素
(6)Tc为平移矢量
(7)omc为旋转矢量
(8)Rc为旋转矩阵 Rc = rodrigues(omc),参见我之前专门介绍rodrigues变换的文章
2.双目标定参数
(9)om表示右摄像机相对左摄像机的旋转向量
(10)T标识右摄像机相对左摄像机的平移向量
三、双目标定结果的评价
1.官网上的评价方法,三维点转化到二维点,与真实值对比
上面链接指向官网中一个例子,该例子最后又这样一个表达式, 将参数估算出的值反算回去,与标定板坐标系中的准确值做对比
[Xc_1_left,Xc_1_right] = stereo_triangulation(x_left_1,x_right_1,om,T,fc_left,cc_left,kc_left,alpha_c_left,fc_right,cc_right,kc_right,alpha_c_right); X_left_approx_1 = Rc_left_1' * (Xc_1_left - repmat(Tc_left_1,[1 size(Xc_1_left,2)]));
2.另一种评价方法,右相机点转化到左相机,与真实值对比
% omc_left_1 Tc_left_1 X_left_1 % omc_1 X_right_1 X_right_1 % om T % 实际上,当运行完stereo_gui中的show entrinsics of stereo rig % 命令以后,以下代码就具备了运行所需条件 left_1=rodrigues(omc_left_1) * X_left_1 +Tc_left_1 * ones(1,length( X_left_1)); right_1_i=rodrigues(omc_1) * X_right_1 +Tc_1 * ones(1,length( X_right_1)); R=rodrigues(om); right_1 = R'*(right_1_i - repmat(T,[1 size(right_1_i,2)])); figure;scatter3(left_1(1,:),left_1(2,:),left_1(3,:),'b') hold on; scatter3(right_1(1,:),right_1(2,:),right_1(3,:),'r+')
这些方法的代码matlab实现都比较容易,就直接贴在上面了。
OK,See You Next Chapter!