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 72 73
|
"""
An example for running incremental SfM on images with the pycolmap interface.
"""
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_pipeline
# recs = custom_incremental_pipeline.main(
# database_path, image_path, sfm_path
# )
for idx, rec in recs.items():
logging.info(f"#{idx} {rec.summary()}")
if __name__ == "__main__":
run()
|