image-matching-webui / hloc /pairs_from_exhaustive.py
Realcat
update: sfm
57c1094
raw
history blame
2.18 kB
import argparse
import collections.abc as collections
from pathlib import Path
from typing import List, Optional, Union
from . import logger
from .utils.io import list_h5_names
from .utils.parsers import parse_image_lists
def main(
output: Path,
image_list: Optional[Union[Path, List[str]]] = None,
features: Optional[Path] = None,
ref_list: Optional[Union[Path, List[str]]] = None,
ref_features: Optional[Path] = None,
):
if image_list is not None:
if isinstance(image_list, (str, Path)):
names_q = parse_image_lists(image_list)
elif isinstance(image_list, collections.Iterable):
names_q = list(image_list)
else:
raise ValueError(f"Unknown type for image list: {image_list}")
elif features is not None:
names_q = list_h5_names(features)
else:
raise ValueError("Provide either a list of images or a feature file.")
self_matching = False
if ref_list is not None:
if isinstance(ref_list, (str, Path)):
names_ref = parse_image_lists(ref_list)
elif isinstance(image_list, collections.Iterable):
names_ref = list(ref_list)
else:
raise ValueError(
f"Unknown type for reference image list: {ref_list}"
)
elif ref_features is not None:
names_ref = list_h5_names(ref_features)
else:
self_matching = True
names_ref = names_q
pairs = []
for i, n1 in enumerate(names_q):
for j, n2 in enumerate(names_ref):
if self_matching and j <= i:
continue
pairs.append((n1, n2))
logger.info(f"Found {len(pairs)} pairs.")
with open(output, "w") as f:
f.write("\n".join(" ".join([i, j]) for i, j in pairs))
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--output", required=True, type=Path)
parser.add_argument("--image_list", type=Path)
parser.add_argument("--features", type=Path)
parser.add_argument("--ref_list", type=Path)
parser.add_argument("--ref_features", type=Path)
args = parser.parse_args()
main(**args.__dict__)