|
#pragma once
|
|
|
|
#include <fsdk/IObject.h>
|
|
#include <fsdk/FSDKError.h>
|
|
#include <fsdk/Optional.h>
|
|
#include <fsdk/Types.h>
|
|
|
|
#include <cmath>
|
|
|
|
namespace fsdk {
|
|
|
|
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
|
DECLARE_SMARTPTR(IHeadPoseEstimator);
|
|
#endif
|
|
|
|
/**
|
|
* @brief Head pose estimation output.
|
|
* @details These values are produced by IHeadPoseEstimator object.
|
|
* Each angle is measured in degrees and in [-180, 180] range.
|
|
* */
|
|
struct HeadPoseEstimation {
|
|
float pitch; //!< Pitch angle estimation.
|
|
float yaw; //!< Yaw angle estimation.
|
|
float roll; //!< Roll angle estimation.
|
|
|
|
enum FrontalFaceType {
|
|
Non = 0, //!< Non-frontal face
|
|
Good, //!< Good for recognition; Doesn't descrease recall and looks fine.
|
|
ISO //!< GOST/ISO angles
|
|
};
|
|
|
|
/**
|
|
* @brief Returns type of face frontality
|
|
* */
|
|
inline FrontalFaceType getFrontalFaceType() const;
|
|
};
|
|
|
|
/**
|
|
* @brief Head pose angles estimator interface.
|
|
* @note This estimator is designed to work with 68 facial landmarks or with raw image data;
|
|
* @see IDetector for details.
|
|
* @details Estimated angles are:
|
|
* \li pitch;
|
|
* \li yaw;
|
|
* \li roll.
|
|
* @see HeadPoseEstimation structure for details about how exactly the estimations are reported.
|
|
* */
|
|
struct IHeadPoseEstimator : IRefCounted {
|
|
/**
|
|
* @brief Estimate the angles.
|
|
* @param [in] landmarks Landmarks68 structure.
|
|
* @param [out] out output estimation.
|
|
* @return Result with error code.
|
|
* @see Landmarks, HeadPoseEstimation, Result and FSDKError for details.
|
|
* */
|
|
virtual Result<FSDKError>
|
|
FSDK_DEPRECATED("HeadPoseEstimator is deprecated since v.5.0.1, use BestShotQualityEstimator instead")
|
|
estimate(
|
|
const Landmarks68 &landmarks,
|
|
HeadPoseEstimation& out) const noexcept = 0;
|
|
/**
|
|
* @brief Estimate the angles.
|
|
* @param [in] image source image.
|
|
* @param [in] detection detection coordinates in image space.
|
|
* @param [out] out output estimation.
|
|
* @return Result with error code.
|
|
* @see HeadPoseEstimation, Detection, Image, Result and FSDKError for details.
|
|
* @note image format must be R8G8B8, @see Format.
|
|
* */
|
|
virtual Result<FSDKError>
|
|
FSDK_DEPRECATED("HeadPoseEstimator is deprecated since v.5.0.1, use BestShotQualityEstimator instead")
|
|
estimate(
|
|
const Image& image,
|
|
const Detection& detection,
|
|
HeadPoseEstimation& out) const noexcept = 0;
|
|
|
|
/**
|
|
* @brief Estimate headpose angles of multiple frames in a single estimate function call.
|
|
* @param [in] images span of source images.
|
|
* @param [in] detections span of detection coordinates in corresponding source images space.
|
|
* @param [out] out estimations array of corresponding images.
|
|
* @return Result with error code.
|
|
* @see Span, HeadPoseEstimation, Detection, Image, Result and FSDKError for details.
|
|
* @note images 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>
|
|
FSDK_DEPRECATED("HeadPoseEstimator is deprecated since v.5.0.1, use BestShotQualityEstimator instead")
|
|
estimate(
|
|
Span<const Image> images,
|
|
Span<const Detection> detections,
|
|
Span<HeadPoseEstimation> out) const noexcept = 0;
|
|
|
|
/**
|
|
* @brief Validate input of multiple frames in a single function call.
|
|
* @param [in] images span of source images.
|
|
* @param [in] detections span of detection coordinates in corresponding source images space.
|
|
* @param [out] errors output span of errors for each image.
|
|
* @return Result with error code.
|
|
* @see Span, Detection, Image, Result and FSDKError for details.
|
|
* @note images 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>
|
|
FSDK_DEPRECATED("HeadPoseEstimator is deprecated since v.5.0.1, use BestShotQualityEstimator instead")
|
|
validate(
|
|
Span<const Image> images,
|
|
Span<const Detection> detections,
|
|
Span<Result<FSDKError>> errors) const noexcept = 0;
|
|
};
|
|
|
|
/*
|
|
Implementation details.
|
|
*/
|
|
HeadPoseEstimation::FrontalFaceType
|
|
HeadPoseEstimation::getFrontalFaceType() const {
|
|
if(std::abs(roll) <= 8 && std::abs(pitch) <= 5 && std::abs(yaw) <= 5)
|
|
return HeadPoseEstimation::ISO;
|
|
if(std::abs(roll) <= 30 && std::abs(pitch) <= 40 && std::abs(yaw) <= 40)
|
|
return HeadPoseEstimation::Good;
|
|
return HeadPoseEstimation::Non;
|
|
}
|
|
|
|
} // namespace fsdk
|