检测人体输出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
错误码请参考错误码表