from abc import ABC, abstractmethod import numpy as np from models.core import GPSPoint from models.processing import AlignmentResult class MetricRefinementBase(ABC): @abstractmethod async def refine_alignment( self, uav_image: np.ndarray, satellite_image: np.ndarray, initial_homography: np.ndarray, ) -> AlignmentResult: pass @abstractmethod async def compute_precise_gps( self, uav_center_pixel: tuple[float, float], homography: np.ndarray, tile_bounds: dict, ) -> GPSPoint: pass @abstractmethod async def estimate_reprojection_error( self, correspondences: np.ndarray, homography: np.ndarray, ) -> float: pass @abstractmethod async def filter_outliers( self, correspondences: np.ndarray, homography: np.ndarray, threshold: float = 3.0, ) -> np.ndarray: pass