1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
"""
An example for running incremental SfM on a set of images with pycolmap interfaces.
"""
import shutil
import urllib.request
import zipfile
from pathlib import Path
import enlighten
import pycolmap
from pycolmap import logging
def incremental_mapping_with_pbar(database_path, image_path, sfm_path):
num_images = pycolmap.Database(database_path).num_images
with enlighten.Manager() as manager:
with manager.counter(
total=num_images, desc="Images registered:"
) as pbar:
pbar.update(0, force=True)
reconstructions = pycolmap.incremental_mapping(
database_path,
image_path,
sfm_path,
initial_image_pair_callback=lambda: pbar.update(2),
next_image_callback=lambda: pbar.update(1),
)
return reconstructions
def run():
output_path = Path("example/")
image_path = output_path / "Fountain/images"
database_path = output_path / "database.db"
sfm_path = output_path / "sfm"
output_path.mkdir(exist_ok=True)
# The log filename is postfixed with the execution timestamp.
logging.set_log_destination(logging.INFO, output_path / "INFO.log.")
data_url = "https://cvg-data.inf.ethz.ch/local-feature-evaluation-schoenberger2017/Strecha-Fountain.zip"
if not image_path.exists():
logging.info("Downloading the data.")
zip_path = output_path / "data.zip"
urllib.request.urlretrieve(data_url, zip_path)
with zipfile.ZipFile(zip_path, "r") as fid:
fid.extractall(output_path)
logging.info(f"Data extracted to {output_path}.")
if database_path.exists():
database_path.unlink()
pycolmap.set_random_seed(0)
pycolmap.extract_features(database_path, image_path)
pycolmap.match_exhaustive(database_path)
if sfm_path.exists():
shutil.rmtree(sfm_path)
sfm_path.mkdir(exist_ok=True)
recs = incremental_mapping_with_pbar(database_path, image_path, sfm_path)
# alternatively, use:
# import custom_incremental_mapping
# recs = custom_incremental_mapping.main(database_path, image_path, sfm_path)
for idx, rec in recs.items():
logging.info(f"#{idx} {rec.summary()}")
if __name__ == "__main__":
run()
|