我们如何确认内在矩阵是否正确?

时间:2016-12-22 20:22:36

标签: c++ opencv aruco

我使用aruco标记进行了相机校准。由于内在矩阵为K = [fx 0 cx; 0 fy cy; 0 0 1],其中fx = image_width/2 and fy = image_height/2。我进行了两次校准,结果如下:

案例1

camera_matrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 1.7837087835808685e+004, 0., 9.4648597205501767e+002, 0.,
       1.7846680517567835e+004, 6.2655678552312384e+002, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
   rows: 1
   cols: 5
   dt: d
   data: [ 1.3214125616841757e-001, 1.3720591379476604e+001,
       4.1379706976846960e-003, 3.2630160993931338e-002,
       7.2446581087476508e-002 ]

案例2

camera_matrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 3.9925887362481939e+004, 0., 9.6015637557091463e+002, 0.,
       3.5268399261164773e+003, 5.9886507612381956e+002, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
   rows: 1
   cols: 5
   dt: d
   data: [ 4.4338539084399781e-001, 4.9217843346948866e+000,
       5.8004377137432547e-002, 1.1762688789809046e-004,
       -5.4097967557812456e+002 ]

图片的分辨率为1920 * 1200,因此cxcy应为960和600。 在第二种情况下,cxcy符合预期;重新投影误差很大。在其他情况下,cxcy不匹配,但重新投影错误非常低(小于1)。

现在可以考虑哪些结果最佳,以及如何定义fxfy

2 个答案:

答案 0 :(得分:0)

你是正确的,cx和cy应该接近960和600.从这个角度来看,案例2看起来有点可能,但案例1肯定是合理的,中心点为(946,626)。

更令人惊讶的是获得的焦距参数。对于焦距对,(17837,17846)和(39925,3526)似乎都不合理。根据经验,fx参数应该与像素宽度(在这种情况下为1920)匹配到2倍(例如,iPhone 5S具有fx~ = 0.8 * pixelWidth)。并且fy应该匹配fx到1.2倍左右。对于情况1,fx偏离宽度10倍,对于情况2 fx和fy不匹配10倍。

我建议尝试使用多个校准工具箱并寻找其中任何两个校准工具箱之间的共识(比如请多位机械师查看您的车)。我推荐Jean-Yves Bouguet's calibration toolbox,这是OpenCV方法的先驱。

答案 1 :(得分:0)

如果您仍然可以访问相机,我会说尝试捕获更多图像并多次重复校准过程。

如@willem所述,使用Jean-Yves' Toolbox的答案可以让您看到角落检测,电路板的3d位置并帮助您丢弃嘈杂的图像。但是,Jean-Yves'工具箱仅适用于棋盘,需要手动输入具有正方形的ROI。

如果您觉得aruco板没有提供高精度,您也可以在opencv中尝试Charuco board

我认为以mm为单位的焦距很难与像素焦距相关,因为要这样做,你需要相机成像器的大小。这通常不可用。