张正友标定法(二)张正友Matlab工具箱的使用

zzy1        有两份资料,一是加州理工大学开发的标定工具箱,其中实现了全套张正友标定,网站也同样也有详细的使用文档。另一份是OpenCV的标定工具箱,其中使用的也是张正友标定,只不过略有简化。如果你不是直接使用C++书写标定程序的话,强烈推荐加州理工大学的标定工具箱。

        张正友Matlab工具箱使用手册,这份文档详细介绍了该工具箱的使用。这篇博客是对这份文档的补充,所以,如果你本着学习工具箱使用方法而来,请点击题头的链接。学习玩使用手册,这篇博客的内容可能会对你进一步了解工具箱有一定帮助。

        再附上张正友1998年的Paper,我们开始学习吧。

〇、阅读官网Demo中文手册

        单相机标定从calib_gui开始,进行完两个单相机标定后再进行双目标定,具体步骤官网和手册都很详细,这个不多介绍,自行学习。

一、相机标定过程注意事项

        1.标定板精度一定要高;

        2.标定板的平整程度对标定精度影响很大;

        3.实验时保证市场大小与标定板大小相当,或者稍微大一些,以保证标定板平移时仍然在视场内;

        4.先将光圈调到最大进行对角,对焦时考虑到全场清晰程度,以达到一种全场的均衡;

        5.对焦完成后,把光圈减小,增加曝光,同时补光增加亮度,这样做是未来增加拍摄时的景深;

        6.标定板亮度在150就可以,在180~200之间为宜,不能出现过曝光;

        7.相机标定过程中相机调好就不能再动了,更不能去调整焦距和光圈;

        8.采集时保证双相机的同步,这样可以避免时间变化带来的误差。

二、标定参数解读

1.单相机标定参数

        calibbb

        (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!

发表评论