You need to enable JavaScript to run this app.
导航

人体轮廓

最近更新时间2023.06.28 14:42:43

首次发布时间2022.02.25 17:16:51

简介

检测人体输出2D骨骼关键点,识别63个人体轮廓点,仅支持全身场景。

技术规格
支持平台Android、iOS
支持输入格式RGBA8888、BGRA8888、BGR888、RGB888
内存占用<10M (测试设备OPPO R11)
检测速度<27ms(测试设备OPPO R11)
C接口说明

详细接口说明查看头文件:bef_effect_ai_bach_skeleton.h

1.创建人体轮廓句柄

BEF_SDK_API bef_effect_result_t  
bef_effect_ai_bach_skeleton_create(bef_effect_handle_t *handle);

参数说明

参数名参数类型参数说明
handlebef_effect_handle_t创建的人体轮廓算法句柄

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h

2.从文件初始化模型参数

BEF_SDK_API bef_effect_result_t  
bef_effect_ai_bach_skeleton_init(
    bef_effect_handle_t handle,  
    const char* model_path);

参数说明

参数名参数类型参数说明
handlebef_effect_handle_t人体轮廓算法句柄
model_pathconst char*模型文件所在的文件夹路径

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h

3.设置SDK参数

// 设置int类型的参数接口
BEF_SDK_API bef_effect_result_t
bef_effect_ai_bach_skeleton_set_paramI(
    bef_effect_handle_t handle,
    bef_ai_bach_skeleton_param_type type,
    int value);

参数说明

参数名参数类型参数说明
handlebef_effect_handle_t人体轮廓算法的句柄
typebef_ai_bach_skeleton_param_type人体轮廓参数类型
valueint人体轮廓参数值

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h

备注

bef_ai_bach_skeleton_param_type 详细见bef_effect_ai_bach_skeleton.h

/**
 * @brief 模型参数类型
 *
 */
typedef enum {
    BEF_AI_BACH_SKELETON_BODY_MAX_COUNT = 0,     // 最大可检测的人体数量(最多为5), int。
    BEF_AI_BACH_SKELETON_FORCE_DETECT = 1,       // 设置跟踪模式,int。
                                                 //    0: 非强制检测(跟踪模式,默认值)
                                                 //    1: 强制每帧检测
    BEF_AI_BACH_SKELETON_IMAGE_MODE = 2,         // 设置检测模式,int。
                                                 //    0: 视频模式(检测+跟踪,默认值)
                                                 //    1:图片模式(无跟踪)
} bef_ai_bach_skeleton_param_type;

4.进行人体轮廓检测操作

BEF_SDK_API bef_effect_result_t
bef_effect_ai_bach_skeleton_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,
    bef_ai_bach_skeleton_info *result);

参数说明

参数名参数类型参数说明
handlebef_effect_handle_t人体轮廓算法的句柄
imageconst unsigned char*为传入图像的大小
pixel_formatbef_ai_pixel_format传入图像的类型
image_widthint传入图像的宽
image_heightint传入图像的高
image_strideint传入图像的步长
orientationbef_ai_rotate_type传入图像旋转角
resultbef_ai_bach_skeleton_info*算法处理返回结果

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h

备注

bef_ai_bach_skeleton_info 详细见bef_effect_ai_bach_skeleton.h

// 检测关键点实例
typedef struct bef_ai_bach_skeleton_point_info_st {
    float x; // 对应 cols, 范围在 [0, width] 之间
    float y; // 对应 rows, 范围在 [0, height] 之间
    bool is_detect; // 如果该值为 0, 则 x,y 无意义
    float score; // 对应点的分数
} bef_ai_bach_skeleton_point_info;

// 检测结果
typedef struct bef_ai_bach_skeleton_info_st {
    int id;
    int orientation;
    bef_ai_bach_skeleton_point_info keyPointInfos[BEF_AI_MAX_BACH_SKELETON_POINT_NUM];     // 检测到的骨骼信息
    bef_ai_rect  skeletonRect; // 骨骼rect
} bef_ai_bach_skeleton_info;

5.释放句柄

BEF_SDK_API bef_effect_result_t
bef_effect_ai_bach_skeleton_release(bef_effect_handle_t handle);

参数说明

参数名参数类型参数说明
handlebef_effect_handle_t人体轮廓算法的句柄

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h

6.人体轮廓授权

// 离线license检测方式
BEF_SDK_API bef_effect_result_t
bef_effect_ai_bach_skeleton_check_license(
    bef_effect_handle_t handle,
    const char *licensePath);

// 在线license检测方式
BEF_SDK_API bef_effect_result_t
bef_effect_ai_bach_skeleton_check_online_license(
    bef_effect_handle_t handle,
    const char *licensePath);

参数说明

参数名参数类型参数说明
handlebef_effect_handle_t人体轮廓算法的句柄
licensePathconst char *授权文件字符串

返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h

Java 接口说明

接口说明
详细接口说明查看文件:com.bytedance.labcv.effectsdk.BachSkeletonDetect.java

1.初始化人体轮廓句柄

