OpenCV摄像机校准和SolvePNP转换结果

时间:2018-11-12 17:47:00

标签: opencv camera-calibration opencv-solvepnp

我最初尝试使用棋盘校准传感器。 我进行了大约50次奔跑,在校准相机后,我继续使用Solvepnp来教坐标系统,并且由于我使用定义明确的棋盘来实际学习现实世界的坐标。

作为SolvePnP的输入,我使用所有角值及其对应的真实世界距离。

我最大的问题是我从SolvePvP计算得出的转换矩阵有点奇怪。据我了解,平移矩阵是相机和坐标系之间的实际偏移量,我将其定义为棋盘的上部。但是我得到的是完全随机的值,即使相机和棋盘之间的距离约为1600 mm,Tz的值仍约为6000,而且我什至不使用深度值作为SolvePnP方法的参数。

有什么建议可以解决吗?

代码示例:

50 x DrawChessboardCorners
Corner result: {X = 1170.45984 Y = 793.002}
               {X = 1127.80371 Y = 792.54425}

3d Points:     {X = 175 Y = 70, Z = 0}
               {X = 140 Y = 70, Z = 0}

每次运行总共18(6x3)个结果,总共运行50次。

然后我校准相机:

CalibrateCamera(_objectsList, _pointsList,
                new Size(_sensorWrapper.Width, _sensorWrapper.Height),
                cameraMatrix, distCoeffs,
                CalibType.Default,
                new MCvTermCriteria(30, 0.1), out _, out _);

然后,通过使用cameraMatrix和distCoeffs,我通过使用左上角,右上角,左下角和右下角以及它们的真实坐标来使用SolverPnP。

我从校准中得到的结果是:

    {
  "CameraMatrix": [
    [
      5969.947,
      0.0,
      959.687256
    ],
    [
      0.0,
      6809.737,
      540.3694
    ],
    [
      0.0,
      0.0,
      1.0
    ]
  ],
  "DistortionCoefficientsMatrix": [
    [
      0.141516522,
      285.377747,
      0.008248664,
      0.0280253552,
      1.5376302
    ]
  ],
  "RotationMatrix": [
    [
      0.9992069,
      -0.0270648878,
      0.0292078461
    ],
    [
      -0.0003847139,
      0.726907134,
      0.68673563
    ],
    [
      -0.0398178138,
      -0.6862022,
      0.7263202
    ]
  ],
  "TranslationMatrix": [
    [
      22.5370159
    ],
    [
      -362.535675
    ],
    [
      5448.58057
    ]
  ],
  "SensorName": "BRIO 4K Stream Edition",
  "SensorIndex": 0,
  "Error": 0.18790249992423425
}

0 个答案:

没有答案