#pragma once #include "BestShotMobileDefs.h" #include #include namespace mobile { /** @brief Supported liveness methods enum * @note LivenessType::Offline supported in the Complete edition only! */ enum class LivenessType { None = 0, //!< No liveness check at all Online = 1, //!< Online liveness check. Liveness processing on the backend. Offline = 2, //!< Offline liveness check. Liveness processing on the device. Offline_OSL = 3 //!< Offline liveness check with OneShot Liveness. //!< Liveness processing on the device. }; /** @brief Current liveness state. */ enum class LivenessState { Alive, //!< Face was estimated as alive. Fake, //!< Face was estimated as not alive. None, //!< No liveness check at all. NotReady, //!< Liveness check not ready for now. Need more frames to handle. BadHeadPose, //!< Head angles bigger than thresholds. BadQuality, //!< Image quality is less than threshold. FaceNotFound, //!< Face was not found. FaceTooClose, //!< Face is too close to the camera. FaceCloseToBorder, //!< Face is too close to the frame border. FaceTooSmall, //!< Face is too small. TooManyFaces, //!< There are more than one face in the frame. Timeout, //!< Liveness timeout. CriticalError //!< Critical during liveness processing. }; /** @brief Current best shot state. */ enum class BestShotState { Ok, //!< Nice best shot. It can be used for the recognition BadQuality, //!< Quality is less than threshold. BadHeadPose, //!< Head angles bigger than thresholds. Error //!< Error during the best shot processing. }; struct BestShotInfo { //! State of this frame BestShotState state; //! Source image fsdk::Image image; //! Detection with face fsdk::Detection detection; //! Face landmarks fsdk::Landmarks5 landmarks; //! Estimation of the head position. //! This parameter could help to show notification to the user in case of bad angles. fsdk::HeadPoseEstimation headPoseEstimation; //! AGS estimation result. //! This parameter could help to show notification to the user in case of bad quality. float agsEstimation; //! Index of the frame tsdk::FrameId frameIndex; //! Index of the track tsdk::TrackId trackId; }; struct IBestShotMobileObserver { /** * @brief Bestshot notification. * @param bestShotInfo bestshot information, @see BestShotInfo. * @note If liveness check is not nedded (LivenessType::None), this callback * could be used to take a bestshot. */ BESTSHOT_MOBILE_API virtual void bestShot( const BestShotInfo& bestShotInfo) = 0; /** * @brief Liveness check notification. * @param state liveness state for the bestshot. @see LivenessState. * @param bestShotInfo bestshot information, @see BestShotInfo. * @note For the liveness type LivenessType::None this callback will not be called! */ BESTSHOT_MOBILE_API virtual void liveness( const LivenessState livenessState, const BestShotInfo& bestShotInfo) = 0; /** * @brief End of a track notification * @param trackId id of the track. @see tsdk::TrackId. */ BESTSHOT_MOBILE_API virtual void trackEnd( const tsdk::TrackId& trackId) = 0; }; /** @brief IBestShotMobile interface class. * @note This interface is not thread-safe! */ struct IBestShotMobile { virtual ~IBestShotMobile() = default; /** @brief Pushes a single frame to the buffer. * @note You should pass consequent frames for reasonble results * (thing video frames). * Calls face detector and tracker, then triggers the callback for * processed faces. * @param frame input frame image. Format must be R8G8B8. * @param frameId unique identifier for frames sequence. * @param data is any additional data that a developer wants to receive * in callbacks-realization. * Do not use the delete-operator. The garbage collector is implemented * inside for this param. * @return true if frame was appended to the queue for processing, * false otherwise - frame was skipped because of full queue. */ BESTSHOT_MOBILE_API virtual bool pushFrame( const fsdk::Image &frame, uint32_t frameId) = 0; /** @brief Sets a bestshot observer. * @param observer pointer to the observer object, @see IBestShotMobileObserver */ BESTSHOT_MOBILE_API virtual void setBestShotMobileObserver( IBestShotMobileObserver* observer) = 0; /** @brief Blocks current thread until all frames in this Stream will be handled * and all callbacks will be executed. * @note Stream could not be used after join. * @see setBestShotObserver, setVisualObserver, setDebugObserver and * setBestShotPredicate */ BESTSHOT_MOBILE_API virtual void join() = 0; /** @brief Returns current liveness type. * @see LivenessType for details. * return current liveness type. */ BESTSHOT_MOBILE_API virtual LivenessType getLivenessType() = 0; }; /** @brief Creates an IBesthoMobile object. * @param faceEngine faceEngine object. * @param trackEngine trackEngine object. * @param settings settings. * @return IBestShotMobile object if succeeded, nullptr if failed. */ IBestShotMobile* createBestShotMobile( fsdk::FaceEngineType* faceEngine, tsdk::ITrackEngine* trackEngine, fsdk::ISettingsProvider* settings ); /** @brief Creates an IBesthoMobile object. * @param faceEngine faceEngine object. * @param trackEngine trackEngine object. * @param configPath path to the configuration file bestshotmobile.conf. * @return IBestShotMobile object if succeeded, nullptr if failed. */ IBestShotMobile* createBestShotMobile( fsdk::FaceEngineType* faceEngine, tsdk::ITrackEngine* trackEngine, const char * configPath ); } // namespace mobile