Я видел много подобных вопросов, но не именно этот.
Я знаю:
- координаты пикселей (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]
Это обратное преобразование не дает моих мировых координат. Кто-нибудь видит, где моя ошибка?