Цель состоит в том, чтобы получить пиксельные координаты 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