检测人体输出2D骨骼关键点,识别63个人体轮廓点,仅支持全身场景。
支持平台 | Android、iOS |
---|---|
支持输入格式 | RGBA8888、BGRA8888、BGR888、RGB888 |
内存占用 | <10M (测试设备OPPO R11) |
检测速度 | <27ms(测试设备OPPO R11) |
详细接口说明查看头文件:bef_effect_ai_bach_skeleton.h
BEF_SDK_API bef_effect_result_t bef_effect_ai_bach_skeleton_create(bef_effect_handle_t *handle);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_effect_handle_t | 创建的人体轮廓算法句柄 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
BEF_SDK_API bef_effect_result_t bef_effect_ai_bach_skeleton_init( bef_effect_handle_t handle, const char* model_path);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_effect_handle_t | 人体轮廓算法句柄 |
model_path | const char* | 模型文件所在的文件夹路径 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
// 设置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);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_effect_handle_t | 人体轮廓算法的句柄 |
type | bef_ai_bach_skeleton_param_type | 人体轮廓参数类型 |
value | int | 人体轮廓参数值 |
返回值
成功返回 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;
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);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_effect_handle_t | 人体轮廓算法的句柄 |
image | const unsigned char* | 为传入图像的大小 |
pixel_format | bef_ai_pixel_format | 传入图像的类型 |
image_width | int | 传入图像的宽 |
image_height | int | 传入图像的高 |
image_stride | int | 传入图像的步长 |
orientation | bef_ai_rotate_type | 传入图像旋转角 |
result | bef_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;
BEF_SDK_API bef_effect_result_t bef_effect_ai_bach_skeleton_release(bef_effect_handle_t handle);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_effect_handle_t | 人体轮廓算法的句柄 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
// 离线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);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_effect_handle_t | 人体轮廓算法的句柄 |
licensePath | const char * | 授权文件字符串 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
接口说明
详细接口说明查看文件:com.bytedance.labcv.effectsdk.BachSkeletonDetect.java
public int init( Context context, String modelPath, String licensePath, boolean onlineLicense)
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
context | Context | 应用上下文 |
modelpath | String | 模型文件绝对路径 |
licensePath | String | 授权文件绝对路径 |
onlineLicense | boolean | 授权类型 |
返回值
成功返回BEF_RESULT_SUC,否则返回对应的错误码
// 设置int类型的参数接口 public int setParamI( BytedEffectConstants.BachSkeletonParamType paramType, int value)
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
paramType | BytedEffectConstants.BachSkeletonParamType | 输入参数类型 |
value | int | 输入参数数值 |
返回值
成功返回BEF_RESULT_SUC,否则返回对应的错误码
备注
关于BytedEffectConstants.BachSkeletonParamType可参考com.bytedance.labcv.effectsdk.BytedEffectConstants.java,并且其定义与C接口bef_ai_bach_skeleton_param_type保持一致。
public BefBachSkeletonInfo detect( ByteBuffer buffer, BytedEffectConstants.PixlFormat pixelFormat, int imageWidth, int imageHeight, int imageStride, BytedEffectConstants.Rotation orientation)
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
buffer | ByteBuffer | 输入图像数据 |
pixelFormat | BytedEffectConstants.PixlFormat | 输入数据格式 |
imageWidth | int | 输入图像宽度 |
imageHeight | int | 输入图像高度 |
imageStride | int | 输入图像步长 |
orientation | BytedEffectConstants.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-人体轮廓结果
public void release()
答:建议首先查看以下tag输出Error类型的日志:
bef_effect_ai 和SMASH_E_LOG 以及 EffectSDK
错误码请参考错误码表