EyeTrackVR/EyeTrackApp/pye3dcustom/eye_model/abstract.py
2022-07-12 12:30:31 -07:00

117 lines
3.2 KiB
Python

"""
(*)~---------------------------------------------------------------------------
Pupil - eye tracking platform
Copyright (C) 2012-2019 Pupil Labs
Distributed under the terms of the GNU
Lesser General Public License (LGPL v3.0).
See COPYING and COPYING.LESSER for license details.
---------------------------------------------------------------------------~(*)
"""
import abc
import typing as T
import numpy as np
from ..geometry.primitives import Circle
from ..observation import Observation, ObservationStorage
from ..camera import CameraModel
class SphereCenterEstimates(T.NamedTuple):
projected: np.ndarray
three_dim: np.ndarray
rms_residual: T.Optional[float] = None
class TwoSphereModelAbstract(abc.ABC):
@abc.abstractmethod
def __init__(
self,
camera: CameraModel,
storage_cls: T.Type[ObservationStorage] = None,
storage_kwargs: T.Dict = None,
):
raise NotImplementedError
@abc.abstractmethod
def add_observation(self, observation: Observation):
raise NotImplementedError
@property
@abc.abstractmethod
def n_observations(self) -> int:
raise NotImplementedError
@property
@abc.abstractmethod
def sphere_center(self) -> np.ndarray:
raise NotImplementedError
@property
@abc.abstractmethod
def corrected_sphere_center(self) -> np.ndarray:
raise NotImplementedError
@property
@abc.abstractmethod
def projected_sphere_center(self) -> np.ndarray:
raise NotImplementedError
@abc.abstractmethod
def set_sphere_center(self, new_sphere_center: np.ndarray):
raise NotImplementedError
@abc.abstractmethod
def estimate_sphere_center(
self,
from_2d: T.Optional[np.ndarray] = None,
prior_3d: T.Optional[np.ndarray] = None,
prior_strength: float = 0.0,
calculate_rms_residual: bool = False,
) -> SphereCenterEstimates:
raise NotImplementedError
@abc.abstractmethod
def estimate_sphere_center_2d(self) -> np.ndarray:
raise NotImplementedError
@abc.abstractmethod
def estimate_sphere_center_3d(
self,
sphere_center_2d: np.ndarray,
prior_3d: T.Optional[np.ndarray] = None,
prior_strength: float = 0.0,
calculate_rms_residual: bool = False,
) -> T.Tuple[np.array, T.Optional[float]]:
raise NotImplementedError
# GAZE PREDICTION
@abc.abstractmethod
def _extract_unproject_disambiguate(self, pupil_datum: T.Dict) -> Circle:
raise NotImplementedError
@abc.abstractmethod
def _disambiguate_circle_3d_pair(
self, circle_3d_pair: T.Tuple[Circle, Circle]
) -> Circle:
raise NotImplementedError
@abc.abstractmethod
def predict_pupil_circle(
self, observation: Observation, use_unprojection: bool = False
) -> Circle:
raise NotImplementedError
@abc.abstractmethod
def apply_refraction_correction(self, pupil_circle: Circle) -> Circle:
raise NotImplementedError
@abc.abstractmethod
def mean_observation_circularity(self) -> float:
raise NotImplementedError
@abc.abstractmethod
def cleanup(self):
raise NotImplementedError