Skip to content
Snippets Groups Projects
Select Git revision
  • 48c68cea9d69056240527c8716551e3d452a8833
  • main default protected
2 results

combine_img.py

Blame
  • Forked from mhby1g21 / Dynamic-Backward-Attention-Transformer
    Source project has a limited visibility.
    combine_img.py 5.45 KiB
    import numpy as np
    import imageio
    import os
    from ui import get_res
    
    #makes sure value of x stays within the range of min and max value to prevent out of bound values accses for the image
    def clamp(x, min_val, max_val):
        return max(min_val, min(x, max_val))
    
    #clamps the floating point coordinates to nearest integer value, copies pixel value from the image to the nearest int coord
    def nearest_neighbour_interpolation(img, x, y):
        h, w, _ = img.shape
        x, y = clamp(int(x), 0, w-1), clamp(int(y), 0, h-1)
        return img[y, x]
    
    
    # def orientation_to_face(x, y, z):
    #     abs_x, abs_y, abs_z = abs(x), abs(y), abs(z)
    #     if abs_x >= abs_y and abs_x >= abs_z:
    #         if x > 0:
    #             return 'front', -y / abs_x, -z / abs_x
    #         else:
    #             return 'back', y / abs_x, -z / abs_x
    #     elif abs_y >= abs_x and abs_y >= abs_z:
    #         if y > 0:
    #             return 'right', -x / abs_y, -z / abs_y
    #         else:
    #             return 'left', x / abs_y, -z / abs_y
    #     else:
    #         if z > 0:
    #             return 'top', x / abs_z, y / abs_z
    #         else:
    #             return 'bottom', -x / abs_z, y / abs_z
    
    #maps the 3d coords for cube faces to 2d coords on that cube face
    #finds out which cube face corresponds to the current pixel for which the 3d coords are calculated and calcs the normalised 2d coords on that face
    def orientation_to_face(x, y, z):
        abs_x, abs_y, abs_z = abs(x), abs(y), abs(z)
        if abs_x >= abs_y and abs_x >= abs_z:
            if x > 0:
                return 'frontrgb', -y / abs_x, -z / abs_x
            else:
                return 'backrgb', y / abs_x, -z / abs_x
        elif abs_y >= abs_x and abs_y >= abs_z:
            if y > 0:
                return 'rightrgb', -x / abs_y, -z / abs_y
            else:
                return 'leftrgb', x / abs_y, -z / abs_y
        else:
            if z > 0:
                return 'toprgb', x / abs_z, y / abs_z
            else:
                return 'bottomrgb', -x / abs_z, y / abs_z
    
    #converts cube maps into omnidirectional image
    def cubemap_to_omnidirectional(cube_faces, out_width, out_height):
        omnidirectional = np.zeros((out_height, out_width, 3), dtype=np.uint8)
        
        #iterates through the pixels in o/p image, for each pixel calulates spherical coord used to map 2d pixel loc to 3d points on a sphere
        #which are then converted to 3d cartesian coord to find which face of cube map current pixel corresponds to
        for j in range(out_height):
            theta = j / out_height * np.pi
            for i in range(out_width):
                phi = i / out_width * 2 * np.pi
                x = np.sin(theta) * np.cos(phi)
                y = np.sin(theta) * np.sin(phi)
                z = np.cos(theta)
                
                face, xf, yf = orientation_to_face(x, y, z)
                face_img = cube_faces[face] #holds what cubeface and the 2d point the 3d cord maps onto
                face_size = face_img.shape[0]
                
                #converts 2d coords on cube face to pixel coords on 
                u = (xf + 1) * face_size / 2
                v = (yf + 1) * face_size / 2
                
                #get pixel value from the cubemap image and assign it to actual pixel in the omnidirectional image
                omnidirectional[j, i] = nearest_neighbour_interpolation(face_img, u, v)
        
        return omnidirectional
    
    # if __name__ == "__main__":
    #     # Load the cubemap images
    #     cube_faces_dir = input("Enter the directory containing the cubemap images: ").strip()
    #     faces = ["right", "left", "top", "bottom", "front", "back"]
    #     cube_faces = {}
        
    #     for face in faces:
    #         cube_faces[face] = imageio.imread(os.path.join(cube_faces_dir, f"{face}.jpg"))
    
    
    
    if __name__ == "__main__":
        # Load the cubemap images
        #cube_faces_dir = input("Enter the directory containing the cubemap images: ").strip()
        cube_faces_dir = "C:\Project\AVVR-Pipeline-Internship\material_recognition\Dynamic-Backward-Attention-Transformer\output\split_output"
    
        #faces = ["right", "left", "top", "bottom", "front", "back"]
        faces = ["rightrgb", "leftrgb", "toprgb", "bottomrgb", "frontrgb", "backrgb"]
        cube_faces = {}
        
        for face in faces:
            image_path = os.path.join(cube_faces_dir, f"{face}.png")
            image_data = imageio.imread(image_path)
            
            #rotate top and bottom face by 90 deg
            # if face in ["top", "bottom"]:
            #     image_data = np.rot90(image_data, 1)
            
            # #flip the top, bottom, front and back faces in horizontal direction
            # if face not in ["left", "right"]:
            #     image_data = image_data[:, ::-1]
    
            if face in ["toprgb", "bottomrgb"]:
                image_data = np.rot90(image_data, 1)
            
            if face not in ["leftrgb", "rightrgb"]:
                image_data = image_data[:, ::-1]
            
            
            cube_faces[face] = image_data
    
        
        # output_width = int(input("Enter output omnidirectional width: "))
        # output_height = int(input("Enter output omnidirectional height: "))
        with open('path.txt', 'r') as file:
            input_path = file.readline()
            print(f'path = {input_path}')
        os.remove('path.txt')
        height, width = get_res(input_path)
        print(height, width)
        
        output_width = width
        output_height = height
    
        #print(f"height: {height}, width: {width}")
        omnidirectional_img = cubemap_to_omnidirectional(cube_faces, output_width, output_height)
        
        output_path = "C:\Project\AVVR-Pipeline-Internship\edgenet360\Data\Input\material.png"
        imageio.v2.imsave(output_path, omnidirectional_img)
        print(f"Omnidirectional image saved to {output_path}")