|
|
- #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(IQualityEstimator);
- #endif
-
- /**
- * @brief Quality estimation structure
- * Each estimation is given in normalized [0, 1] range. Parameter meanings:
- * \li \c light: image overlighting degree. 1 - ok, 0 - overlighted;
- * \li \c dark: image darkness degree. 1 - ok, 0 - too dark;
- * \li \c gray: image grayness degree 1 - ok, 0 - too gray;
- * \li \c blur: image blur degree. 1 - ok, 0 - too blured.
- * */
- struct Quality {
- float light;
- float dark;
- float gray;
- float blur;
- /**
- * @return complex estimation of quality (minimin of flor estimations). 0 - low quality, 1 - high quality.
- * */
- inline float getQuality() const noexcept;
- };
-
- /**
- * @brief Subjective Quality estimation structure
- * Each estimation is given in normalized [0, 1] range. Parameter meanings:
- * \li \c blur: image blur degree. 1 - ok, 0 - too blured.
- * \li \c light: image brightness degree. 1 - ok, 0 - too bright;
- * \li \c darkness: image darkness degree. 1 - ok, 0 - too dark;
- * \li \c illumination: image illumination uniformity degree. 1 - ok, 0 - is too illuminated;
- * \li \c specularity: image specularity degree. 1 - ok, 0 - is not specular;
- * \li \c isBlurred image is blurred flag;
- * \li \c isHighlighted image is overlighted flag;
- * \li \c isDark image image is too dark flag;
- * \li \c isIlluminated image is too illuminated flag;
- * \li \c isNotSpecular image is not specular flag;
- * */
- struct SubjectiveQuality {
- float blur;
- float light;
- float darkness;
- float illumination;
- float specularity;
- bool isBlurred;
- bool isHighlighted;
- bool isDark;
- bool isIlluminated;
- bool isNotSpecular;
- /**
- * @return if all boolean flags are false returns true - high quality, else false - low quality.
- * */
- inline bool isGood() const noexcept;
- };
-
- /**
- * @brief Image quality 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.
- * Quality estimator detects the same attributes as all the other estimators:
- * \li over/under exposure;
- * \li blurriness;
- * \li natural/unnatural colors;
- * It is different in the sense that it computes all the estimations at once and returns the results merged somehow
- * into a single value instead of several separate values. This way one can obtain a single scalar quality metric of
- * a person face image. The estimated value is a probability that the image is good for both recognition and viewing
- * purposes.
- * */
- struct IQualityEstimator : IRefCounted {
- /**
- * @brief Estimate the quality.
- * @param [in] warp image with warped face.
- * @param [out] quality output structure with quality params. Complex quality estimation available by method getQuality.
- * @return Result with error code.
- * @see Quality, Image, Result and FSDKError for details.
- * @note warp format must be R8G8B8, @see Format.
- * */
- virtual Result<FSDKError>
- estimate(const Image& warp, Quality& quality) const noexcept = 0;
-
- /**
- * @brief Estimate the quality of multiple warped images in a single estimate function call
- * @param [in] warps span of images with warped faces.
- * @param [out] quality output quality span.
- * @return Result with error code.
- * @see Span, Quality, 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<Quality> quality) const noexcept = 0;
-
- /**
- * @brief Estimate the quality.
- * @param [in] warp image with warped face.
- * @param [out] quality output structure with subjective quality params.
- * @return Result with error code.
- * @see SubjectiveQuality, Image, Result and FSDKError for details.
- * @note warp format must be R8G8B8, @see Format.
- * */
- virtual Result<FSDKError> estimate(
- const Image& warp,
- SubjectiveQuality& quality) const noexcept = 0;
-
- /**
- * @brief Estimate the subjective quality of multiple warped images in a single estimate function call
- * @param [in] warps span of images with warped faces.
- * @param [out] quality output SubjectiveQuality span.
- * @return Result with error code.
- * @see Span, SubjectiveQuality, 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<SubjectiveQuality> quality) const noexcept = 0;
-
- /**
- * @brief Validate input of multiple frames in a single function call.
- * @param [in] warps span of images with warped faces.
- * @param [out] errors output span of errors for each image.
- * @return Result with error code.
- * @see Span, 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<Result<FSDKError>> errors) const noexcept = 0;
- };
-
- /*
- Implementation details.
- */
- float Quality::getQuality() const noexcept {
- float min1 = std::min(dark, light);
- float min2 = std::min(gray, blur);
- return std::min(min1, min2);
- }
-
- /*
- Implementation details.
- */
- bool SubjectiveQuality::isGood() const noexcept {
- if (!isBlurred && !isHighlighted && !isDark && !isIlluminated && !isNotSpecular)
- return true;
- return false;
- }
-
- } // namespace fsdk
|