import sys from typing import List from pydantic import BaseModel import base64 import io import numpy as np from fastapi.exceptions import HTTPException from PIL import Image from pathlib import Path sys.path.append(str(Path(__file__).parents[1])) from hloc import logger class ImagesInput(BaseModel): data: List[str] = [] max_keypoints: List[int] = [] timestamps: List[str] = [] grayscale: bool = False image_hw: List[List[int]] = [[], []] feature_type: int = 0 rotates: List[float] = [] scales: List[float] = [] reference_points: List[List[float]] = [] binarize: bool = False def decode_base64_to_image(encoding): if encoding.startswith("data:image/"): encoding = encoding.split(";")[1].split(",")[1] try: image = Image.open(io.BytesIO(base64.b64decode(encoding))) return image except Exception as e: logger.warning(f"API cannot decode image: {e}") raise HTTPException( status_code=500, detail="Invalid encoded image" ) from e def to_base64_nparray(encoding: str) -> np.ndarray: return np.array(decode_base64_to_image(encoding)).astype("uint8")