|
#pragma once
|
|
|
|
#include <fsdk/IObject.h>
|
|
#include <fsdk/FSDKError.h>
|
|
#include <fsdk/Optional.h>
|
|
#include <fsdk/Types.h>
|
|
|
|
namespace fsdk {
|
|
|
|
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
|
DECLARE_SMARTPTR(IEyeEstimator);
|
|
#endif
|
|
|
|
/**
|
|
* @brief Eyes estimation output.
|
|
* @details These values are produced by IEyeEstimator object.
|
|
* */
|
|
struct EyesEstimation {
|
|
/**
|
|
* @brief Eyes attribute structure.
|
|
* */
|
|
struct EyeAttributes {
|
|
/**
|
|
* @brief Enumeration of possible eye states.
|
|
* */
|
|
enum class State : uint8_t {
|
|
Closed, //!< Eye is closed.
|
|
Open, //!< Eye is open.
|
|
Occluded //!< Eye is blocked by something not transparent, or landmark passed to estimator doesn't point to an eye.
|
|
};
|
|
|
|
static constexpr uint64_t irisLandmarksCount = 32; //!< Iris landmarks amount.
|
|
static constexpr uint64_t eyelidLandmarksCount = 6; //!< Eyelid landmarks amount.
|
|
|
|
/// @brief alias for @see Landmarks template structure with irisLandmarksCount as param.
|
|
using IrisLandmarks = Landmarks<irisLandmarksCount>;
|
|
|
|
/// @brief alias for @see Landmarks template structure with eyelidLandmarksCount as param
|
|
using EyelidLandmarks = Landmarks<eyelidLandmarksCount>;
|
|
|
|
State state; //!< State of an eye.
|
|
|
|
IrisLandmarks iris; //!< Iris landmarks.
|
|
EyelidLandmarks eyelid; //!< Eyelid landmarks
|
|
};
|
|
|
|
EyeAttributes leftEye; //!< Left eye attributes
|
|
EyeAttributes rightEye; //!< Right eye attributes
|
|
};
|
|
|
|
|
|
/**
|
|
* @brief EyeCropper is a helper structure for IEyeEstimator interface
|
|
* Methods of this structure crop an input warped image and returns rectangle coordinates of each eye
|
|
* */
|
|
struct FSDK_API EyeCropper {
|
|
struct EyesRects {
|
|
Rect leftEyeRect;
|
|
Rect rightEyeRect;
|
|
};
|
|
|
|
EyesRects
|
|
cropByLandmarks5(
|
|
const Image& warp,
|
|
const Landmarks5& landmarks5
|
|
);
|
|
|
|
EyeCropper::EyesRects
|
|
cropByLandmarks68(
|
|
const Image& warp,
|
|
const Landmarks68& landmarks68
|
|
);
|
|
};
|
|
|
|
|
|
/**
|
|
* @brief Eye estimator interface.
|
|
* @note This estimator is designed to work with a person face image; you should pass a warped face detection image.
|
|
* @see IWarper for details.
|
|
* Eye estimator detects:
|
|
* \li eyes state;
|
|
* \li landmarks describing iris.
|
|
* @see EyesEstimation for output details
|
|
* */
|
|
struct IEyeEstimator : IRefCounted {
|
|
/**
|
|
* @brief Estimate the attributes.
|
|
* @param [in] warp image with warped face.
|
|
* @param [in] eyeRects EyeCropper::EyesRects structure with valid rectangle coordinates of each eye.
|
|
* @param [out] eyesEstimation Estimation of both eyes.
|
|
* Iris and Eyelid output landmarks are in warpedImage coordinates.
|
|
* If you want them in source of warpedImage image coordinates, use IWarper::unwarp
|
|
* @see IWarper::unwarp.
|
|
* @return Result with error code.
|
|
* @see EyesEstimation, EyeCropper::EyesRects, Image, Result and FSDKError for details.
|
|
* @note warp format must be R8G8B8, @see Format.
|
|
* @note all spans should be based on user owned continuous collections.
|
|
* @note all spans should be equal size.
|
|
* */
|
|
virtual Result<FSDKError>
|
|
estimate(
|
|
const Image& warp,
|
|
const EyeCropper::EyesRects& eyeRects,
|
|
EyesEstimation& eyesEstimation) const noexcept = 0;
|
|
|
|
/**
|
|
* @brief Estimate the attributes of multiple warped images in a single estimate function call
|
|
* @param [in] warps span of images with warped faces.
|
|
* @param [in] eyeRects span of EyesRects structure of corresponding warped image with valid rectangle coordinates of each eye.
|
|
* @param [out] eyesEstimations span of EyesEstimation of corresponding warped images.
|
|
* Iris and Eyelid output landmarks are in warpedImage coordinates.
|
|
* If you want them in source of warpedImage image coordinates, use IWarper::unwarp
|
|
* @see IWarper::unwarp.
|
|
* @return Result with error code.
|
|
* @see Span, EyesEstimation, EyeCropper::EyesRects, Image, Result and FSDKError for details.
|
|
* @note warps format must be R8G8B8, @see Format.
|
|
* @note all spans should be based on user owned continuous collections.
|
|
* @note all spans should be equal size.
|
|
* */
|
|
virtual Result<FSDKError>
|
|
estimate(
|
|
Span<const Image> warps,
|
|
Span<const EyeCropper::EyesRects> eyeRects,
|
|
Span<EyesEstimation> eyesEstimations) const noexcept = 0;
|
|
|
|
/**
|
|
* @brief Validate input of multiple frames in a single function call.
|
|
* @param [in] warps span of images with warped faces.
|
|
* @param [in] eyeRects span of EyesRects structure of corresponding warped image with valid rectangle coordinates of each eye.
|
|
* @param [out] errors output span of errors for each image.
|
|
* @return Result with error code.
|
|
* @see Span, EyeCropper::EyesRects, Image, Result and FSDKError for details.
|
|
* @note warps format must be R8G8B8, @see Format.
|
|
* @note all spans should be based on user owned continuous collections.
|
|
* @note all spans should be equal size.
|
|
* */
|
|
virtual Result<FSDKError>
|
|
validate(
|
|
Span<const Image> warps,
|
|
Span<const EyeCropper::EyesRects> eyeRects,
|
|
Span<Result<FSDKError>> errors) const noexcept = 0;
|
|
};
|
|
|
|
} // namespace fsdk
|