前言
我们在使用matlab工具箱进行相机标定时,有时候想得到每张标定图片的重投影误差和opencv-python中的比较一下。然而,该数据在系统里没有直接输出,我们应该如何获取呢?
参考了 《提取相机标定中各张标定图片的重投影误差数据》中的思路给出单双目代码,直接粘贴使用!
思路如下:
1 、提取角点坐标的像素坐标;
2 、将标定板中角点在世界坐标中的坐标(标定平面为世界坐标系中Z=0所在平面)基于相机参数反计算得到新的像素坐标;
3 、计算两个对应像素坐标的2范数求和并取均值,即可得到该张标定图片的平均投重影误差。
一、单目标定
启动单目标定工具箱
cameraCalibrator
添加照片,选择calibrate,选择export camera parameters,点击确定
然后在主窗口输入以下代码,把图片数量和角点个数改成自己的,就可以得到我们想要的数据了
Error=0;
num=9; %标定图片的张数
corner=55; %标定板角点提取的个数
for i=1:num
s=0;
v1=0;
A=cameraParams.ReprojectionErrors(:,:,i);
for j=1:corner
v=[A(j,1),A(j,2)];
v1=norm(v);
s=v1+s;
end
value=s/corner;
fprintf('%f\n', value);
Error=Error+value;
end
二、双目标定
启动双目标定工具箱
stereoCameraCalibrator
添加左目和右目照片,选择coefficients和tangential distortion ,点击calibrate然后选择export camera parameters,点击确定
在主界面上就可以看到输出
然后复制代码到下面运行,就可以输出两个相机的参数了,根据识别识别出来的照片数量和你自己棋盘角点修改一下就可以了。
Error1=0;
Error2=0;
num=5; %标定图片的张数
corner=88; %标定板角点提取的个数
for i=1:num
s1=0;
v1=0;
A=stereoParams.CameraParameters1.ReprojectionErrors(:,:,i);
for j=1:corner
v1=[A(j,1),A(j,2)];
v1=norm(v1);
s1=v1+s1;
end
value1=s1/corner;
fprintf('%f\n', value1);
Error1=Error1+value1;
end
fprintf("---------\n");
for i=1:num
s2=0;
v2=0;
B=stereoParams.CameraParameters2.ReprojectionErrors(:,:,i);
for j=1:corner
v2=[B(j,1),B(j,2)];
v2=norm(v2);
s2=v2+s2;
end
value2=s2/corner;
fprintf('%f\n', value2);
Error2=Error2+value2;
end
结果如下: