Spaces:
Runtime error
Runtime error
| import argparse | |
| import subprocess | |
| from pathlib import Path | |
| import os | |
| import numpy as np | |
| from skimage.io import imread, imsave | |
| from transforms3d.quaternions import mat2quat | |
| from colmap.database import COLMAPDatabase | |
| from colmap.read_write_model import CAMERA_MODEL_NAMES | |
| import open3d as o3d | |
| # from ldm.base_utils import read_pickle | |
| K, _, _, _, POSES = read_pickle(f'meta_info/camera-16.pkl') | |
| H, W, NUM_IMAGES = 256, 256, 16 | |
| def extract_and_match_sift(colmap_path, database_path, image_dir): | |
| cmd = [ | |
| str(colmap_path), 'feature_extractor', | |
| '--database_path', str(database_path), | |
| '--image_path', str(image_dir), | |
| ] | |
| print(' '.join(cmd)) | |
| subprocess.run(cmd, check=True) | |
| cmd = [ | |
| str(colmap_path), 'exhaustive_matcher', | |
| '--database_path', str(database_path), | |
| ] | |
| print(' '.join(cmd)) | |
| subprocess.run(cmd, check=True) | |
| def run_triangulation(colmap_path, model_path, in_sparse_model, database_path, image_dir): | |
| print('Running the triangulation...') | |
| model_path.mkdir(exist_ok=True, parents=True) | |
| cmd = [ | |
| str(colmap_path), 'point_triangulator', | |
| '--database_path', str(database_path), | |
| '--image_path', str(image_dir), | |
| '--input_path', str(in_sparse_model), | |
| '--output_path', str(model_path), | |
| '--Mapper.ba_refine_focal_length', '0', | |
| '--Mapper.ba_refine_principal_point', '0', | |
| '--Mapper.ba_refine_extra_params', '0'] | |
| print(' '.join(cmd)) | |
| subprocess.run(cmd, check=True) | |
| def run_patch_match(colmap_path, sparse_model: Path, image_dir: Path, dense_model: Path): | |
| print('Running patch match...') | |
| assert sparse_model.exists() | |
| dense_model.mkdir(parents=True, exist_ok=True) | |
| cmd = [str(colmap_path), 'image_undistorter', '--input_path', str(sparse_model), '--image_path', str(image_dir), '--output_path', str(dense_model),] | |
| print(' '.join(cmd)) | |
| subprocess.run(cmd, check=True) | |
| cmd = [str(colmap_path), 'patch_match_stereo','--workspace_path', str(dense_model),] | |
| print(' '.join(cmd)) | |
| subprocess.run(cmd, check=True) | |
| def dump_images(in_image_dir, image_dir): | |
| for index in range(NUM_IMAGES): | |
| img = imread(f'{in_image_dir}/{index:03}.png') | |
| imsave(f'{str(image_dir)}/{index:03}.png', img) | |
| def build_db_known_poses_fixed(db_path, in_sparse_path): | |
| db = COLMAPDatabase.connect(db_path) | |
| db.create_tables() | |
| # insert intrinsics | |
| with open(f'{str(in_sparse_path)}/cameras.txt', 'w') as f: | |
| for index in range(NUM_IMAGES): | |
| fx, fy = K[0,0], K[1,1] | |
| cx, cy = K[0,2], K[1,2] | |
| model, width, height, params = CAMERA_MODEL_NAMES['PINHOLE'].model_id, W, H, np.array((fx, fy, cx, cy),np.float32) | |
| db.add_camera(model, width, height, params, prior_focal_length=(fx+fy)/2, camera_id=index+1) | |
| f.write(f'{index+1} PINHOLE {W} {H} {fx:.3f} {fy:.3f} {cx:.3f} {cy:.3f}\n') | |
| with open(f'{str(in_sparse_path)}/images.txt','w') as f: | |
| for index in range(NUM_IMAGES): | |
| pose = POSES[index] | |
| q = mat2quat(pose[:,:3]) | |
| t = pose[:,3] | |
| img_id = db.add_image(f"{index:03}.png", camera_id=index+1, prior_q=q, prior_t=t) | |
| f.write(f'{img_id} {q[0]:.5f} {q[1]:.5f} {q[2]:.5f} {q[3]:.5f} {t[0]:.5f} {t[1]:.5f} {t[2]:.5f} {index+1} {index:03}.png\n\n') | |
| db.commit() | |
| db.close() | |
| with open(f'{in_sparse_path}/points3D.txt','w') as f: | |
| f.write('\n') | |
| def patch_match_with_known_poses(in_image_dir, project_dir, colmap_path='colmap'): | |
| Path(project_dir).mkdir(exist_ok=True, parents=True) | |
| if os.path.exists(f'{str(project_dir)}/dense/stereo/depth_maps'): return | |
| # output poses | |
| db_path = f'{str(project_dir)}/database.db' | |
| image_dir = Path(f'{str(project_dir)}/images') | |
| sparse_dir = Path(f'{str(project_dir)}/sparse') | |
| in_sparse_dir = Path(f'{str(project_dir)}/sparse_in') | |
| dense_dir = Path(f'{str(project_dir)}/dense') | |
| image_dir.mkdir(exist_ok=True,parents=True) | |
| sparse_dir.mkdir(exist_ok=True,parents=True) | |
| in_sparse_dir.mkdir(exist_ok=True,parents=True) | |
| dense_dir.mkdir(exist_ok=True,parents=True) | |
| dump_images(in_image_dir, image_dir) | |
| build_db_known_poses_fixed(db_path, in_sparse_dir) | |
| extract_and_match_sift(colmap_path, db_path, image_dir) | |
| run_triangulation(colmap_path,sparse_dir, in_sparse_dir, db_path, image_dir) | |
| run_patch_match(colmap_path, sparse_dir, image_dir, dense_dir) | |
| # fuse | |
| cmd = [str(colmap_path), 'stereo_fusion', | |
| '--workspace_path', f'{project_dir}/dense', | |
| '--workspace_format', 'COLMAP', | |
| '--input_type', 'geometric', | |
| '--output_path', f'{project_dir}/points.ply',] | |
| print(' '.join(cmd)) | |
| subprocess.run(cmd, check=True) | |
| def main(): | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument('--dir',type=str) | |
| parser.add_argument('--project',type=str) | |
| parser.add_argument('--name',type=str) | |
| parser.add_argument('--colmap',type=str, default='colmap') | |
| args = parser.parse_args() | |
| if not os.path.exists(f'{args.project}/points.ply'): | |
| patch_match_with_known_poses(args.dir, args.project, colmap_path=args.colmap) | |
| mesh = o3d.io.read_triangle_mesh(f'{args.project}/points.ply',) | |
| vn = len(mesh.vertices) | |
| with open('colmap-results.log', 'a') as f: | |
| f.write(f'{args.name}\t{vn}\n') | |
| if __name__=="__main__": | |
| main() |