bef_effect_ai_facefitting.h 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #ifndef BEF_EFFECT_AI_FACEFITTING
  2. #define BEF_EFFECT_AI_FACEFITTING
  3. #if defined(__ANDROID__) || defined(TARGET_OS_ANDROID)
  4. #include <jni.h>
  5. #endif
  6. #include "bef_effect_ai_public_define.h"
  7. #define BEF_FITTING_MAX_FACE 6 //最大支持的人脸数
  8. typedef unsigned long long bef_ai_facefitting_handle;
  9. typedef enum {
  10. BEF_AI_FACEFITTING_Camera_Orthographic = 0,
  11. BEF_AI_FACEFITTING_Camera_Perspective = 1
  12. } bef_ai_facefitting_camera_type;
  13. typedef enum {
  14. BEF_AI_FACEFITTING_Solver_Lambda = 1, // Solver parameter
  15. BEF_AI_FACEFITTING_Solver_MaxIter = 2,
  16. BEF_AI_FACEFITTING_Solver_Eps = 3,
  17. BEF_AI_FACEFITTING_Solver_Ratio = 4,
  18. BEF_AI_FACEFITTING_Solver_Smooth = 5,
  19. BEF_AI_FACEFITTING_Solver_Camera_Type = 6,
  20. BEF_AI_FACEFITTING_Config_Cal_TB = 7,
  21. BEF_AI_FACEFITTING_Eyelash_Flag = 8,
  22. BEF_AI_FACEFITTING_Use_Semantic_Lmk = 9,
  23. BEF_AI_FACEFITTING_Mouth_BS_Limit = 10
  24. } bef_ai_facefitting_param_type;
  25. //manager memory by sdk, count与num的解释:count表示数组的长度,num表示数组具有多少元素, 例如 一个2d坐标点(x,y)数组 [x,y,x,y,x,y,x,y] ===> count = 8, num = 4
  26. typedef struct {
  27. int id; // 人脸sdk返回的id,用来表示这个mesh属于哪一个人脸
  28. float* vertex; // 3d模型的顶点, 由sdk管理内存分配与释放
  29. int vertex_count; // vertex数组的长度
  30. float* landmark; // 3d模型投影会图像坐标的landmark坐标值数组. 由sdk管理内存分配与释放
  31. int landmark_count; // landmark数组的长度
  32. float* param; // 解优化的参数,[scale,rotatex, rotatey, rotatez, tx, ty, alpha0, alpha1 ......], manager memory by sdk
  33. int param_count; // param数组的长度
  34. float mvp[16]; // 将vertex变为ndc坐标的矩阵
  35. float model[16]; // 包括了对原始模型的旋转平移缩放的模型矩阵 正交投影下使用
  36. float * normal; // 模型空间下的法线, 长度和vertex_count是一样的, 由sdk管理内存分配与释放
  37. float * tangent; // 模型空间下的切线, 长度和vertex_count是一样的, 由sdk管理内存分配与释放
  38. float * bitangent; // 模型空间下的副切线, 长度和vertex_count是一样的, 由sdk管理内存分配与释放
  39. float rvec[3]; // opencv solvepnp输出的旋转向量
  40. float tvec[3]; // opencv solvepnp输出的平移向量
  41. } bef_ai_facefitting_mesh_info;
  42. // pack landmark
  43. typedef struct {
  44. int id; // 人脸的id
  45. bef_ai_fpoint * landmark106; // 106点数组 required
  46. bool eye_lv2; // true 使用二级网络的眼睛 optional
  47. bool eyebrow_lv2; // true 使用二级网络的眉毛 optional
  48. bool lips_lv2; // true 使用二级网络的嘴巴 optional
  49. bool iris_lv2; // true 使用二级网络的iris optional
  50. bef_ai_fpoint * eye_left; // 左眼关键点 optional
  51. bef_ai_fpoint * eye_right; // 右眼关键点 optional
  52. bef_ai_fpoint * eyebrow_left; // 左眉毛关键点 optional
  53. bef_ai_fpoint * eyebrow_right; // 右眉毛关键点 optional
  54. bef_ai_fpoint * lips; // 嘴唇关键点 optional
  55. bef_ai_fpoint * left_iris; // 左虹膜关键点 optional
  56. bef_ai_fpoint * right_iris; // 右虹膜关键点 optional
  57. } bef_ai_facefitting_landmark_info;
  58. // pack input
  59. typedef struct {
  60. bef_ai_facefitting_landmark_info face_landmark_info[BEF_FITTING_MAX_FACE];
  61. int face_landmark_info_count; //输入的人脸的个数
  62. int view_width;
  63. int view_height;
  64. float cameraParams[3]; // focal_length, centerx, centery
  65. } bef_ai_facefitting_args;
  66. //与模型文件一一对应, 内容不会改变的, 由sdk管理内存分配与释放
  67. typedef struct {
  68. int version_code; // 模型的版本号
  69. float* uv; // 标准展开图像的 uv坐标, 由sdk管理内存分配与释放
  70. int uv_count; // uv数组的长度
  71. unsigned short* flist; // 3d模型顶点 的索引数组(face), 由sdk管理内存分配与释放
  72. int flist_count; // flist数组的长度
  73. unsigned short* landmark_triangle; // landmark做三角剖分后的三角形数组, 由sdk管理内存分配与释放
  74. int landmark_triangle_count; // landmark数组的长度
  75. int num_vertex; // = uv_count/2 = vertex_count/3 表示顶点元素的个数, uv是标准3d模型的展开后的2d坐标
  76. int num_flist; // = flist_count / 3 面的个数
  77. int num_landmark_triangle; // = landmark_triangle_count / 2 三角形的个数
  78. int mum_landmark; // = landmark_count / 3 landmrk的个数
  79. int num_param; // = param_count 求解参数的个数
  80. } bef_ai_facefitting_mesh_config;
  81. //pack output
  82. typedef struct {
  83. bef_ai_facefitting_mesh_info face_mesh_info[BEF_FITTING_MAX_FACE];
  84. int face_mesh_info_count; //返回mesh的个数, 请使用face_mesh_info_count来取face_mesh_info的前几个的内容,不要越界!!
  85. bef_ai_facefitting_mesh_config face_mesh_config;
  86. } bef_ai_facefitting_result;
  87. /**
  88. * @param handle
  89. * @return
  90. */
  91. BEF_SDK_API
  92. bef_effect_result_t bef_effect_ai_facefitting_create(bef_ai_facefitting_handle *handle);
  93. /**
  94. * @param handle
  95. * @param model_path 模型文件的绝对路径
  96. * @return
  97. */
  98. BEF_SDK_API
  99. bef_effect_result_t bef_effect_ai_facefitting_init(bef_ai_facefitting_handle handle, const char *model_path);
  100. /**
  101. * @param handle bef_ai_facefitting_handle
  102. * @param type bef_ai_facefitting_param_type
  103. * @param value value
  104. * @return
  105. */
  106. BEF_SDK_API
  107. bef_effect_result_t bef_effect_ai_facefitting_set_param(bef_ai_facefitting_handle handle, bef_ai_facefitting_param_type type, float value);
  108. /**
  109. * 输入人脸id和106点关键点,返回mesh信息
  110. * @param handle
  111. * @param args 输入
  112. * @param ret 输出,该部分内存空间生命周期由sdk管理,会在内部分配空间
  113. * @return
  114. */
  115. BEF_SDK_API
  116. bef_effect_result_t bef_effect_ai_do_fitting_3dmesh(bef_ai_facefitting_handle handle, bef_ai_facefitting_args* args, bef_ai_facefitting_result* ret);
  117. /**
  118. * 释放内部资源,不使用的时候一定要调用
  119. * @param handle 调用后handle会重置为0
  120. * @return
  121. */
  122. BEF_SDK_API
  123. bef_effect_result_t bef_effect_ai_facefitting_release(bef_ai_facefitting_handle handle);
  124. BEF_SDK_API bef_effect_result_t
  125. bef_effect_ai_facefitting_malloc_result(bef_ai_facefitting_handle handle, bef_ai_facefitting_result ** result);
  126. BEF_SDK_API bef_effect_result_t
  127. bef_effect_ai_facefitting_free_result(bef_ai_facefitting_handle handle, bef_ai_facefitting_result * result);
  128. #if defined(__ANDROID__) || defined(TARGET_OS_ANDROID)
  129. /**
  130. * 离线鉴权
  131. * @param env JNIEnv
  132. * @param context jobject
  133. * @param handle handle
  134. * @param licensePath license path
  135. */
  136. BEF_SDK_API bef_effect_result_t
  137. bef_effect_ai_facefitting_check_license(JNIEnv *env, jobject context, bef_ai_facefitting_handle handle, const char* licensePath);
  138. #elif TARGET_OS_IPHONE
  139. /**
  140. * 离线鉴权
  141. * @param handle handle
  142. * @param licensePath license path
  143. */
  144. BEF_SDK_API bef_effect_result_t
  145. bef_effect_ai_facefitting_check_license(bef_ai_facefitting_handle handle, const char* licensePath);
  146. #endif
  147. BEF_SDK_API
  148. bef_effect_result_t bef_effect_ai_facefitting_check_onine_license(bef_ai_facefitting_handle handle, const char *licensePath);
  149. #endif // BEF_EFFECT_AI_FACEFITTING