| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- #ifndef _BEF_EFFECT_FACE_DETECT_AI_H_
- #define _BEF_EFFECT_FACE_DETECT_AI_H_
- #if defined(__ANDROID__) || defined(TARGET_OS_ANDROID)
- #if BEF_EFFECT_ANDROID_WITH_JNI
- #include<jni.h>
- #endif
- #endif
- #include "bef_effect_ai_public_define.h"
- //***************************** begin Create-Config *****************/
- // Config when creating handle
- #define BEF_DETECT_LARGE_MODEL 0x00100000 // 106模型初始化参数,更准, 现已废弃
- #define BEF_DETECT_SMALL_MODEL 0x00200000 // 106模型初始化参数,更快
- #define BEF_DETECT_FACE_240_DETECT_FASTMODE \
- 0x00300000 // 240模型初始化参数,更快
- //**************************** end of Create-Config *****************/
- //***************************** begin Mode-Config ******************/
- #define BEF_DETECT_MODE_VIDEO_SLOW 0x00010000 // 视频检测,能检测更小的人脸,初始化+预测参数
- #define BEF_DETECT_MODE_VIDEO 0x00020000 // 视频检测,初始化+预测参数
- #define BEF_DETECT_MODE_IMAGE 0x00040000 // 图片检测,初始化+预测参数
- #define BEF_DETECT_MODE_IMAGE_SLOW \
- 0x00080000 // 图片检测,人脸检测模型效果更好,能检测更小的人脸,初始化+预测参数
- //***************************** enf of Mode-Config *****************/
- //***************************** Begin Config-106 point and action **/
- // for 106 key points detect
- // NOTE 当前版本 张嘴、摇头、点头、挑眉默认都开启,设置相关的位不生效
- #define BEF_FACE_DETECT 0x00000001 // 检测106点
- // 人脸动作
- #define BEF_EYE_BLINK 0x00000002 // 眨眼
- #define BEF_MOUTH_AH 0x00000004 // 张嘴
- #define BEF_HEAD_YAW 0x00000008 // 摇头
- #define BEF_HEAD_PITCH 0x00000010 // 点头
- #define BEF_BROW_JUMP 0x00000020 // 挑眉
- #define BEF_MOUTH_POUT 0x00000040 // 嘟嘴
- #define BEF_DETECT_FULL 0x0000007F // 检测上面所有的特征,初始化+预测参数
- #define BEF_EYE_BLINK_LEFT \
- 0x00000080 // 左眼闭眼,只用于提取对应的action,动作检测依然是眨眼
- #define BEF_EYE_BLINK_RIGHT \
- 0x00000100 // 右眼闭眼,只用于提取对应的action,动作检测依然是眨眼
- #define BEF_INDIAN_HEAD_ROLL \
- 0x00000200 // 印度式摇头,只用于提取对应的action,动作检测依然是摇头
- //**************************** End Config-106 point and action *******/
- //******************************* Begin Config-280 point *************/
- // for 280 points
- // NOTE: 现在改了二级策略,眉毛、眼睛、嘴巴关键点会在一个模型中出
- #define TT_MOBILE_FACE_240_DETECT \
- 0x00000100 // 检测二级关键点: 眉毛, 眼睛, 嘴巴,初始化+预测参数
- #define AI_BROW_EXTRA_DETECT TT_MOBILE_FACE_240_DETECT // 眉毛 13*2个点
- #define AI_EYE_EXTRA_DETECT TT_MOBILE_FACE_240_DETECT // 眼睛 22*2个点
- #define AI_MOUTH_EXTRA_DETECT TT_MOBILE_FACE_240_DETECT // 嘴巴 64个点
- #define AI_MOUTH_MASK_DETECT 0x00000300 // 嘴巴 mask
- #define AI_TEETH_MASK_DETECT 0x00000300 // 牙齿 mask
- #define AI_FACE_MASK_DETECT 0x00000500 // 人脸 mask
- #define AI_IRIS_EXTRA_DETECT 0x00000800 // 虹膜 20*2个点
- #define TT_MOBILE_FACE_280_DETECT \
- 0x00000900 // 检测二级关键点: 眉毛, 眼睛, 嘴巴,虹膜,初始化+预测参数
- //******************************* End Config-280 point ***************/
- #define TT_MOBILE_FORCE_DETECT 0x00001000 // 强制这帧人脸检测,并显示结果
- //bef_effect_public_face_define
- #define BEF_MAX_FACE_NUM 10
- // 眼睛,眉毛,嘴唇详细检测结果, 280点结果
- typedef struct bef_ai_face_ext_info_t {
- int eye_count; // 检测到眼睛数量
- int eyebrow_count; // 检测到眉毛数量
- int lips_count; // 检测到嘴唇数量
- int iris_count; // 检测到虹膜数量
-
- bef_ai_fpoint eye_left[22]; // 左眼关键点
- bef_ai_fpoint eye_right[22]; // 右眼关键点
- bef_ai_fpoint eyebrow_left[13]; // 左眉毛关键点
- bef_ai_fpoint eyebrow_right[13]; // 右眉毛关键点
- bef_ai_fpoint lips[64]; // 嘴唇关键点
- bef_ai_fpoint left_iris[20]; // 左虹膜关键点
- bef_ai_fpoint right_iris[20]; // 右虹膜关键点
- } bef_ai_face_ext_info;
- // 供106点使用
- typedef struct bef_ai_face_106_st {
- bef_ai_rect rect; // 代表面部的矩形区域
- float score; // 置信度
- bef_ai_fpoint points_array[106]; // 人脸106关键点的数组
- float visibility_array[106]; // 对应点的能见度,点未被遮挡1.0, 被遮挡0.0
- float yaw; // 水平转角,真实度量的左负右正
- float pitch; // 俯仰角,真实度量的上负下正
- float roll; // 旋转角,真实度量的左负右正
- float eye_dist; // 两眼间距
- int ID; // faceID: 每个检测到的人脸拥有唯一的faceID.人脸跟踪丢失以后重新被检测到,会有一个新的faceID
- unsigned int action; // 动作, 定义在 bef_ai_effect_face_detect.h 里
- unsigned int tracking_cnt;
- } bef_ai_face_106, *p_bef_ai_face_106;
- // @brief 检测结果
- typedef struct bef_ai_face_info_st {
- bef_ai_face_106 base_infos[BEF_MAX_FACE_NUM]; // 检测到的人脸信息
- bef_ai_face_ext_info extra_infos[BEF_MAX_FACE_NUM]; // 眼睛,眉毛,嘴唇关键点等额外的信息
- int face_count; // 检测到的人脸数目
- } bef_ai_face_info, *p_bef_ai_face_info;
- // brief 算法格外参数设置
- typedef struct bef_ai_face_image_st {
- bef_ai_face_106 base_info; // 检测到的人脸信息
- bef_ai_face_ext_info extra_info; // 眼睛,眉毛,嘴唇关键点等额外的信息
- unsigned int texture_id; // 基于人脸位置的截图(已补充额头部分、已旋正)
- bef_ai_pixel_format pixel_format; // 截图格式,目前均为RGBA
- int image_width; // 截图像素宽度
- int image_height; // 截图像素高度
- int image_stride; // 截图行跨度
- } bef_ai_face_image_st, *p_bef_ai_face_image_st;
- #define BEF_MOUTH_MASK_WIDTH 256
- #define BEF_FACE_MASK_WIDTH BEF_MOUTH_MASK_WIDTH
- #define BEF_TEETH_MASK_WIDTH BEF_MOUTH_MASK_WIDTH
- typedef struct bef_ai_face_mask_base{
- int mask_size; // mask_size
- unsigned char mask[BEF_MOUTH_MASK_WIDTH * BEF_MOUTH_MASK_WIDTH]; // mask data
- float warp_mat[6]; // warp mat data ptr, size 2*3
- int id;
- }bef_ai_face_mask_base, *p_bef_ai_face_mask_base;
- // brief 唇部mask
- typedef struct bef_ai_mouth_mask_info{
- bef_ai_face_mask_base mouth_mask[BEF_MAX_FACE_NUM];
- int face_count;
- }bef_ai_mouth_mask_info, *p_bef_ai_mouth_mask_info;
- // brief 嘴内mask
- typedef struct bef_ai_teeth_mask_info{
- bef_ai_face_mask_base teeth_mask[BEF_MAX_FACE_NUM];
- int face_count;
- }bef_ai_teeth_mask_info, *p_bef_ai_teeth_mask_infos;
- // brief 面部mask
- typedef struct bef_ai_face_mask_info{
- bef_ai_face_mask_base face_mask[BEF_MAX_FACE_NUM];
- int face_count;
- }bef_ai_face_mask_info, *p_bef_ai_face_mask_info;
- // brief 每个脸的遮挡概率
- typedef struct bef_ai_face_occlusion_info_base {
- float prob;
- int id;
- } bef_ai_face_occlusion_info_base, *p_bef_ai_face_occlusion_info_base;
- // brief mask类型枚举
- typedef enum {
- BEF_FACE_DETECT_MOUTH_MASK = 1,
- BEF_FACE_DETECT_TEETH_MASK = 2,
- BEF_FACE_DETECT_FACE_MASK = 3,
- } bef_face_mask_type;
- /**
- * @brief 创建人脸检测的句柄
- * @param [in] config Config of face detect algorithm 人脸检测算法的配置
- * 图片模式: BEF_DETECT_SMALL_MODEL| BEF_DETECT_MODE_IMAGE | BEF_DETECT_FULL
- * 视频模式: BEF_DETECT_SMALL_MODEL| BEF_DETECT_MODE_VIDEO | BEF_DETECT_FULL
- * 图片稍慢模式: BEF_DETECT_SMALL_MODEL| BEF_DETECT_MODE_IMAGE_SLOW | BEF_DETECT_FULL
- *
- * @param [in] strModelPath 模型文件所在路径
- * @param [out] handle Created face detect handle
- * 创建的人脸检测句柄
- * @return If succeed return BEF_RESULT_SUC, other value please see bef_effect_ai_public_define.h
- * 成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
- */
- BEF_SDK_API bef_effect_result_t
- bef_effect_ai_face_detect_create(
- unsigned long long config,
- const char * strModelPath,
- bef_effect_handle_t *handle
- );
- /**
- * @brief 人脸检测
- * @param [in] handle Created face detect handle
- * 已创建的人脸检测句柄
- * @param [in] image Image base address
- * 输入图片的数据指针
- * @param [in] pixel_format Pixel format of input image
- * 输入图片的格式
- * @param [in] image_width Image width
- * 输入图像的宽度 (以像素为单位)
- * @param [in] image_height Image height
- * 输入图像的高度 (以像素为单位)
- * @param [in] image_stride Image stride in each row
- * 输入图像每一行的步长 (以像素为单位)
- * @param [in] orientation Image orientation
- * 输入图像的转向,具体请参考 bef_effect_ai_public_define.h 中的 bef_rotate_type
- * @param [in] detect_config Config of face detect, for example, BEF_FACE_DETECT | BEF_DETECT_EYEBALL | BEF_BROW_JUMP
- * 人脸检测相关的配置
- * @return If succeed return BEF_RESULT_SUC, other value please see bef_effect_ai_public_define.h
- * 成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
- */
- BEF_SDK_API bef_effect_result_t
- bef_effect_ai_face_detect(
- bef_effect_handle_t handle,
- const unsigned char *image,
- bef_ai_pixel_format pixel_format,
- int image_width,
- int image_height,
- int image_stride,
- bef_ai_rotate_type orientation,
- unsigned long long detect_config,
- bef_ai_face_info *p_face_info
- );
- typedef enum {
- // 设置每隔多少帧进行一次人脸检测(默认值有人脸时24, 无人脸时24/3=8), 值越大,
- // cpu占用率越低, 但检测出新人脸的时间越长.
- BEF_FACE_PARAM_FACE_DETECT_INTERVAL = 1, // default 24
- // 设置能检测到的最大人脸数目(默认值5),
- // 当跟踪到的人脸数大于该值时,不再进行新的检测. 该值越大, 但相应耗时越长.
- // 设置值不能大于 AI_MAX_FACE_NUM
- BEF_FACE_PARAM_MAX_FACE_NUM = 2, // default 5
- // 动态调整能够检测人脸的大小,视频模式强制是4,图片模式可以通过设置为8,检测更小的人脸,检测级别,越高代表能检测更小的人脸,取值范围:4~10
- BEF_FACE_PARAM_MIN_DETECT_LEVEL = 3,
- // base 关键点去抖参数,[1-30]
- BEF_FACE_PARAM_BASE_SMOOTH_LEVEL = 4,
- // extra 关键点去抖参数,[1-30]
- BEF_FACE_PARAM_EXTRA_SMOOTH_LEVEL = 5,
- // 嘴巴 mask 去抖动参数, [0-1], 默认0, 平滑效果更好,速度更慢
- BEF_FACE_PARAM_MASK_SMOOTH_TYPE = 6,
- } bef_face_detect_type;
- /**
- * @brief Set face detect parameter based on type 设置人脸检测的相关参数
- * @param [in] handle Created face detect handle
- * 已创建的人脸检测句柄
- * @param [in] type Face detect type that needs to be set, check bef_face_detect_type for the detailed
- * 需要设置的人体检测类型,可参考 bef_face_detect_type
- * @param [in] value Type value, check bef_face_detect_type for the detailed
- * 参数值, 具体请参数 bef_face_detect_type 枚举中的说明
- * @return If succeed return BEF_RESULT_SUC, other value please refer bef_effect_ai_public_define.h
- * 成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
- */
- BEF_SDK_API bef_effect_result_t
- bef_effect_ai_face_detect_setparam(
- bef_effect_handle_t handle,
- bef_face_detect_type type,
- float value
- );
- /*
- *@brief 初始化handle
- *@param [in] config 指定240模型的模型参数,创建240或者280
- *Config-240,TT_MOBILE_FACE_240_DETECT
- *Config-280,TT_MOBILE_FACE_280_DETECT
- *Config-240 快速模式, TT_MOBILE_FACE_240_DETECT | TT_MOBILE_FACE_240_DETECT_FASTMODE
- *Config-280 快速模式, TT_MOBILE_FACE_280_DETECT | TT_MOBILE_FACE_240_DETECT_FASTMODE
- *@param [in] param_path 模型的文件路径
- */
- BEF_SDK_API bef_effect_result_t
- bef_effect_ai_face_detect_add_extra_model(
- bef_effect_handle_t handle,
- unsigned long long config, // 配置config,创建240或者280
- // Config-240,TT_MOBILE_FACE_240_DETECT
- // Config-280,TT_MOBILE_FACE_280_DETECT
- // Config-240 快速模式, TT_MOBILE_FACE_240_DETECT | TT_MOBILE_FACE_240_DETECT_FASTMODE
- // Config-280 快速模式, TT_MOBILE_FACE_280_DETECT | TT_MOBILE_FACE_240_DETECT_FASTMODE
- const char *param_path
- );
- /**
- * @brief 获取不同类型的mask输出
- *
- */
- BEF_SDK_API bef_effect_result_t bef_effect_ai_face_mask_detect(bef_effect_handle_t handle,unsigned long long config, bef_face_mask_type mask_type, void * result);
- /**
- * @param [in] handle Destroy the created face detect handle
- * 销毁创建的人脸检测句柄
- */
- BEF_SDK_API void
- bef_effect_ai_face_detect_destroy(
- bef_effect_handle_t handle
- );
- /**
- * @brief 人脸检测授权
- * @param [in] handle Created face detect handle
- * 已创建的人脸检测句柄
- * @param [in] license 授权文件字符串
- * @param [in] length 授权文件字符串长度
- * @return If succeed return BEF_RESULT_SUC, other value please refer bef_effect_ai_public_define.h
- * 成功返回 BEF_RESULT_SUC, 授权码非法返回 BEF_RESULT_INVALID_LICENSE ,其它失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
- */
- #if defined(__ANDROID__) || defined(TARGET_OS_ANDROID)
- #if BEF_EFFECT_ANDROID_WITH_JNI
- BEF_SDK_API bef_effect_result_t bef_effect_ai_face_check_license(JNIEnv *env, jobject context,
- bef_effect_handle_t handle,
- const char *licensePath);
- #else
- BEF_SDK_API bef_effect_result_t bef_effect_ai_face_check_license(bef_effect_handle_t handle,
- const char *licensePath);
- #endif
- #else
- #ifdef __APPLE__
- BEF_SDK_API bef_effect_result_t bef_effect_ai_face_check_license(bef_effect_handle_t handle, const char *licensePath);
- #endif
- #endif
- BEF_SDK_API bef_effect_result_t bef_effect_ai_face_check_online_license(bef_effect_handle_t handle, const char *licensePath);
- #endif // _BEF_EFFECT_FACE_DETECT_AI_H_
|