相机标定的 MATLAB 工具箱

7

我需要对我的3D点执行重新投影(我已经有了来自Bundler的数据)。

我正在使用MATLAB中的相机标定工具箱来获取内在相机参数。我从27张图像(棋盘;图像是从不同角度拍摄的)中得到了以下输出。

Calibration results after optimization (with uncertainties):

Focal Length:     fc = [ 2104.11696  2101.75357 ] ± [ 23.13283  22.92478 ]
Principal point:  cc = [  969.15779   771.30555 ] ± [ 21.98972  15.25166 ]
Skew:        alpha_c = [  0.00000 ] ± [ 0.00000  ]
Distortion:       kc = [  0.11555  -0.55754  -0.00100  -0.00275  0.00000 ] ± 
                       [ >0.05036   0.59076   0.00307   0.00440  0.00000 ]
Pixel error:     err = [  0.71656   0.63306 ]

注意:这些数字误差大约是标准偏差的三倍(供参考)。
我想知道数值误差,即焦距误差+-[23.13283 22.92478]、主点误差等。这些误差数字实际上代表什么,它们的影响是什么?
像素误差非常小。
到目前为止,我使用上述数据中的以下矩阵进行重新投影: K=[2104.11696 0 969.15779; 0 2101.75357 771.30555; 0 0 1] 我认为上面的矩阵“K”是正确的。如果我做错了,请纠正我...
期待你的回复。

1
我猜您可以通过估计误差修改焦距和主点,将点重新投影并估算像素误差。然后您就会知道这些误差的影响。 - Genís
嗨,在我看来,最重要的是像素误差,即点的重新投影误差... - user1388142
你是使用OpenCV还是Matlab进行校准?看看这个工具箱(它是OpenCV的Matlab版本):http://www.vision.caltech.edu/bouguetj/calib_doc/ - Vuwox
2个回答

1

这里有两种错误。

第一种是重投影误差。一旦你校准了相机,就使用得到的相机参数将世界坐标下的棋盘格点投射到图像中。那么重投影误差就是这些投射点与检测到的棋盘格点之间的距离。重投影误差的可接受值取决于你的应用,但一个好的经验法则是平均重投影误差应小于0.5个像素。

另一种错误是每个估计参数得到的正负间隔。这些基于优化算法得出的标准误差。Bouguet的相机标定工具箱给出的值实际上是标准误差的3倍,对应着99.73%的置信区间。换句话说,如果相机标定工具箱报告焦距误差为+-[23.13283 22.92478],那么实际焦距就在你的估计区间内,概率为99.73%。

重新投影误差能够快速衡量您的校准精度。标准误差 - 让我们称之为“估计误差” - 对于更仔细地分析结果非常有用。例如,您应该尝试排除具有高平均重新投影误差的校准图像。另一方面,如果您的估计误差较高,则可以尝试添加更多的校准图像。
顺便说一下,计算机视觉系统工具箱现在包括一个GUI相机校准应用程序,使相机校准变得更加容易。文档中也有关于重新投影误差的良好解释。

0

相机校准工具箱从棋盘图像中提取网格点,并用于查找校准参数。

像素误差是提取的网格点的平均重新投影误差,即实际像素位置和使用计算的K矩阵的像素位置之间的误差。因此,这些数字大多在1(1像素误差)以内,尽管您的数字相当高。焦距误差是计算出的焦距长度的方差。

您只需要3或4张图像即可找到相机的校准(我忘记了实际数量)。如果您提供多个图像,它将为所有3-4个图像的组合计算K并计算K。误差是所有这些计算出的K的方差。

您的数字相当高(与您的22-23像素相比应该在3-4像素以内)。原因是校准图像不好和网格点的错误初始估计(这是通过在图像中选择4个角手动完成的)。通常,现代相机的f_x和f_y相同,您应该取两者的平均值(f_x + f_y)/ 2。

关于您的主点,似乎您的相机分辨率为1920 x 1600,您应该使用[980 800]而不是工具箱给出的值。通常,CCD现在被小心地放置,您的主点正好位于中心。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接