public int init(
    Context context,
    String modelPath,
    String licensePath,
    boolean onlineLicense)

参数说明

参数名参数类型参数说明
contextContext应用上下文
modelpathString模型文件绝对路径
licensePathString授权文件绝对路径
onlineLicenseboolean授权类型

返回值
成功返回BEF_RESULT_SUC,否则返回对应的错误码

2.设置SDK参数

// 设置int类型的参数接口
public int setParamI(
    BytedEffectConstants.BachSkeletonParamType paramType,
    int value)

参数说明

参数名参数类型参数说明
paramTypeBytedEffectConstants.BachSkeletonParamType输入参数类型
valueint输入参数数值

返回值
成功返回BEF_RESULT_SUC,否则返回对应的错误码

备注

关于BytedEffectConstants.BachSkeletonParamType可参考com.bytedance.labcv.effectsdk.BytedEffectConstants.java,并且其定义与C接口bef_ai_bach_skeleton_param_type保持一致。

3.人体轮廓

public BefBachSkeletonInfo detect(
    ByteBuffer buffer,
    BytedEffectConstants.PixlFormat pixelFormat,
    int imageWidth,
    int imageHeight,
    int imageStride,
    BytedEffectConstants.Rotation orientation)

参数说明

参数名参数类型参数说明
bufferByteBuffer输入图像数据
pixelFormatBytedEffectConstants.PixlFormat输入数据格式
imageWidthint输入图像宽度
imageHeightint输入图像高度
imageStrideint输入图像步长
orientationBytedEffectConstants.Rotation输入图像旋转角

备注

类BefBachSkeletonInfo详细情况可以参考com.bytedance.labcv.effectsdk.BefBachSkeletonInfo.java,并且其定义与C接口bef_ai_bach_skeleton_info保持一致。

/**
 * 人体关键点检测结果
 * Key detection results of skeleton
 */
public class BefBachSkeletonInfo {

  /**
   * 人体关键点
   * Key points of skeleton
   */
  private Skeleton[] skeletons;

  /**
   * 人体数量
   * Amount of human
   */

  private int skeletonNum;

  /**
   * 获取人体个数
   * Get amount of human
   * @return 人体数目 amount of human
   */
  public int getSkeletonNum() {
    return skeletonNum;
  }

  /**
   * 设置人体数目
   * Set amount of human
   * @param skeletonNum
   */
  public void setSkeletonNum(int skeletonNum) {
    this.skeletonNum = skeletonNum;
  }

  /**
   * 获取全部的关键点数组
   * Get the array of skeleton key points
   * @return 人体关键点数组 array of skeleton key points
   */
  public Skeleton[] getSkeletons() {
    if(skeletons == null)
      return new Skeleton[0];
    return skeletons;
  }

  @Override
  public String toString() {
    return "BefSkeletonInfo{" +
            "skeletons=" + Arrays.toString(skeletons) +
            ", skeletonNum=" + skeletonNum +
            '}';
  }

  /**
   * 单个人体关键点数据
   * Key points data of Individual skeleton
   */
  public static class Skeleton
  {
    int id;
    int orientation;
    SkeletonPoint[] keypoints;
    BefFaceInfo.FaceRect skeletonRect;

    public SkeletonPoint[] getKeypoints() {
      if(keypoints == null)
        return new SkeletonPoint[0];
      return keypoints;
    }

    public int getId() {
      return id;
    }

    public int getOrientation() {
      return orientation;
    }

    public BefFaceInfo.FaceRect getSkeletonRect() {
      return skeletonRect;
    }

    @Override
    public String toString() {
      return "Skeleton{" +
              "keypoints=" + Arrays.toString(keypoints) +
              ", skeletonRect=" + skeletonRect +
              '}';
    }
  }

  public static class SkeletonPoint
  {
    float x;
    float y;
    boolean is_detect;
    float score;


    public SkeletonPoint(float x, float y, boolean is_detect, float score)
    {
      this.x = x;
      this.y = y;
      this.is_detect = is_detect;
      this.score = score;
    }

    public void setIs_detect(boolean is_detect) {
      this.is_detect = is_detect;
    }

    public boolean isDetect() {
      return is_detect;
    }

    public float getX() {
      return x;
    }

    public void setX(float x) {
      this.x = x;
    }

    public float getY() {
      return y;
    }

    public void setY(float y) {
      this.y = y;
    }

    public PointF asPoint() {
      return new PointF(x, y);
    }

    public float getScore() { return score; }

    @Override
    public String toString() {
      return "FacePoint{" +
          "x=" + x +
          ", y=" + y +
          ", isdetect=" + String.valueOf(is_detect) +
          '}';
    }
  }

}

返回值
成功返回 类BefBachSkeletonInfo-人体轮廓结果

4.释放人体轮廓句柄

public void release()

FAQ

1.如果出现任何异常,请查看是否有以下类型日志

答:建议首先查看以下tag输出Error类型的日志:

bef_effect_ai 和SMASH_E_LOG 以及 EffectSDK

错误码

错误码请参考错误码表