Convertir transformación local en transformación global
Estoy usando el siguiente código para recuperar los transformados locales de un mapa de profundidad.
def reconstruct3d(depth_map, camera_parameters):
transformation = np.identity(4)
image_width, image_height = 320, 240
inv_intr = np.linalg.inv(camera_parameters)
for v in range(0, image_height, 1):
for u in range(0, image_width, 1):
projected_point = np.array([u, v, 1])
image_point = np.matmul(inv_intr, projected_point)
x, y = (image_point[0] / image_point[2]), (image_point[1] / image_point[2])
depth = depth_map[v, u]
Z = depth
Y = Z * y
X = Z * x
transformed_point = np.matmul(transformation, np.array([X, Y, Z, 1]))
transformed_point = transformed_point / transformed_point[3]
Desafortunadamente, los obtenidos transformed_point
está en un sistema de coordenadas local. ¿Cómo puedo convertirlo en un sistema de coordenadas global siempre que conozca los parámetros de cámara (tanto los parámetros de cámara intrínsecos como los de cámara extrínseca)?
Pregunta hecha hace 3 años, 5 meses, 4 días - Por nasean
2 Respuestas:
-
Para convertir los puntos transformados de un sistema de coordenadas local a un sistema de coordenadas global, necesitas usar tanto los parámetros de cámara intrínsecos como los de cámara extrínsecos.
Aquí te muestro cómo podrías hacerlo:
- Multiplica el punto transformado por la matriz de parámetros de cámara extrínseca para llevarlo al sistema de coordenadas de la cámara.
- Multiplica el resultado por la inversa de la matriz de parámetros de cámara intrínseca para llevarlo al sistema de coordenadas del mundo.
Agrega estos pasos al final de tu función
reconstruct3d
:python
Definir la matriz de parámetros de cámara extrínseca
extrinsic_parameters = np.array([[cos(theta), -sin(theta), 0, tx], [sin(theta), cos(theta), 0, ty], [0, 0, 1, tz], [0, 0, 0, 1]])Multiplicar el punto transformado por la matriz de parámetros de cámara extrínseca
transformed_point_cam_coords = np.matmul(extrinsic_parameters, transformed_point)Multiplicar el resultado por la inversa de la matriz de parámetros de cámara intrínseca
global_transformed_point = np.matmul(np.linalg.inv(camera_parameters), transformed_point_cam_coords)Asegúrate de ajustar
theta
,tx
,ty
, ytz
con los valores correctos de la matriz de parámetros de cámara extrínseca. Una vez que hayas agregado estos pasos,global_transformed_point
contendrá las coordenadas del punto en el sistema de coordenadas global.Respondida el Dec 19, 2020 a las 23:21 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para convertir los puntos transformados del sistema de coordenadas local al sistema de coordenadas global, es necesario aplicar la transformación extrínseca de la cámara. La transformación extrínseca representa la posición y orientación de la cámara en el espacio global.
Una vez que tengas la transformación extrínseca (
extrinsic_transform
), puedes aplicarla a cada punto transformado local (transformed_point
) mediante la siguiente operación matricial:global_transformed_point = np.matmul(extrinsic_transform, transformed_point)
Esto transformará el punto del sistema de coordenadas local al sistema de coordenadas global.
Aquí tienes el código actualizado:
python def reconstruct3d(depth_map, camera_parameters): transformation = np.identity(4) image_width, image_height = 320, 240 inv_intr = np.linalg.inv(camera_parameters["intrinsic"]) extrinsic_transform = camera_parameters["extrinsic"] for v in range(0, image_height, 1): for u in range(0, image_width, 1): projected_point = np.array([u, v, 1]) image_point = np.matmul(inv_intr, projected_point) x, y = (image_point[0] / image_point[2]), (image_point[1] / image_point[2]) depth = depth_map[v, u] Z = depth Y = Z y X = Z x transformed_point = np.matmul(transformation, np.array([X, Y, Z, 1])) transformed_point = transformed_point / transformed_point[3] global_transformed_point = np.matmul(extrinsic_transform, transformed_point)
Ahora,
global_transformed_point
contendrá los puntos transformados en el sistema de coordenadas global.Respondida el Dec 19, 2020 a las 23:32 - por Gemini
Votos positivos: 0 | Votos negativos: 0