bef_effect_ai_face_detect.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. #ifndef _BEF_EFFECT_FACE_DETECT_AI_H_
  2. #define _BEF_EFFECT_FACE_DETECT_AI_H_
  3. #if defined(__ANDROID__) || defined(TARGET_OS_ANDROID)
  4. #if BEF_EFFECT_ANDROID_WITH_JNI
  5. #include<jni.h>
  6. #endif
  7. #endif
  8. #include "bef_effect_ai_public_define.h"
  9. //***************************** begin Create-Config *****************/
  10. // Config when creating handle
  11. #define BEF_DETECT_LARGE_MODEL 0x00100000 // 106模型初始化参数,更准, 现已废弃
  12. #define BEF_DETECT_SMALL_MODEL 0x00200000 // 106模型初始化参数,更快
  13. #define BEF_DETECT_FACE_240_DETECT_FASTMODE \
  14. 0x00300000 // 240模型初始化参数,更快
  15. //**************************** end of Create-Config *****************/
  16. //***************************** begin Mode-Config ******************/
  17. #define BEF_DETECT_MODE_VIDEO_SLOW 0x00010000 // 视频检测,能检测更小的人脸,初始化+预测参数
  18. #define BEF_DETECT_MODE_VIDEO 0x00020000 // 视频检测,初始化+预测参数
  19. #define BEF_DETECT_MODE_IMAGE 0x00040000 // 图片检测,初始化+预测参数
  20. #define BEF_DETECT_MODE_IMAGE_SLOW \
  21. 0x00080000 // 图片检测,人脸检测模型效果更好,能检测更小的人脸,初始化+预测参数
  22. //***************************** enf of Mode-Config *****************/
  23. //***************************** Begin Config-106 point and action **/
  24. // for 106 key points detect
  25. // NOTE 当前版本 张嘴、摇头、点头、挑眉默认都开启,设置相关的位不生效
  26. #define BEF_FACE_DETECT 0x00000001 // 检测106点
  27. // 人脸动作
  28. #define BEF_EYE_BLINK 0x00000002 // 眨眼
  29. #define BEF_MOUTH_AH 0x00000004 // 张嘴
  30. #define BEF_HEAD_YAW 0x00000008 // 摇头
  31. #define BEF_HEAD_PITCH 0x00000010 // 点头
  32. #define BEF_BROW_JUMP 0x00000020 // 挑眉
  33. #define BEF_MOUTH_POUT 0x00000040 // 嘟嘴
  34. #define BEF_DETECT_FULL 0x0000007F // 检测上面所有的特征,初始化+预测参数
  35. #define BEF_EYE_BLINK_LEFT \
  36. 0x00000080 // 左眼闭眼,只用于提取对应的action,动作检测依然是眨眼
  37. #define BEF_EYE_BLINK_RIGHT \
  38. 0x00000100 // 右眼闭眼,只用于提取对应的action,动作检测依然是眨眼
  39. #define BEF_INDIAN_HEAD_ROLL \
  40. 0x00000200 // 印度式摇头,只用于提取对应的action,动作检测依然是摇头
  41. //**************************** End Config-106 point and action *******/
  42. //******************************* Begin Config-280 point *************/
  43. // for 280 points
  44. // NOTE: 现在改了二级策略,眉毛、眼睛、嘴巴关键点会在一个模型中出
  45. #define TT_MOBILE_FACE_240_DETECT \
  46. 0x00000100 // 检测二级关键点: 眉毛, 眼睛, 嘴巴,初始化+预测参数
  47. #define AI_BROW_EXTRA_DETECT TT_MOBILE_FACE_240_DETECT // 眉毛 13*2个点
  48. #define AI_EYE_EXTRA_DETECT TT_MOBILE_FACE_240_DETECT // 眼睛 22*2个点
  49. #define AI_MOUTH_EXTRA_DETECT TT_MOBILE_FACE_240_DETECT // 嘴巴 64个点
  50. #define AI_MOUTH_MASK_DETECT 0x00000300 // 嘴巴 mask
  51. #define AI_TEETH_MASK_DETECT 0x00000300 // 牙齿 mask
  52. #define AI_FACE_MASK_DETECT 0x00000500 // 人脸 mask
  53. #define AI_IRIS_EXTRA_DETECT 0x00000800 // 虹膜 20*2个点
  54. #define TT_MOBILE_FACE_280_DETECT \
  55. 0x00000900 // 检测二级关键点: 眉毛, 眼睛, 嘴巴,虹膜,初始化+预测参数
  56. //******************************* End Config-280 point ***************/
  57. #define TT_MOBILE_FORCE_DETECT 0x00001000 // 强制这帧人脸检测,并显示结果
  58. //bef_effect_public_face_define
  59. #define BEF_MAX_FACE_NUM 10
  60. // 眼睛,眉毛,嘴唇详细检测结果, 280点结果
  61. typedef struct bef_ai_face_ext_info_t {
  62. int eye_count; // 检测到眼睛数量
  63. int eyebrow_count; // 检测到眉毛数量
  64. int lips_count; // 检测到嘴唇数量
  65. int iris_count; // 检测到虹膜数量
  66. bef_ai_fpoint eye_left[22]; // 左眼关键点
  67. bef_ai_fpoint eye_right[22]; // 右眼关键点
  68. bef_ai_fpoint eyebrow_left[13]; // 左眉毛关键点
  69. bef_ai_fpoint eyebrow_right[13]; // 右眉毛关键点
  70. bef_ai_fpoint lips[64]; // 嘴唇关键点
  71. bef_ai_fpoint left_iris[20]; // 左虹膜关键点
  72. bef_ai_fpoint right_iris[20]; // 右虹膜关键点
  73. } bef_ai_face_ext_info;
  74. // 供106点使用
  75. typedef struct bef_ai_face_106_st {
  76. bef_ai_rect rect; // 代表面部的矩形区域
  77. float score; // 置信度
  78. bef_ai_fpoint points_array[106]; // 人脸106关键点的数组
  79. float visibility_array[106]; // 对应点的能见度,点未被遮挡1.0, 被遮挡0.0
  80. float yaw; // 水平转角,真实度量的左负右正
  81. float pitch; // 俯仰角,真实度量的上负下正
  82. float roll; // 旋转角,真实度量的左负右正
  83. float eye_dist; // 两眼间距
  84. int ID; // faceID: 每个检测到的人脸拥有唯一的faceID.人脸跟踪丢失以后重新被检测到,会有一个新的faceID
  85. unsigned int action; // 动作, 定义在 bef_ai_effect_face_detect.h 里
  86. unsigned int tracking_cnt;
  87. } bef_ai_face_106, *p_bef_ai_face_106;
  88. // @brief 检测结果
  89. typedef struct bef_ai_face_info_st {
  90. bef_ai_face_106 base_infos[BEF_MAX_FACE_NUM]; // 检测到的人脸信息
  91. bef_ai_face_ext_info extra_infos[BEF_MAX_FACE_NUM]; // 眼睛,眉毛,嘴唇关键点等额外的信息
  92. int face_count; // 检测到的人脸数目
  93. } bef_ai_face_info, *p_bef_ai_face_info;
  94. // brief 算法格外参数设置
  95. typedef struct bef_ai_face_image_st {
  96. bef_ai_face_106 base_info; // 检测到的人脸信息
  97. bef_ai_face_ext_info extra_info; // 眼睛,眉毛,嘴唇关键点等额外的信息
  98. unsigned int texture_id; // 基于人脸位置的截图(已补充额头部分、已旋正)
  99. bef_ai_pixel_format pixel_format; // 截图格式,目前均为RGBA
  100. int image_width; // 截图像素宽度
  101. int image_height; // 截图像素高度
  102. int image_stride; // 截图行跨度
  103. } bef_ai_face_image_st, *p_bef_ai_face_image_st;
  104. #define BEF_MOUTH_MASK_WIDTH 256
  105. #define BEF_FACE_MASK_WIDTH BEF_MOUTH_MASK_WIDTH
  106. #define BEF_TEETH_MASK_WIDTH BEF_MOUTH_MASK_WIDTH
  107. typedef struct bef_ai_face_mask_base{
  108. int mask_size; // mask_size
  109. unsigned char mask[BEF_MOUTH_MASK_WIDTH * BEF_MOUTH_MASK_WIDTH]; // mask data
  110. float warp_mat[6]; // warp mat data ptr, size 2*3
  111. int id;
  112. }bef_ai_face_mask_base, *p_bef_ai_face_mask_base;
  113. // brief 唇部mask
  114. typedef struct bef_ai_mouth_mask_info{
  115. bef_ai_face_mask_base mouth_mask[BEF_MAX_FACE_NUM];
  116. int face_count;
  117. }bef_ai_mouth_mask_info, *p_bef_ai_mouth_mask_info;
  118. // brief 嘴内mask
  119. typedef struct bef_ai_teeth_mask_info{
  120. bef_ai_face_mask_base teeth_mask[BEF_MAX_FACE_NUM];
  121. int face_count;
  122. }bef_ai_teeth_mask_info, *p_bef_ai_teeth_mask_infos;
  123. // brief 面部mask
  124. typedef struct bef_ai_face_mask_info{
  125. bef_ai_face_mask_base face_mask[BEF_MAX_FACE_NUM];
  126. int face_count;
  127. }bef_ai_face_mask_info, *p_bef_ai_face_mask_info;
  128. // brief 每个脸的遮挡概率
  129. typedef struct bef_ai_face_occlusion_info_base {
  130. float prob;
  131. int id;
  132. } bef_ai_face_occlusion_info_base, *p_bef_ai_face_occlusion_info_base;
  133. // brief mask类型枚举
  134. typedef enum {
  135. BEF_FACE_DETECT_MOUTH_MASK = 1,
  136. BEF_FACE_DETECT_TEETH_MASK = 2,
  137. BEF_FACE_DETECT_FACE_MASK = 3,
  138. } bef_face_mask_type;
  139. /**
  140. * @brief 创建人脸检测的句柄
  141. * @param [in] config Config of face detect algorithm 人脸检测算法的配置
  142. * 图片模式: BEF_DETECT_SMALL_MODEL| BEF_DETECT_MODE_IMAGE | BEF_DETECT_FULL
  143. * 视频模式: BEF_DETECT_SMALL_MODEL| BEF_DETECT_MODE_VIDEO | BEF_DETECT_FULL
  144. * 图片稍慢模式: BEF_DETECT_SMALL_MODEL| BEF_DETECT_MODE_IMAGE_SLOW | BEF_DETECT_FULL
  145. *
  146. * @param [in] strModelPath 模型文件所在路径
  147. * @param [out] handle Created face detect handle
  148. * 创建的人脸检测句柄
  149. * @return If succeed return BEF_RESULT_SUC, other value please see bef_effect_ai_public_define.h
  150. * 成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
  151. */
  152. BEF_SDK_API bef_effect_result_t
  153. bef_effect_ai_face_detect_create(
  154. unsigned long long config,
  155. const char * strModelPath,
  156. bef_effect_handle_t *handle
  157. );
  158. /**
  159. * @brief 人脸检测
  160. * @param [in] handle Created face detect handle
  161. * 已创建的人脸检测句柄
  162. * @param [in] image Image base address
  163. * 输入图片的数据指针
  164. * @param [in] pixel_format Pixel format of input image
  165. * 输入图片的格式
  166. * @param [in] image_width Image width
  167. * 输入图像的宽度 (以像素为单位)
  168. * @param [in] image_height Image height
  169. * 输入图像的高度 (以像素为单位)
  170. * @param [in] image_stride Image stride in each row
  171. * 输入图像每一行的步长 (以像素为单位)
  172. * @param [in] orientation Image orientation
  173. * 输入图像的转向,具体请参考 bef_effect_ai_public_define.h 中的 bef_rotate_type
  174. * @param [in] detect_config Config of face detect, for example, BEF_FACE_DETECT | BEF_DETECT_EYEBALL | BEF_BROW_JUMP
  175. * 人脸检测相关的配置
  176. * @return If succeed return BEF_RESULT_SUC, other value please see bef_effect_ai_public_define.h
  177. * 成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
  178. */
  179. BEF_SDK_API bef_effect_result_t
  180. bef_effect_ai_face_detect(
  181. bef_effect_handle_t handle,
  182. const unsigned char *image,
  183. bef_ai_pixel_format pixel_format,
  184. int image_width,
  185. int image_height,
  186. int image_stride,
  187. bef_ai_rotate_type orientation,
  188. unsigned long long detect_config,
  189. bef_ai_face_info *p_face_info
  190. );
  191. typedef enum {
  192. // 设置每隔多少帧进行一次人脸检测(默认值有人脸时24, 无人脸时24/3=8), 值越大,
  193. // cpu占用率越低, 但检测出新人脸的时间越长.
  194. BEF_FACE_PARAM_FACE_DETECT_INTERVAL = 1, // default 24
  195. // 设置能检测到的最大人脸数目(默认值5),
  196. // 当跟踪到的人脸数大于该值时,不再进行新的检测. 该值越大, 但相应耗时越长.
  197. // 设置值不能大于 AI_MAX_FACE_NUM
  198. BEF_FACE_PARAM_MAX_FACE_NUM = 2, // default 5
  199. // 动态调整能够检测人脸的大小,视频模式强制是4,图片模式可以通过设置为8,检测更小的人脸,检测级别,越高代表能检测更小的人脸,取值范围:4~10
  200. BEF_FACE_PARAM_MIN_DETECT_LEVEL = 3,
  201. // base 关键点去抖参数,[1-30]
  202. BEF_FACE_PARAM_BASE_SMOOTH_LEVEL = 4,
  203. // extra 关键点去抖参数,[1-30]
  204. BEF_FACE_PARAM_EXTRA_SMOOTH_LEVEL = 5,
  205. // 嘴巴 mask 去抖动参数, [0-1], 默认0, 平滑效果更好,速度更慢
  206. BEF_FACE_PARAM_MASK_SMOOTH_TYPE = 6,
  207. } bef_face_detect_type;
  208. /**
  209. * @brief Set face detect parameter based on type 设置人脸检测的相关参数
  210. * @param [in] handle Created face detect handle
  211. * 已创建的人脸检测句柄
  212. * @param [in] type Face detect type that needs to be set, check bef_face_detect_type for the detailed
  213. * 需要设置的人体检测类型,可参考 bef_face_detect_type
  214. * @param [in] value Type value, check bef_face_detect_type for the detailed
  215. * 参数值, 具体请参数 bef_face_detect_type 枚举中的说明
  216. * @return If succeed return BEF_RESULT_SUC, other value please refer bef_effect_ai_public_define.h
  217. * 成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
  218. */
  219. BEF_SDK_API bef_effect_result_t
  220. bef_effect_ai_face_detect_setparam(
  221. bef_effect_handle_t handle,
  222. bef_face_detect_type type,
  223. float value
  224. );
  225. /*
  226. *@brief 初始化handle
  227. *@param [in] config 指定240模型的模型参数,创建240或者280
  228. *Config-240,TT_MOBILE_FACE_240_DETECT
  229. *Config-280,TT_MOBILE_FACE_280_DETECT
  230. *Config-240 快速模式, TT_MOBILE_FACE_240_DETECT | TT_MOBILE_FACE_240_DETECT_FASTMODE
  231. *Config-280 快速模式, TT_MOBILE_FACE_280_DETECT | TT_MOBILE_FACE_240_DETECT_FASTMODE
  232. *@param [in] param_path 模型的文件路径
  233. */
  234. BEF_SDK_API bef_effect_result_t
  235. bef_effect_ai_face_detect_add_extra_model(
  236. bef_effect_handle_t handle,
  237. unsigned long long config, // 配置config,创建240或者280
  238. // Config-240,TT_MOBILE_FACE_240_DETECT
  239. // Config-280,TT_MOBILE_FACE_280_DETECT
  240. // Config-240 快速模式, TT_MOBILE_FACE_240_DETECT | TT_MOBILE_FACE_240_DETECT_FASTMODE
  241. // Config-280 快速模式, TT_MOBILE_FACE_280_DETECT | TT_MOBILE_FACE_240_DETECT_FASTMODE
  242. const char *param_path
  243. );
  244. /**
  245. * @brief 获取不同类型的mask输出
  246. *
  247. */
  248. 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);
  249. /**
  250. * @param [in] handle Destroy the created face detect handle
  251. * 销毁创建的人脸检测句柄
  252. */
  253. BEF_SDK_API void
  254. bef_effect_ai_face_detect_destroy(
  255. bef_effect_handle_t handle
  256. );
  257. /**
  258. * @brief 人脸检测授权
  259. * @param [in] handle Created face detect handle
  260. * 已创建的人脸检测句柄
  261. * @param [in] license 授权文件字符串
  262. * @param [in] length 授权文件字符串长度
  263. * @return If succeed return BEF_RESULT_SUC, other value please refer bef_effect_ai_public_define.h
  264. * 成功返回 BEF_RESULT_SUC, 授权码非法返回 BEF_RESULT_INVALID_LICENSE ,其它失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
  265. */
  266. #if defined(__ANDROID__) || defined(TARGET_OS_ANDROID)
  267. #if BEF_EFFECT_ANDROID_WITH_JNI
  268. BEF_SDK_API bef_effect_result_t bef_effect_ai_face_check_license(JNIEnv *env, jobject context,
  269. bef_effect_handle_t handle,
  270. const char *licensePath);
  271. #else
  272. BEF_SDK_API bef_effect_result_t bef_effect_ai_face_check_license(bef_effect_handle_t handle,
  273. const char *licensePath);
  274. #endif
  275. #else
  276. #ifdef __APPLE__
  277. BEF_SDK_API bef_effect_result_t bef_effect_ai_face_check_license(bef_effect_handle_t handle, const char *licensePath);
  278. #endif
  279. #endif
  280. BEF_SDK_API bef_effect_result_t bef_effect_ai_face_check_online_license(bef_effect_handle_t handle, const char *licensePath);
  281. #endif // _BEF_EFFECT_FACE_DETECT_AI_H_