OpenCV Bundle Adjustment

Я пытаюсь использовать настройку пакета OpenCV: LevMarqSparse :: bundleAdjust
К сожалению, результат кажется совершенно неверным:

Iteration: 0, normError: 4.30244e+46 (3.64614e+44)
decreasing lambda to 0.024556
Iteration: 1, normError: 2.72985e+31 (2.31343e+29)
decreasing lambda to 0.0024556
Iteration: 2, normError: 8.00302e+25 (6.78222e+23)
move failed: lambda = 0.024556, e2 = 2.62043e+40 (2.2207e+38) > 8.00302e+25(6.78222e+23)
move failed: lambda = 0.24556, e2 = 7.31034e+40 (6.1952e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556, e2 = 1.59706e+40 (1.35344e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 24.556, e2 = 1.33882e+40 (1.13459e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 245.56, e2 = 1.31518e+40 (1.11456e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2455.6, e2 = 1.31283e+40 (1.11257e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 24556, e2 = 1.3126e+40 (1.11237e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 245560, e2 = 1.31257e+40 (1.11235e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+06, e2 = 1.31257e+40 (1.11235e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+07, e2 = 1.31257e+40 (1.11235e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+08, e2 = 1.31257e+40 (1.11235e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+09, e2 = 1.31257e+40 (1.11235e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+10, e2 = 1.3125e+40 (1.11229e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+11, e2 = 1.31102e+40 (1.11103e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+12, e2 = 1.3103e+40 (1.11042e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+13, e2 = 1.31471e+40 (1.11416e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+14, e2 = 1.29156e+40 (1.09454e+38) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+15, e2 = 1.15709e+40 (9.80585e+37) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+16, e2 = 3.81423e+39 (3.2324e+37) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+17, e2 = 6.59182e+36 (5.58629e+34) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+18, e2 = 8.07694e+34 (6.84487e+32) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+19, e2 = 7.73149e+52 (6.55211e+50) > 8.00302e+25 (6.78222e+23)
move failed: lambda = 2.4556e+20, e2 = 2.061e+40 (1.74661e+38) > 8.00302e+25 (6.78222e+23)
decreasing lambda to 2.4556e+19

Если я вручную перепроецирую свои первые предположения для моих ключевых точек, я получу общее (суммированное) евклидово расстояние в пикселях (ошибка) 169,541.
между каждой ключевой точкой и перепроецированием ее триангулированной точки.
Та же самая проверка ошибок после вызова LevMarqSparse :: bundleAdjust выдает ошибку 5.50025e + 12.

Может ли кто-нибудь указать мне правильное направление? Благодарю.

3

Решение

В общем, когда что-то подобное происходит с настройкой пакета, очень вероятно, что хотя бы одна из следующих ошибок:

  1. 2D-проекции не являются правильными для 3D-точки, поэтому одна 3D-точка репроецируется на ложные 2D-проекции, и, таким образом, ошибка репроекции будет очень большой. Возможно, что-то случилось с индексами между 2D-проекциями и 3D-точками.
  2. Камеры, которые вы используете, не находятся в той же системе координат, какой требует OpenCV. Представьте вращение примерно на 180 ° или обратное движение, и 3D-точки будут проецироваться куда-то, но точно не в правильные 2D-положения. Так что, возможно, попробуйте взять матрицы обратной камеры. Если P — одна из ваших 4×4 однородных проекционных матриц, возьмите P.inv () вместо P.

Это помогло бы получить среднюю ошибку перепроецирования. Сумма не очень значима, так как мы не знаем, сколько 3D-точек и 2D-проекций у вас есть в вашей реконструкции.

1

Другие решения

Других решений пока нет …