XingyiHe's picture
init commit
3040ac4
raw
history blame contribute delete
2.25 kB
from typing import Tuple
from pathlib import Path
import numpy as np
import cv2
import h5py
from .parsers import names_to_pair, names_to_pair_old
def read_image(path, grayscale=False):
if grayscale:
mode = cv2.IMREAD_GRAYSCALE
else:
mode = cv2.IMREAD_COLOR
image = cv2.imread(str(path), mode)
if image is None:
raise ValueError(f"Cannot read image {path}.")
if not grayscale and len(image.shape) == 3:
image = image[:, :, ::-1] # BGR to RGB
return image
def list_h5_names(path):
names = []
with h5py.File(str(path), "r", libver="latest") as fd:
def visit_fn(_, obj):
if isinstance(obj, h5py.Dataset):
names.append(obj.parent.name.strip("/"))
fd.visititems(visit_fn)
return list(set(names))
def get_keypoints(
path: Path, name: str, return_uncertainty: bool = False
) -> np.ndarray:
with h5py.File(str(path), "r", libver="latest") as hfile:
dset = hfile[name]["keypoints"]
p = dset.__array__()
uncertainty = dset.attrs.get("uncertainty")
if return_uncertainty:
return p, uncertainty
return p
def find_pair(hfile: h5py.File, name0: str, name1: str):
pair = names_to_pair(name0, name1)
if pair in hfile:
return pair, False
pair = names_to_pair(name1, name0)
if pair in hfile:
return pair, True
# older, less efficient format
pair = names_to_pair_old(name0, name1)
if pair in hfile:
return pair, False
pair = names_to_pair_old(name1, name0)
if pair in hfile:
return pair, True
raise ValueError(
f"Could not find pair {(name0, name1)}... "
"Maybe you matched with a different list of pairs? "
)
def get_matches(path: Path, name0: str, name1: str) -> Tuple[np.ndarray]:
with h5py.File(str(path), "r", libver="latest") as hfile:
pair, reverse = find_pair(hfile, name0, name1)
matches = hfile[pair]["matches0"].__array__()
scores = hfile[pair]["matching_scores0"].__array__()
idx = np.where(matches != -1)[0]
matches = np.stack([idx, matches[idx]], -1)
if reverse:
matches = np.flip(matches, -1)
scores = scores[idx]
return matches, scores