diff options
Diffstat (limited to 'include/ia_imaging/ia_face.h')
-rw-r--r-- | include/ia_imaging/ia_face.h | 483 |
1 files changed, 483 insertions, 0 deletions
diff --git a/include/ia_imaging/ia_face.h b/include/ia_imaging/ia_face.h new file mode 100644 index 0000000..30ee1db --- /dev/null +++ b/include/ia_imaging/ia_face.h @@ -0,0 +1,483 @@ +/* + * Copyright 2012-2017 Intel Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _IA_FACE_H_ +#define _IA_FACE_H_ + +/** @file ia_face.h + * This file declares structures and APIs of face related computer vision engines. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* ia_types.h contains generic data types such as coordinate, rectangle etc */ +#include "ia_types.h" + +/** @brief Representing eyes. + * This structure represents the eye position and the blink state. + */ +typedef struct { + ia_coordinate position; /**< Position of the eye. */ + int32_t blink_confidence; /**< Blink status in [0..100] range where 0 means wide open eye and 100 means fully closed eye. + negative integer means blink result is invalid (based on invalid ED position result) */ +} ia_eye; + +/** @brief Representing 3 dimensional point. + */ +typedef struct { + int32_t x; + int32_t y; + int32_t z; +} ia_face_3d_coordinate; + +/** @brief Representing the result of Head Post Tracker. + */ +typedef struct { + int32_t processing_state; /**< Processing state. 0 : Internal preparation stage where result values are not valid. 1 : Initialized state. 2 : tracking state */ + int32_t focal_length; /**< Focal length. */ + ia_face_3d_coordinate rotation; /**< Rotation (in degree) movement of the head around x, y, z axis */ + ia_face_3d_coordinate translation; /**< Translation movement of the head along x, y, z axis. */ + ia_face_3d_coordinate head_hexahedron[8]; /**< Each vertex position of hexahedron being tracked. */ + ia_face_3d_coordinate face_features[4]; /**< Face feature points (left eye, right eye, mouse left, mouse right) */ + ia_coordinate head_hexahedron_2d[8];/**< 2D projected points of head hexahedron. */ + ia_coordinate face_features_2d[4]; /**< 2D projected points of face feature points. */ +} ia_face_headpose; + +/** @brief Representing the face feature data for Face Recognition. + */ +typedef struct { + uint32_t id; /**< Unique id of the face feature data. */ + int32_t data_size; /**< Size of the face feature data in bytes. */ + int32_t person_id; /**< Unique id of the person associated with the face feature data. This MUST be positive. -1 means unknown person. */ + uint32_t time_stamp; /**< Time stamp when the face feature was generated. */ + int32_t condition; /**< Environmental information of the face. Currently not used. */ + int32_t checksum; /**< Checksum of the face feature data. */ + int32_t version; /**< Face recognizer version. */ + uint8_t *data; /**< Face feature data. */ +} ia_face_feature; + +/** @brief Representing faces. + * This structure represents all information of a face supported by this engine library. + */ +typedef struct { + ia_rectangle face_area; /**< Bounding box of the face in the coordination system where (0,0) indicates left-top position. */ + int32_t rip_angle; /**< RIP (rotation in plane) angle in degrees. */ + int32_t rop_angle; /**< ROP (rotation out of plane) angle in degrees. */ + int32_t tracking_id; /**< Tracking id of the face. */ + int32_t confidence; /**< Confidence in face detection result. */ + int32_t person_id; /**< Person id (typically positive number) of the face. Filled after face recognition. -1 if not recognized. */ + int32_t similarity; /**< Similarity value between this face and the face in the database which was recognized as the person. */ + int32_t best_ratio; /**< Indicates the ratio between the most similar face and the 2nd similar face. */ + int32_t face_condition; /**< Indicates the light condition of the face. Not used at this moment. */ + int32_t smile_state; /**< Smile state of the face. -1 : invalid info (based on invalid ED position result) + 0 : Non-smile, 1 : Smile, 2 : Start of the smile. Auxiliary variable for smile shutter. */ + int32_t smile_score; /**< Smile score in the range of [0..100] where 0 is non-smile state and 100 is full smile state. */ + ia_coordinate mouth; /**< Mid-point of the mouth. */ + ia_eye left_eye; /**< Left eye */ + ia_eye right_eye; /**< Right eye */ + int32_t eye_validity; /**< Indicates whether a face was processed to get eye positions */ + int32_t skin_type_dark_likelihood;/**< Likelihood of skin type being dark. Bright skin likelihood = 100 - dark_skin_type_likelihood */ + int32_t skin_type_validity; /**< Validity of the Skin Likelihood */ +} ia_face; + +/** @brief Face state data. + * This structure is used to hold inputs and outputs of functions and also works as a handle of the engine instance. + */ +typedef struct { + int32_t num_faces; /**< Number of faces in the recently processed input frame. */ + ia_face *faces; /**< Array of face information. */ +} ia_face_state; + +/** @brief Version of face engines + * Represents versions of each face engine. + */ +typedef struct { + ia_version detection_version; /**< the Face Detection version */ + ia_version recognition_version; /**< the Face Recognition version */ + ia_version smile_version; /**< the Smile Detection version */ + ia_version blink_version; /**< the Blink Detection version */ +} ia_face_version; + +/** @brief Parameters for face engine. + * Used by ia_face_set_parameters() and ia_face_get_parameters() to indicate runtime engine configuration. + */ +typedef struct { + int32_t max_num_faces; /**< Maximum number of detectable faces in one frame. Default is 32. */ + int32_t min_face_size; /**< Minimum size of face to detect. Default is 22. */ + int32_t rip_coverage; /**< RIP (rotation in plane) coverage. */ + int32_t rop_coverage; /**< ROP (rotation out of plane) coverage. */ + int32_t max_computable_pixels; /**< Not for general usage. */ + int32_t smile_sensitivity; /**< The smile sensitve level. Not for general usage. */ + int32_t smile_threshold; /**< The smile threshold. Not for general usage. */ +} ia_face_parameters; + +/** @brief Initialize face engines. + * + * @param env [IN] platform environment parameters. + * @return face state data that will be used to hold results of subsequent API calls. Also works as a handle of the engines. + * + * This function will instantiate and initialize all face engines. + */ +LIBEXPORT +ia_face_state * +ia_face_init(const ia_env *env); + +/** @brief Destroy face engines. + * + * @param fs [IN] face state data associated with the engine which was created by ia_face_init(). + * + * This funciton destroys face engines and deallocate all internal memory including ia_face_state struct itself. + */ +LIBEXPORT +void +ia_face_uninit(ia_face_state *fs); + +/** @brief Re-initialize existing face engines. + * + * @param fs [IN] face state data associated with the engine which was created by ia_face_init(). + * + * This function initializes all face engines. After this call, all internal state will be initialized to the same state as ia_face_init() is called. + */ +LIBEXPORT +void +ia_face_reinit(ia_face_state *fs); + + +/** @brief Reset all the contexts and results in the existing face engines. + * + * @param fs [IN] face state data associated with the engine which was created by ia_face_init(). + * + * This function reset all the detected/recognized contexts. Note that the FR database will not be initialized. + */ +LIBEXPORT +void +ia_face_clear_result(ia_face_state *fs); + +/** + * @brief Get current version of face engines. + * + * @return a struct that contains version information of each face engine. + */ +LIBEXPORT +ia_face_version +ia_face_get_versions(void); + +/** @brief Set face parameterss. + * + * @param fs [IN] face state data. + * @param params [IN] parameters for face engines. + * + * This function is used to configure face engines. Please see the description of ia_face_parameters structure for the detail. + */ +LIBEXPORT +ia_err +ia_face_set_parameters(ia_face_state *fs, const ia_face_parameters *params); + +/** @brief Get current face parameters. + * + * @param fs [IN] face state data. + * @param params [OUT] a buffer that will hold face parameters. + * + */ +LIBEXPORT +ia_err +ia_face_get_parameters(ia_face_state *fs, ia_face_parameters *params); + +/** @brief Set the debug message level. + */ +LIBEXPORT +void +ia_face_set_debug_level(ia_face_state *fs, int32_t level); + +/** @brief Set acceleration APIs + * + * @param fs [INOUT] face state data. This is required to initiate acceleration. + * @param acc_api [IN] a structure which contains acceleration APIs. If NULL, acceleration will be made disabled. + * + * Enable or disable acceleration on the ISP. If this function is not called, face engine will work without acceleration. + */ +LIBEXPORT +void +ia_face_set_acceleration(ia_face_state *fs, const ia_acceleration *acc_api); + +/** @brief Try to detect faces from the input frame, assuming that the frame comes from the camera viewfinder. + * + * @param fs [INOUT] face state data. Face detection result will be filled after the call. + * @param frame [IN] a frame where the engine will try to detect faces from. + * + * This function tries to find faces from the input image. This function also uses information from the previous frames, so + * it is common practice to use this function to detect faces from the camera viewfinder. + */ +LIBEXPORT +void +ia_face_detect(ia_face_state *fs, const ia_frame *frame); /* uses face tracking and results of previous frame */ + +/** @brief Try to detect faces from the input frame, assuming that the frame comes from a still image. + * + * @param fs [INOUT] face state data. Face detection result will be filled after the call. + * @param frame [IN] a frame where the engine will try to detect faces from. + * + * This function tries to find faces from the input image, typically a captured still image. + */ +LIBEXPORT +void +ia_face_detect_in_image(ia_face_state *fs, const ia_frame *frame); + +/** @brief Try to detect eye positions from the given input frame bounded by the face area. + * + * @param fs [INOUT] face state data. Eye detection result will be filled. + * @param frame [IN] a frame where the engine will try to detect eyes from. + * + * This function tries to find eye positions inside the face area of the input frame. + * Using face_area information in faces array in fs structure, this function will fill eye positions to left_eye and right_eye variable of corresponding structure. + * Therefore this function should be called only after face detection is performed. + */ +LIBEXPORT +void +ia_face_eye_detect(ia_face_state *fs, const ia_frame *frame); + +/** @brief Try to detect mouth position from the face area of the input frame. + * + * @param fs [INOUT] face state data. Mouth detection result will be filled. + * @param frame [IN] a frame where the engine will try to detect the mouth from. + * + * This function tries to find the center position of the mouth inside the face area of the input frame. + * Using face_area information in faces array in fs structure, this function will fill the mouth field of corresponding structure. + * As in case of eye detection, this function also should be called after face detection. + */ +LIBEXPORT +void +ia_face_mouth_detect(ia_face_state *fs, const ia_frame *frame); + +/** @brief Try to detect smile scores of each face in the input frame. + * + * @param fs [INOUT] face state data. Smile detection result will be filled into faces array. + * @param frame [IN] a frame where the faces are in. + * + * This function tries to find whether each face in the frame is smiling, and if yes, also tries to find how much. + * Face area and eye positions should be valid for calling this function to be meaningful. + */ +LIBEXPORT +void +ia_face_smile_detect(ia_face_state *fs, const ia_frame *frame); + +/** @brief Try to detect blink states of each face in the input frame. + * + * @param fs [INOUT] face state data. Blink detection result will be filled into faces array. + * @param frame [IN] a frame where the faces are in. + * + * This function tries to find whether each eye is closed or open as in the range of 0 to 100. + * Face area and eye positions should be valid for calling this function to be meaningful. + */ +LIBEXPORT +void +ia_face_blink_detect(ia_face_state *fs, const ia_frame *frame); + +/** @brief Try to recognize faces in the input frame. + * + * @param fs [INOUT] face state date. Recognition result will be filled into faces array. + * @param frame [IN] a frame that contains faces. + * + * For the face recognition to work properly, some preconditions should be met : + * - Face detection and eye detection results need to be valid. + * - Face recognition database (if exists) should be loaded by ia_face_set_feature_db() or ia_face_register_feature(). + * - Using ISP acceleration is recommended to get the better/faster results. + * + * This function is intended to be used on the camera preview frames, which means this function also uses temporal information + * to get better recognition result. For recognizing faces in still images, use ia_face_recognize_in_image(). + */ +LIBEXPORT +void +ia_face_recognize(ia_face_state *fs, const ia_frame *frame); + +/** @brief Try to recognize faces in the still image. + * + * @param fs [INOUT] face state data. Recognition result will be filled into faces array. + * @param frame [IN] a frame that contains faces. + * + * Works the same way as ia_face_recognize() except that this function should be used for still images. + */ +LIBEXPORT +void +ia_face_recognize_in_image(ia_face_state *fs, const ia_frame *frame); + +/** @brief Try to recognize a single face in the still image. + * + * @param fs [INOUT] face state data. Recognition result will be filled into faces array. + * @param frame [IN] a frame that contains a face. + * @param index_to_recognize [IN] index of the face to recognize. i.e. The face in fs->faces[index_to_recognize] will be processed. + * @param extracted_feature [OUT] face feature data generated inside the engine. Returned feature data ("data" field) is managed by the engine, so do not try to free it. + * + * This function will try to recognize the face at the specified index and return the result. Recognition result will be filled into the fs, and + * the face feature data is also returned via the structure so as the caller can store it into external database. + * + * As this function takes the face index to recognize, face detection must be done first. Calling eye detection is optional since it will be called internally + * if the result is not present in the fs structure. + */ +LIBEXPORT +int32_t +ia_face_recognize_single_in_image(ia_face_state *fs, const ia_frame *frame, int32_t index_to_recognize, ia_face_feature *extracted_feature); + +/** @brief Unregister (or delete) a face from the face recognition database. + * + * @param fs [IN] face state data. + * @param feature_id [IN] feature id of the face to unregister. This is returned value of ia_face_register_face(). + * + * Delete the face from the face recognition database. Unregistered faces will not be used for recognizing other faces any more. + */ +LIBEXPORT +ia_err +ia_face_feature_unregister(ia_face_state *fs, int32_t feature_id); + +/** @brief Set/modify person_id of registered face. + * + * @param fs [IN] face state data. + * @param feature_id [IN] feature id of the face to modify. This is returned value of ia_face_register_face(). + * @param person_id [IN] new person id + * + * This function modifies the person id of existing (already registered) face. + */ +LIBEXPORT +ia_err +ia_face_feature_set_person_id(ia_face_state *fs, int32_t feature_id, int32_t person_id); + +/** @brief Unregister (or delete) a person and all faces associated with the person. + * + * @param fs [IN] face state data. + * @param person_id [IN] person id to delete. + * + * This function thoroughly deletes a person and all faces registered with the person id from the face recognition database. + */ +LIBEXPORT +ia_err +ia_face_unregister_person(ia_face_state *fs, int32_t person_id); + +/** @brief Get the face recognition database in the memory as a byte stream. + * + * @param fs [IN] face state data. + * @param db_size [OUT] size of database bytestream in bytes. + * @param db_data [OUT] pointer to database bytestream. Memory is allocated inside this function. + * + * This function is typically used to store the face recognition database in the memory to the file system. + */ +LIBEXPORT +ia_err +ia_face_get_feature_db(ia_face_state *fs, int32_t *db_size, const uint8_t **db_data); + +/** @brief Set the given bytestream as the face recognition database. + * + * @param fs [IN] face state data. + * @param db_size [IN] size of the bytestream in bytes. + * @param db_data [IN] database bytestream. + * + * This function copies a bytestream to engine internal memory as the face recognition database. + * ia_face_register_feature() also can be used to copy one database entry into the memory. + */ +LIBEXPORT +ia_err +ia_face_set_feature_db(ia_face_state *fs, int32_t db_size, const uint8_t *db_data); + +/** @brief Register (store) the given face feature to the database in the memory. + * @deprecated + * + * @param fs [IN] face state data. + * @param new_feature [IN] feature data + * @param new_person_id [IN] person id associated with this face feature + * @param new_feature_id [IN] feature id associated with this face feature + * @param time_stamp [IN] timestamp of this face feature + * @param condition [IN] condition value + * @param checksum [IN] checksum value + * @param version [IN] version value + * @return feature id which is the same new_feature_id in case of success. Will be a negative value on error. + * + * This function copies one feature data to engine internal memory as the face recognition database. + * For bulk data, ia_face_set_feature_db() can be used. + * Users don't have to concern about meaning of parameters, but only need to pass each parameter as received + * from database manager (e.g. in case of Android, SQLite). + * + * This function is deprecated. Please use ia_face_register_face_feature() instead. + */ +LIBEXPORT +int32_t +ia_face_register_feature(ia_face_state* fs, const uint8_t *new_feature, int32_t new_person_id, + int32_t new_feature_id, int32_t time_stamp, int32_t condition, int32_t checksum, int32_t version); + +/** @brief Register (store) the given face feature to the database in the memory. + * + * @param fs [IN] face state data. + * @param feature_to_register [IN] face feature data to store. + * + * This function copies one feature data to internal face recognition database. + * Basically there are two use cases of this function : + * - At the engine initialization stage, use this function to copy face feature data from external database to internal database. + * - When a new photo is imported, use this function to register a newly detected/recognized face into database. + */ +LIBEXPORT +int32_t +ia_face_register_face_feature(ia_face_state *fs, const ia_face_feature *feature_to_register); + +/** @brief Detect/track headpose information from a face. + * @deprecated + * + * @param fs [IN] Face engine state data. + * @param headpose [OUT] Headpose information structure where output will be stored. Caller must manage the memory for this struct. + * @param frame [IN] Image frame with faces. + * @param tracking_id [IN] Tracking Id of the face as returned by ia_face_detect(). + * + * This function detects/tracks the head pose information of a face inside the input frame. Please refer to ia_face_headpose structure for the available information. + * Before calling this function, face detection information should be available and the tracking id of the face to track headpose needs to be passed as an argument. + * However please note that once a face is detected by ia_face_detect(), the face information (ia_face struct) will not be used for headpose tracking, meaning that + * users don't need to call another ia_face_detect() for headpose tracking. + * If returned headpose->processing_state is zero, it means headpose tracking has failed and user needs to start over by calling face detection first. + */ +LIBEXPORT +ia_err +ia_face_track_headpose(ia_face_state *fs, ia_face_headpose *headpose, const ia_frame *frame, int32_t tracking_id); + +/** @brief Apply face beautification filter on the image. + * + * @param fs [IN] Face engine state data. + * @param output [OUT] Output frame where processed image will be stored. Caller must manage the memory for this. + * @param input [IN] Input frame to process. + * @param strength [IN] Specify the strength of the filter. Values between 0 (bypass) and 9 (strongest) can be specified. + * + * This function applies face beautification filter on the input image. Depending on the implementation, this function may use face detection information + * in the fs structure, in which case face detection may be called internally if it hasn't been called. + * Output frame must be allocated and freed by the caller. + */ +LIBEXPORT +ia_err +ia_face_beautify(ia_face_state *fs, ia_frame *output, const ia_frame *input, int32_t strength); + +/** @brief Find skin type likelihood from the faces already found. + * + * @param fs [IN] Face engine state data. + * @param frame [IN] a frame where the faces are in. + * + * This function attempts to detect the skin type of the faces which are already found and stored in the handle, + * results the dark-skin likelihood back to the member 'skin_type_dark_likelihood' and 'skin_type_validity' in each ia_faces. + */ +LIBEXPORT +void +ia_face_detect_skin(ia_face_state *fs, const ia_frame *frame); + +#ifdef __cplusplus +} +#endif + +#endif /* _IA_FACE_H_ */ |