Преобразование мира в пиксели в PyrenderPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Преобразование мира в пиксели в Pyrender

Сообщение Anonymous »

Я пытаюсь преобразовать точку в трехмерном мире, визуализированном с помощью Pyrender, в пиксельные координаты. Преобразование мира в кадр камеры, кажется, работает, однако преобразование кадра камеры в пиксельный кадр неверно, и я не могу понять, что я делаю неправильно. Я ценю любые подсказки!
Цель состоит в том, чтобы получить пиксельные координаты uvw мировой точки UVW. В настоящее время я делаю следующее:
Создаю камеру:
Я создаю камеру из уже существующей внутренней матрицы (= K). Я делаю это в основном в целях отладки, чтобы быть уверенным, что K прав:

Код: Выделить всё

K = np.array([[415.69219382,   0.        , 320.        ],
[  0.        , 415.69219382, 240.        ],
[  0.        ,   0.        ,   1.        ]])
K = np.ascontiguousarray(K, dtype=np.float32)
p_cam = pyrender.camera.IntrinsicsCamera(fx = K[0][0], fy = [1][1], cx =[0][2],  cy = [1][2])

scene.add(p_cam, pose=cam_pose.get_transformation_matrix(x=6170., y=4210., z=60., yaw=20, pitch=0, roll=40)) # cam_pose is my own class
Создать матрицу преобразования
Я создаю матрицу преобразования с внешним поворотом.

Код: Выделить всё

def get_transformation_matrix(self, x, y, z, yaw, pitch, roll):
from scipy.spatial.transform import Rotation as R
'''
yaw = rotate around z axis
pitch = rotate around y axis
roll = rotate around x axis
'''
xyz = np.array([
[x],
[y],
[z]
])
rot = rot_matrix = R.from_euler('zyx', [yaw, pitch, roll], degrees=True).as_matrix()
last_row = np.array([[0,0,0,1]])
tf_m = np.concatenate((np.concatenate((rot,xyz), axis = 1), last_row), axis = 0)
return np.ascontiguousarray(tf_m, dtype=np.float32)
Рендеринг изображения
Используя созданную камеру, я визуализирую следующее изображение. Точка, которую я пытаюсь трансформировать, — это кончик крыши, координаты которого приблизительно равны 500 160. Я отметил его в 3D-сцене розовым цилиндром.
Изображение

Преобразование мира в пиксельный кадр

Код: Выделить всё

from icecream import ic
K = np.concatenate((K, [[0],[0],[0]]), axis = 1)
UVW1 = [[6184],[4245],[38],[1]] #the homogeneous coordinates of the pink cylinder in the world frame
world_to_camera = np.linalg.inv(cam_pose.transformation_matrix).astype('float32') @ UVW1
ic(world_to_camera)
camera_to_pixel = K @ world_to_camera
ic(camera_to_pixel/camera_to_pixel[2]) #Transforming the homogeneous coordinates back
Выход:

Код: Выделить всё

ic| world_to_camera: array([[ 17.48892188],
[  7.11796755],
[-39.35071968],
[  1.        ]])

ic| camera_to_pixel/camera_to_pixel[2]: array([[135.25094424],
[164.80738424],
[  1.        ]])
Результаты
Мне кажется, что поза world_to_camera может быть правильной (я могу ошибаться). Однако при преобразовании из кадра камеры в пиксельный кадр координата X (135) неверна (координата Y (164) все еще может иметь смысл).
Прикреплен скриншот 3D сцена. Желтый цилиндр+оси представляют камеру, а синяя точка представляет точку, которую я пытаюсь преобразовать (ранее — розовая на визуализированном изображении).
Изображение

Поэтому для меня единственным источником ошибки может быть внутренняя матрица, однако я определяю сам эту матрицу, поэтому не понимаю, как она может быть неправильной. Есть ли что-то, на что я не обращаю внимания?

Подробнее здесь: https://stackoverflow.com/questions/768 ... n-pyrender
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»