文章目录
- 前言
- 1.打开matlab进行双目标定
- 2.获取想要的参数
前言
在相同的标定算法和标定参数下,Python和Matlab的标定精度是相同的。因为标定精度主要取决于标定算法和标定参数的质量,而不是编程语言的选择。
不同的编程语言可能使用不同的库或实现细节,可能会导致一些差异,但这种差异通常很小。因此,应该选择更熟悉的编程语言来进行标定,同时注意使用正确的算法和参数,确保标定的精度达到预期。
我一般就是两个都用一次,看哪个精度高一点。
1.打开matlab进行双目标定
输入下面代码,启动双目标定工具箱
stereoCameraCalibrator
选择add images,添加左右图像和标定板尺寸
详细步骤可以参考我的另一篇文章:matlab单双目标定提取相机标定中各张标定图片的重投影误差数据
2.获取想要的参数
这里畸变系数我是按左右相机畸变系数:[k1, k2, p1, p2, k3]保存的,大家不需要的话,可以修改一下。
% 内参参数
intrinsics1 = stereoParams.CameraParameters1.IntrinsicMatrix;
intrinsics2 = stereoParams.CameraParameters2.IntrinsicMatrix;
% 外参参数
rotation = stereoParams.RotationOfCamera2;
translation = stereoParams.TranslationOfCamera2;
[R, t] = cameraPoseToExtrinsics(rotation, translation);
% 焦距
focalLength1 = intrinsics1(1,1);
focalLength2 = intrinsics2(1,1);
f = (focalLength1+focalLength2)/2
% 基线
baseline = norm(t);
% 左相机畸变系数
distCoeffs1 = stereoParams.CameraParameters1.RadialDistortion;
tangCoeffs1 = stereoParams.CameraParameters1.TangentialDistortion;
leftDistCoeffs = [distCoeffs1(1:2) tangCoeffs1 distCoeffs1(3)];
% 右相机畸变系数
distCoeffs2 = stereoParams.CameraParameters2.RadialDistortion;
tangCoeffs2 = stereoParams.CameraParameters2.TangentialDistortion;
rightDistCoeffs = [distCoeffs2(1:2) tangCoeffs2 distCoeffs2(3)];
% 打印参数
fprintf('左相机内参: \n');
disp(intrinsics1);
fprintf('右相机内参: \n');
disp(intrinsics2);
fprintf('旋转矩阵: \n');
disp(R);
fprintf('平移矩阵: \n');
disp(t);
fprintf('左相机焦距: %f\n', focalLength1);
fprintf('右相机焦距: %f\n', focalLength2);
fprintf('焦距: %f\n', f);
% 打印参数[k1, k2, p1, p2, k3]
fprintf(' 左相机畸变系数: [%f, %f, %f, %f, %f]\n', leftDistCoeffs);
fprintf(' 右相机畸变系数: [%f, %f, %f, %f, %f]\n', rightDistCoeffs);
fprintf('基线: %f\n', baseline);
我们在使用python过程中,常常需要转换一下内参外参。
由于Matlab和Python的内参矩阵定义方式略有不同,Matlab中的内参矩阵需要进行转置后才能用于Python的cv2.stereoRectify。因此,在将Matlab的内参矩阵用于Python的cv2.stereoRectify时,需要进行转置操作。
% 内参参数
intrinsics1 = stereoParams.CameraParameters1.IntrinsicMatrix;
intrinsics2 = stereoParams.CameraParameters2.IntrinsicMatrix;
% 对内参矩阵进行转置
intrinsics1_transpose = intrinsics1';
intrinsics2_transpose = intrinsics2';
% 输出转置后的内参矩阵
fprintf('左相机内参(转置): \n');
disp(intrinsics1_transpose);
fprintf('右相机内参(转置): \n');
disp(intrinsics2_transpose);
此外,如果想临时关闭科学计数法,可以输入,永久关闭请百度:
format long g