Результаты solvePnP слишком сильно отличаются от ожидаемых (Python, OpenCV) - PullRequest
1 голос
/ 13 мая 2019

У меня есть машина с камерой, IMU и GPS на нем. Камера делает снимки во время движения. Картинки и GPS-координаты синхронизируются. Теперь я пытаюсь получить позу камеры на снимках (относительно imu), но solvePnP не заканчивается внешней калибровкой камеры, которая даже похожа на мои ожидаемые результаты.

Для получения дополнительной информации: я использую Python (3.6.8) с OpenCV 4.0.0.

следующие данные я знаю:

  1. У меня есть 8 маркеров и их точное положение в мировых координатах.
  2. У меня есть траектория движения imu в мировых координатах.
  3. У меня есть пиксельные координаты маркеров для нескольких изображений (6576 x 4384 px).
  4. У меня есть встроенная калибровка камеры.
In [4]: image_points
Out[4]:
array([[1911., 2115.],
       [2443., 2631.],
       [1427., 2570.],
       [1409., 2271.],
       [1396., 1912.],
       [1549., 1770.],
       [2247., 1787.],
       [2606., 1794.]], dtype=float32)

In [5]: world_points
Out[5]: 
array([[-1.5156984e+00, -1.3494657e+00,  0.0000000e+00],
       [-2.9987667e+00,  0.0000000e+00,  0.0000000e+00],
       [-9.3132257e-10,  0.0000000e+00,  0.0000000e+00],
       [ 0.0000000e+00, -8.5239327e-01,  0.0000000e+00],
       [-1.5532847e-02, -1.8538033e+00,  0.0000000e+00],
       [-5.0486135e-01, -2.2495930e+00,  0.0000000e+00],
       [-2.5055323e+00, -2.2484162e+00,  0.0000000e+00],
       [-3.4857810e+00, -2.2520051e+00,  0.0000000e+00]], dtype=float32)

In [6]: cameraMatrix
Out[6]: 
matrix([[ 2.81923164e+03, -1.36877792e+00,  3.26989822e+03],
        [ 0.00000000e+00,  2.81857995e+03,  2.24198230e+03],
        [ 0.00000000e+00,  0.00000000e+00,  1.00000000e+00]])

In [7]: distCoeffs
Out[7]: array([ 0.0278163 , -0.01819595, -0.01031101, -0.0023199 , -0.02813449])

В настоящее время мой процесс состоит из:

  1. Я конвертирую все мировые координаты в локальную маркерную координату система, так что координата z всех маркеров равна 0 (см. Out [4] в примере кода). Сначала я попробовал без этого шага, но я прочитал много уроков, и это Кажется, что калибровка как-то предполагает это, но я не уверен. Пожалуйста, поправьте меня, если я ошибаюсь.
  2. Я использую solvePnP, чтобы получить rvec и tvec.
  3. Я применяю cv2.Rogrigues(rvec), чтобы получить rotationMatrix
  4. Затем положение камеры в координатах маркера вычисляется как camPos = -np.matrix(rotationMatrix).T * np.matrix(tvec)

После этого я сравниваю расстояние между imu и предполагаемым положением камеры, и оно в итоге составляет около 1 м, но даже не всегда. Это результаты для 5 образцов изображений.

array([[0.65556006],
       [1.19668318],
       [1.37138227],
       [0.64020471],
       [0.55105675]])

Тем не менее, расстояние между imu и камерой должно быть примерно равно 2,4 м (измерено вручную) и не должно меняться вообще (поскольку оба они зафиксированы в верхней части автомобиля).

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

Аналогичный вопрос, но без ответов будет это .

...