mirror of
https://github.com/EyeTrackVR/EyeTrackVR.git
synced 2025-11-04 14:39:42 +08:00
117 lines
3.2 KiB
Python
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
|