2D-пиксельные координаты в 3D-мировые координаты с использованием opencvsolvePnP

Я видел много подобных вопросов, но не именно этот.

Я знаю:

  • координаты пикселей (u,v) и глубина (d) - 4 балла
  • соответствующие мировые координаты (x,y,z) - 4 балла
  • внутренняя матрица K камеры (я еще не калибровал, но использовал камеру по умолчанию)
  • внешняя матрица [R|t] (я называю ее версию 4x4 M_ext)
  • преобразование из мировых координатных точек X (3D) в пиксельные координатные точки p (2D)

Я не знаю:

  • преобразование из пиксельных координатных точек p (2D) + глубина d в мировые координатные точки X (3D)

<сильный>0. Получить внешнюю матрицу:

Чтобы получить внешнюю матрицу, я использую функцию opencvssolvePnP:

ret, rvec, tvec = cv.solvePnP(world_points, img_points, K, np.float32([]), cv.SOLVEPNP_IPPE)

Я получаю внешнюю матрицу [R|t], используя приведенный выше вектор поворота и перемещения ( Rt = np.hstack((cv.Rodrigues(rvec)[0], tvec))).

Я хочу применить оба преобразования для проверки правильности моей внешней матрицы.

<сильный>1. Мировые координаты указывают на пиксельные координаты:

camera_coordinates = K * M_ext * world_coordinates 
u = camera_coordinates[0] / camera_coordinates[2]
v = camera_coordinates[1] / camera_coordinates[2]

Это преобразование работает, мои координаты пикселей u, v верны.

<сильный>2. Пиксельные координаты + глубина до мировых координат:

camera_coordinates = ( inv(K) * [u, v, 1] ) * d
world_coordinates = inv(M_ext) * [camera_coordinates, 1]

Это обратное преобразование не дает моих мировых координат. Кто-нибудь видит, где моя ошибка?


comment
Итак, вы ищете проецирование пикселей в 3D с известной глубиной, внутренними и внешними свойствами? Взгляните: title="извлечение 3D-координат с учетом карты глубины 2D-точек изображения и калибровки камеры"> stackoverflow.com/questions/31265245/ и связанного учебника Николаса Бурруса   -  person Micka    schedule 13.04.2021
comment
В уроке они также проецируют пиксель + глубину в координаты 3D-камеры так же, как я, но нет дополнительного преобразования из кадра камеры в другой кадр / нет внешней матрицы. Так что, к сожалению, это не помогает мне найти мою ошибку.   -  person meen    schedule 13.04.2021
comment
P3D' = R.P3D + T — преобразование из системы координат 3D-камеры в глобальную систему координат.   -  person Micka    schedule 13.04.2021
comment
Это то, что я делаю, поэтому я до сих пор не понимаю, почему это не работает. ВsolvePnP вектор вращения и перемещения переносит точки из системы координат модели в систему координат камеры, поэтому я применил инверсию, чтобы перейти от координат камеры к глобальным координатам.   -  person meen    schedule 13.04.2021
comment
хорошо, это недоразумение. Координаты модели обычно не совпадают с глобальной системой координат, если вы не зададите глобальную систему координат равной координатам модели. Вы видите модель во всех камерах одновременно?   -  person Micka    schedule 13.04.2021
comment
Система координат моей модели — это моя глобальная система координат (четыре точки на столе, видимые моей камерой). У меня есть только одна камера (глубина), и я хочу знать, как преобразовать точку пикселя + глубины в мою модель/глобальную систему координат.   -  person meen    schedule 14.04.2021