Skip to content

Instantly share code, notes, and snippets.

@mihaidusmanu
Created October 24, 2020 14:48
Show Gist options
  • Save mihaidusmanu/ac0e0c48be244aa304669d95587af1f8 to your computer and use it in GitHub Desktop.
Save mihaidusmanu/ac0e0c48be244aa304669d95587af1f8 to your computer and use it in GitHub Desktop.
COLMAP covisibility
def compute_reconstruction_statistics(reference_model_path):
# Images w. intrinsics and extrinsics.
with open(os.path.join(reference_model_path, 'cameras.txt'), 'r') as f:
raw_cameras = f.readlines()[3 :]
cameras = {}
for raw_line in raw_cameras:
split_line = raw_line.strip('\n').split(' ')
cameras[int(split_line[0])] = split_line[1 :]
with open(os.path.join(reference_model_path, 'images.txt'), 'r') as f:
raw_images = f.readlines()[4 :]
images = {}
poses = {}
intrinsics = {}
for raw_line in raw_images[:: 2]:
raw_line = raw_line.strip('\n').split(' ')
image_path = raw_line[-1]
image_name = image_path.split('/')[-1]
image_id = int(raw_line[0])
camera_id = int(raw_line[-2])
intrinsics[image_path] = cameras[camera_id]
images[image_path] = image_id
poses[image_path] = parse_raw_pose(raw_line[1 : -2])
# Covisibility matrix.
image_visible_points3D = {}
max_image_id = 0
with open(os.path.join(reference_model_path, 'images.txt')) as images_file:
lines = images_file.readlines()
lines = lines[4 :] # Skip the header.
raw_poses = [line.strip('\n').split(' ') for line in lines[:: 2]]
raw_points = [line.strip('\n').split(' ') for line in lines[1 :: 2]]
for raw_pose, raw_pts in zip(raw_poses, raw_points):
# image_id, qw, qx, qy, qz, tx, ty, tz, camera_id, name
# points2D[(x, y, point3D_id)]
image_id = int(raw_pose[0])
max_image_id = max(max_image_id, image_id)
point3D_ids = map(int, raw_pts[2 :: 3])
image_visible_points3D[image_id] = set()
for point3D_id in point3D_ids:
if point3D_id == -1:
continue
image_visible_points3D[image_id].add(point3D_id)
n_covisible_points = np.zeros([max_image_id + 1, max_image_id + 1])
# Fill upper triangle.
for image_id1 in image_visible_points3D.keys():
for image_id2 in image_visible_points3D.keys():
if image_id1 > image_id2:
continue
visible_points3D1 = image_visible_points3D[image_id1]
visible_points3D2 = image_visible_points3D[image_id2]
n_covisible_points[image_id1, image_id2] = len(visible_points3D1 & visible_points3D2)
# Mirror to lower triangle.
n_covisible_points[image_id2, image_id1] = n_covisible_points[image_id1, image_id2]
return images, intrinsics, poses, n_covisible_points
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment