Как правильно использовать OpenCV triangulatePoints и данные GPS?

Я пытаюсь оценить 3D-позицию мировой координаты из 2 кадров. Кадры сняты одной и той же камерой с разных позиций. Проблема в том, что оценка неверна.

У меня есть

Camera Intrinsic parameters
K = [4708.29296875, 0, 1218.51806640625;
 0, 4708.8935546875, 1050.080322265625;
 0, 0, 1]

Translation and Rotation data:
Frame X-Coord    Y-Coord    Z-Coord(altitude)  Pitch          Roll            Yaw
  1   353141.23  482097.85  38.678           0.042652439    1.172694124     16.72142499
  2   353141.82  482099.69  38.684           0.097542931    1.143224387     16.79931141

Note: GPS data uses cartesian coordinate system (X,Y,Z Coordinates) is in meter units based on British National Grid GPS system.

Чтобы получить матрицу вращения, я использовал https://stackoverflow.com/a/56666686/16432598, основанный на http://www.tobias-weis.de/triangulate-3d-points-from-3d-imagepoints-from-a-moving-camera/. Используя приведенные выше данные, я рассчитываю внешние параметры и матрицы проекций следующим образом.

Rt0 = [-0.5284449976982357,  0.308213375891041,  -0.7910438668806931, 353141.21875;
       -0.8478960766271159,  -0.2384055118949635, 0.4735346398506075, 482097.84375;
       -0.04263950806535898, 0.9209600028339713,  0.3873171123665929, 38.67800140380859]

Rt1 = [-0.4590975294881605, 0.3270290779984009, -0.8260032933114635, 353141.8125;
       -0.8830316937622665, -0.2699087096524321, 0.3839326975722462, 482099.6875;
       -0.097388326965866,  0.905649640091175,   0.4126914624432091, 38.68399810791016]

P = K * Rt;

P1 = [-2540.030877954028,   2573.365272473235,  -3252.513377560185, 1662739447.059914;
      -4037.427278644764,   -155.5442017945203, 2636.538291686695,  2270188044.171295;
      -0.04263950806535898, 0.9209600028339713, 0.3873171123665929, 38.67800140380859]

P2 = [-2280.235105924588, 2643.299156802081, -3386.193495224041, 1662742249.915956;
      -4260.36781710715, -319.9665173096691, 2241.257388910372,  2270196732.490808;
      -0.097388326965866, 0.905649640091175, 0.4126914624432091, 38.68399810791016]

triangulatePoints(Points2d, projection_matrices, out);

Теперь я выбираю одну и ту же точку на обоих изображениях для триангуляции p2d_1(205,806) and p2d_2(116,813) Для трехмерного положения этой конкретной точки я ожидаю что-то вроде; [353143.7, 482130.3, 40.80] тогда как я вычисляю [549845.5109014747, -417294.6070425579, -201805.410744677]

Я знаю, что мои внутренние параметры и данные GPS очень точны.

Может ли кто-нибудь сказать мне, чего не хватает или что я делаю неправильно здесь?

Спасибо


person morodozan    schedule 13.07.2021    source источник
comment
Добро пожаловать в Stackoverflow! Я не уверен на 100%, но это может быть проблема с устройством. Я предполагаю, что матрица вашей камеры состоит из значений пикселей, а ваши 3d-точки - в метрах. Таким образом, вы умножаете разные единицы. Вы можете преобразовать оба значения, например. до мм. Для камеры вам нужно знать размер пикселя в мм.   -  person Grillteller    schedule 13.07.2021
comment
Спасибо большое! Что я сделал, так это полностью удалил вращение, как будто его нет. Затем я начал видеть значения, более близкие к истинным основаниям (ex: [658137.39, 482097.85, 60.69], где истинное значение [658145.33 482135.75 40.42]). Использование мм для матрицы камеры, как вы предложили, значительно улучшило результат. Теперь я вычисляю [658142.71, 482101.83 38.74]. Я предполагаю, что мой следующий шаг — включить вращения в вычисления и правильно преобразовать эйлерову матрицу в матрицу вращения euler2Rotation. Приветствуются любые предложения по части вращения.   -  person morodozan    schedule 14.07.2021