()
| 237 | |
| 238 | |
| 239 | def main(): |
| 240 | parser = argparse.ArgumentParser( |
| 241 | description="Convert rotation averaging files to database format" |
| 242 | ) |
| 243 | parser.add_argument( |
| 244 | "--relpose_path", |
| 245 | type=Path, |
| 246 | required=True, |
| 247 | help="Path to relative poses file", |
| 248 | ) |
| 249 | parser.add_argument( |
| 250 | "--database_path", |
| 251 | type=Path, |
| 252 | required=True, |
| 253 | help="Path for output database", |
| 254 | ) |
| 255 | parser.add_argument( |
| 256 | "--gravity_path", |
| 257 | type=Path, |
| 258 | default=None, |
| 259 | help="Optional path to gravity priors file", |
| 260 | ) |
| 261 | args = parser.parse_args() |
| 262 | |
| 263 | if not args.relpose_path.exists(): |
| 264 | logging.error(f"Relative poses file not found: {args.relpose_path}") |
| 265 | return 1 |
| 266 | |
| 267 | logging.info(f"Reading relative poses from {args.relpose_path}") |
| 268 | relative_poses = read_relative_poses(args.relpose_path) |
| 269 | logging.info(f"Loaded {len(relative_poses)} relative poses") |
| 270 | |
| 271 | gravity_priors = None |
| 272 | if args.gravity_path is not None and args.gravity_path.exists(): |
| 273 | logging.info(f"Reading gravity priors from {args.gravity_path}") |
| 274 | gravity_priors = read_gravity_priors(args.gravity_path) |
| 275 | logging.info(f"Loaded {len(gravity_priors)} gravity priors") |
| 276 | |
| 277 | logging.info(f"Creating database at {args.database_path}") |
| 278 | image_name_to_id = create_database_from_relative_poses( |
| 279 | args.database_path, relative_poses, gravity_priors |
| 280 | ) |
| 281 | logging.info(f"Database created with {len(image_name_to_id)} images") |
| 282 | |
| 283 | logging.info( |
| 284 | f"Conversion complete. Use the database with:\n" |
| 285 | f" colmap rotation_averager --database_path {args.database_path} " |
| 286 | f"--output_path <output_path>" |
| 287 | ) |
| 288 | return 0 |
| 289 | |
| 290 | |
| 291 | if __name__ == "__main__": |
no test coverage detected