|
/**
|
|
* @file IWarper.h
|
|
* @brief Image and landmarks warping
|
|
* @copyright VisionLabs LLC
|
|
* @date 04.10.2017
|
|
* */
|
|
|
|
#pragma once
|
|
|
|
#include "IDescriptor.h"
|
|
#include <fsdk/Types/Span.h>
|
|
|
|
#include <fsdk/vlc/future.h>
|
|
|
|
namespace fsdk {
|
|
struct EyesEstimation;
|
|
struct GazeEstimation;
|
|
}
|
|
|
|
namespace fsdk {
|
|
|
|
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
|
DECLARE_SMARTPTR(IWarper);
|
|
#endif
|
|
|
|
/**
|
|
* @brief Transformation data structure, used for warping.
|
|
* @details Use this structure to perform image and landmarks transformations.
|
|
* @note In no circumstances should you create OR edit this structure by yourself
|
|
* */
|
|
struct Transformation {
|
|
Vector2<float> centerP = {0, 0}; //From 0, scaled
|
|
float angleDeg = 0;
|
|
float scale = 0;
|
|
Vector2<int> detectionTopLeft = {0, 0}; //From 0, original size
|
|
|
|
bool isValid = false;
|
|
};
|
|
|
|
/**
|
|
* @brief Face detection area warper interface.
|
|
* @details Perform affine transformations on an image to properly align depicted face for descriptor extraction.
|
|
* */
|
|
struct IWarper : IRefCounted {
|
|
/**
|
|
* @brief Create transformation data struct.
|
|
* @param [in] detection detection coordinates in image space.
|
|
* @param [in] landmarks vector of landmarks to calculate warping angles.
|
|
* @return Transformation object.
|
|
* @see Transformation, Detection and Landmarks5 for details.
|
|
* */
|
|
virtual Transformation
|
|
createTransformation(
|
|
const Detection& detection,
|
|
const Landmarks5& landmarks) const noexcept = 0;
|
|
|
|
/**
|
|
* @brief Warp image.
|
|
* @param [in] image source image.
|
|
* @param [in] transformation transformation data.
|
|
* @param [out] transformedImage output transformed image.
|
|
* @return Result with error code.
|
|
* @see Transformation, Image, Result and FSDKError for details.
|
|
* @note image format must be R8G8B8, @see Format.
|
|
* */
|
|
virtual Result<FSDKError>
|
|
warp(
|
|
const Image& image,
|
|
const Transformation& transformation,
|
|
Image& transformedImage) const noexcept = 0;
|
|
|
|
/**
|
|
* @brief Warp faces on multiple images.
|
|
* @param [in] images span of source images.
|
|
* @param [in] transformations span of transformation structures.
|
|
* @param [in/out] transformedImages span of output warped images.
|
|
* @note: all input images must have the same memory residence.
|
|
* @note: Each entry index in transformations span corresponds to the same index in images span
|
|
* to make warps from(i.e. transformations[i] <--> images[i]), so if there are multiple warps on
|
|
* the same image then this image must be duplicated in images span in order for the first statement
|
|
* to hold true.
|
|
* @note: if images in transformedImages span has the same parameters as the standard
|
|
* warped image has then no memory will be allocated and output data will be just copied
|
|
* to the backing memory of the output images. New images will be allocated otherwise.
|
|
* @return Result with error code.
|
|
* @see Span, Transformation, 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>
|
|
warp(
|
|
Span<const Image> images,
|
|
Span<const Transformation> transformations,
|
|
Span<Image> transformedImages) const noexcept = 0;
|
|
|
|
/**
|
|
* @brief Warp landmarks of size 5.
|
|
* @param [in] landmarks landmarks array of size 5
|
|
* @param [in] transformation transformation data.
|
|
* @param [out] transformedLandmarks output transformed landmarks.
|
|
* If transformation is created with detection, it's in the coordinates of transformed warped image,
|
|
* otherwise in the coordinates of detection.
|
|
* @return Result with error code.
|
|
* @see Transformation, Landmarks5, Result and FSDKError for details.
|
|
* */
|
|
virtual Result<FSDKError>
|
|
warp(
|
|
const Landmarks5& landmarks,
|
|
const Transformation& transformation,
|
|
Landmarks5& transformedLandmarks) const noexcept = 0;
|
|
|
|
/**
|
|
* @brief Warp landmarks of size 68.
|
|
* @param [in] landmarks68 landmarks to warp.
|
|
* @param [in] transformation transformation data.
|
|
* @param [out] transformedLandmarks68 output transformed landmarks of size 68.
|
|
* If transformation is created with detection, it's in the coordinates of transformed warped image,
|
|
* otherwise in the coordinates of detection.
|
|
* @return Result with error code.
|
|
* @see Transformation, Landmarks68, Result and FSDKError for details.
|
|
* */
|
|
virtual Result<FSDKError>
|
|
warp(
|
|
const Landmarks68& landmarks68,
|
|
const Transformation& transformation,
|
|
Landmarks68& transformedLandmarks68) const noexcept = 0;
|
|
|
|
/**
|
|
* @brief Warp irisLandmarks in EyesEstimation struct for both eyes.
|
|
* @details Warps from warped image coord. space to source image coordinates space,
|
|
* the one that was used to create transformation.
|
|
* @param [in] eyesEstimationInWarpCoordinates EyesEstimation straight out of EyeEstimator.
|
|
* Should be create from warpedImage, that was created with the same transformation object as the one passed.
|
|
* @param [in] transformation transformation data.
|
|
* @param [out] eyesEstimation eyes estimation with iris landmarks warped to source image coordinates space.
|
|
* @return Result with error code.
|
|
* @see Transformation, EyesEstimation, Result and FSDKError for details.
|
|
* */
|
|
virtual Result<FSDKError>
|
|
unwarp(
|
|
const EyesEstimation& eyesEstimationInWarpCoordinates,
|
|
const Transformation& transformation,
|
|
EyesEstimation& eyesEstimation) const noexcept = 0;
|
|
|
|
/**
|
|
* @brief Warp landmarks of size 5 back to source image coordinates.
|
|
* @param [in] warpedLandmarks5 warped landmarks array of size 5.
|
|
* @param [in] transformation transformation data.
|
|
* @param [out] landmarks5 landmarks of size 5 warped back to source image coordinates.
|
|
* @return Result with error code.
|
|
* @see Transformation, Landmarks5, Result and FSDKError for details.
|
|
* */
|
|
virtual Result<FSDKError>
|
|
unwarp(
|
|
const Landmarks5& warpedLandmarks5,
|
|
const Transformation& transformation,
|
|
Landmarks5& landmarks5) const noexcept = 0;
|
|
|
|
/**
|
|
* @brief Warp landmarks of size 68 back to source image coordinates.
|
|
* @param [in] warpedLandmarks5 warped landmarks array of size 68.
|
|
* @param [in] transformation transformation data.
|
|
* @param [out] landmarks5 landmarks of size 68 warped back to source image coordinates.
|
|
* @return Result with error code.
|
|
* @see Transformation, Landmarks68, Result and FSDKError for details.
|
|
* */
|
|
virtual Result<FSDKError>
|
|
unwarp(
|
|
const Landmarks68& warpedLandmarks68,
|
|
const Transformation& transformation,
|
|
Landmarks68& landmarks68) const noexcept = 0;
|
|
|
|
virtual Result<FSDKError>
|
|
unwarp(
|
|
const GazeEstimation& warpedAngles,
|
|
const Transformation& transformation,
|
|
GazeEstimation& angles
|
|
) const noexcept = 0;
|
|
|
|
/**
|
|
* @brief Common aliases for IWarper asynchronous interface.
|
|
* */
|
|
using ImageBatch = std::vector<Image>;
|
|
using ImageBatchFuture = vlc::future<ImageBatch>;
|
|
|
|
/**
|
|
* @brief Asynchronously warp faces on multiple images.
|
|
* @param [in] images span of source images.
|
|
* @param [in] transformations span of transformation structures.
|
|
* @return Future result object with error code and warped image batch.
|
|
* @see Span, Transformation, 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.
|
|
* @note this method is experimental and interface may be changed in the future.
|
|
* @note this method is not marked as noexcept and may throw an exception.
|
|
* */
|
|
virtual ImageBatchFuture warpAsync(
|
|
Span<const Image> images,
|
|
Span<const Transformation> transformations) const = 0;
|
|
};
|
|
|
|
}
|