我正在使用MATLAB-CVST执行立体摄像机校准。从28张图像(6 X 7个角),获得 stereoParams ( stereoParams.MeanReprojectionError = 0.3168)。
接下来,我拍了一个棋盘式立体声对( CB_I1 & CB_I2 )。
到 CB_I1 我应用了以下功能:
接下来,对于CB_I1和& CB_I2,我应用以下功能:
这是我的代码:
CB_I1_undist = undistortImage(CB_I1, stereoParams.CameraParameters1);
CB_I2_undist = undistortImage(CB_I2, stereoParams.CameraParameters2);
[imagePoints1, ~] = detectCheckerboardPoints(CB_I1_undist);
[imagePoints, ~] = detectCheckerboardPoints(CB_I2_undist);
worldPoints = triangulate(imagePoints1,imagePoints,stereoParams);
Translated_pnts = zeros(size(worldPoints));
Translated_pnts(:,1) = worldPoints(:,1) - T(1);
Translated_pnts(:,2) = worldPoints(:,2) - T(2);
Translated_pnts(:,3) = worldPoints(:,3) - T(3);
Rotated_pnts = Translated_pnts * (R');
Transformed_points = Rotated_pnts;
最终, Transformed_points 看起来像这样:
等等......获得42分。
我该如何解释?我希望 Transformed_points 为:
因为每个方块尺寸为40mm。
如果您需要任何其他信息,请与我们联系。
答案 0 :(得分:2)
你说你的平均重投影误差为0.3~。
如果我计算你的第一点和第二点之间的距离:
sqrt((-0.2006+0.1993)^2+(-1.2843-39.1922)^2+(3.0466-2.0656)^2)
ans >>
40.4884
这就是你的期望吗?当然,它不是100%准确。
另外,再看看你的观点。它们正是您所期望的。而不是120你有120.06。而不是160,你有159.94。
你错过了大约0.3毫米的分数。 0.3 MILIMETERS 。 拿一把尺子,试着测量0.3毫米!!
哇,我认为这是一个非常好的错误,不是吗?
无论如何,您可以使用更多校准图像来减少该错误,但是,我会说您已经做得很好。
测量误差的一个好方法是它具有更多意义,就是计算像素误差,而不是真实的物理误差。如果将误差除以像素的长度,则可以知道有多少像素的误差。您会发现在您的情况下,您很可能具有亚像素精度(像素误差<1)。这是非常好的,因为它意味着你的错误小于你可以衡量的,所以,在某种意义上(不是真的,但是是的)你打破了Shanon原则!干得好
答案 1 :(得分:1)
对Ander的回答我想补充一点,你应该确保使用卡尺非常精确地测量方形尺寸。如果你可以达到亚毫米级精度,那将对你的重建精度产生影响。另外,请确保不要在图像上使用有损压缩,i。即没有jpeg。 Jpeg工件也会降低您的准确性。