我正在尝试使用棋盘初步校准传感器。我跑了大约 50 次,在校准相机后,我继续使用 solvepnp 来教授坐标系,因为我使用的是定义明确的棋盘来实际学习真实世界的坐标。
作为 SolvePnP 的输入,我使用所有角点值及其对应的现实世界距离。
我最大的问题是我从 SolvePvP 计算的转换矩阵有点奇怪。据我了解,平移矩阵是相机与坐标系之间的实际偏移量,我将其定义为棋盘的上半部分。但是我得到了完全随机的值,Tz 给了我一个大约 6000 的值,即使相机和棋盘之间的距离大约是 1600 毫米,而且我什至没有使用深度值作为 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
}