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, 4 meses, 27 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, y tz 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