import argparse import imagesize import numpy as np import os base_path = "data/megadepth" # Remove the trailing / if need be. if base_path[-1] in ['/', '\\']: base_path = base_path[: - 1] base_depth_path = os.path.join( base_path, 'phoenix/S6/zl548/MegaDepth_v1' ) base_undistorted_sfm_path = os.path.join( base_path, 'Undistorted_SfM' ) scene_ids = os.listdir(base_undistorted_sfm_path) for scene_id in scene_ids: if os.path.exists(f"{base_path}/prep_scene_info/detections/detections_{scene_id}.npy"): print(f"skipping {scene_id} as it exists") continue undistorted_sparse_path = os.path.join( base_undistorted_sfm_path, scene_id, 'sparse-txt' ) if not os.path.exists(undistorted_sparse_path): print("sparse path doesnt exist") continue depths_path = os.path.join( base_depth_path, scene_id, 'dense0', 'depths' ) if not os.path.exists(depths_path): print("depths doesnt exist") continue images_path = os.path.join( base_undistorted_sfm_path, scene_id, 'images' ) if not os.path.exists(images_path): print("images path doesnt exist") continue # Process cameras.txt if not os.path.exists(os.path.join(undistorted_sparse_path, 'cameras.txt')): print("no cameras") continue with open(os.path.join(undistorted_sparse_path, 'cameras.txt'), 'r') as f: raw = f.readlines()[3 :] # skip the header camera_intrinsics = {} for camera in raw: camera = camera.split(' ') camera_intrinsics[int(camera[0])] = [float(elem) for elem in camera[2 :]] # Process points3D.txt with open(os.path.join(undistorted_sparse_path, 'points3D.txt'), 'r') as f: raw = f.readlines()[3 :] # skip the header points3D = {} for point3D in raw: point3D = point3D.split(' ') points3D[int(point3D[0])] = np.array([ float(point3D[1]), float(point3D[2]), float(point3D[3]) ]) # Process images.txt with open(os.path.join(undistorted_sparse_path, 'images.txt'), 'r') as f: raw = f.readlines()[4 :] # skip the header image_id_to_idx = {} image_names = [] raw_pose = [] camera = [] points3D_id_to_2D = [] n_points3D = [] id_to_detections = {} for idx, (image, points) in enumerate(zip(raw[:: 2], raw[1 :: 2])): image = image.split(' ') points = points.split(' ') image_id_to_idx[int(image[0])] = idx image_name = image[-1].strip('\n') image_names.append(image_name) raw_pose.append([float(elem) for elem in image[1 : -2]]) camera.append(int(image[-2])) points_np = np.array(points).astype(np.float32).reshape(len(points)//3, 3) visible_points = points_np[points_np[:,2] != -1] id_to_detections[idx] = visible_points np.save(f"{base_path}/prep_scene_info/detections/detections_{scene_id}.npy", id_to_detections) print(f"{scene_id} done")