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

头发分割

最近更新时间2023.06.28 14:44:56

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

简介

头发分割SDK提供从图像中实时提取头发轮廓的能力,支持多人同时分割,具备稳定性高、性能开销低、速度快等特点,常应用于染发特效中。

技术规格
支持平台Android、iOS、Windows、Mac
支持输入格式RGBA8888、BGRA8888、BGR888、RGB888、NV21、NV12、YUV420P
支持最小输入尺寸短边128
内存占用<3M (测试设备OppoR11)
检测速度<7ms(测试设备iPhone7)
C接口说明

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

1.创建头发分割句柄

BEF_SDK_API bef_effect_result_t  
bef_effect_ai_hairparser_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_hairparser_init_model(
    bef_effect_handle_t handle,  
    const char* param_path);

参数说明

参数名参数类型参数说明
handlebef_effect_handle_t头发分割的检测句柄
param_pathconst char*模型文件的路径

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

3.设置SDK参数

BEF_SDK_API bef_effect_result_t  
bef_effect_ai_hairparser_set_param(
    bef_effect_handle_t handle,  
    int net_input_width,  
    int net_input_height,
    bool use_tracking,
    bool use_blur);

参数说明

参数名参数类型参数说明
handlebef_effect_handle_t头发分割的检测句柄
net_input_widthint神经网络传入的宽:HairParser 128
net_input_heightint神经网络传入的高:HairParser 224
use_trackingbool算法内部参数,目前传入 true 即可
use_blurbool算法内部参数,目前传入 true 即可

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

4.获取输出shape

BEF_SDK_API bef_effect_result_t
bef_effect_ai_hairparser_get_output_shape(
    bef_effect_handle_t handle,
    int* output_width,
    int* output_height,
    int* channel);

参数说明

参数名参数类型参数说明
handlebef_effect_handle_t头发分割的检测句柄
output_widthint*神经网络输出的宽:HairParser
output_heightint*神经网络输出的高:HairParser
channelint*神经网络输出的通道,目前始终返回1

备注
channel为返回通道数,目前始终返回1,未来可能扩展

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

5.进行抠图操作

BEF_SDK_API bef_effect_result_t
bef_effect_ai_hairparser_do_detect(
    bef_effect_handle_t handle,
    const unsigned char* src_image_data,
    bef_ai_pixel_format pixel_format,
    int width,
    int height,
    int image_stride,
    bef_ai_rotate_type orient,
    unsigned char* dst_alpha_data,
    bool need_flip_alpha);

参数说明

参数名参数类型参数说明
handlebef_effect_handle_t头发分割的检测句柄
src_image_dataconst unsigned char*为传入图像的大小,图像大小任意
pixel_formatbef_ai_pixel_format传入图像的类型
widthint传入图像的宽
heightint传入图像的高
image_strideint传入图像的步长
orientbef_ai_rotate_type传入图像旋转角
dst_alpha_dataunsigned char*传出图像
need_flip_alphabool传出图像是否需要翻转

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

6.释放句柄

BEF_SDK_API bef_effect_result_t
bef_effect_ai_hairparser_destroy(bef_effect_handle_t handle);

参数说明

参数名参数类型参数说明
handlebef_effect_handle_t头发分割的检测句柄

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

6.头发分割授权

BEF_SDK_API bef_effect_result_t 
bef_effect_ai_hairparser_check_license(
    JNIEnv* env, 
    jobject context, 
    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.HairParser.java

1.初始化头发分割句柄

public int init(
    Context context,
    String modelpath, 
    String licensePath)

参数说明

参数名参数类型参数说明
contextContext应用上下文
modelpathconst char *模型文件绝对路径
licensePathconst char *授权文件绝对路径

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

2.设置SDK参数

public int setParam(
    int width,
    int height,
    boolean useTracking,
    boolean useBlur)

参数说明

参数名参数类型参数说明
widthint输入图像的宽度
heightint输入图像的高度
useTrackingboolean是否跟踪 传入true
useBlurboolean是否模糊 传入true

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

3.头发分割

public HairMask parseHair(
    ByteBuffer imgdata,
    BytedEffectConstants.PixlFormat pixel_format,
    int width,
    int height,
    int stride,
    BytedEffectConstants.Rotation orientation,
    boolean needFlipAlpha)

参数说明

参数名参数类型参数说明
imgdataByteBuffer输入图像数据
pixel_formatBytedEffectConstants.PixlFormat输入数据格式
widthint输入图像宽度
heightint输入图像高度
strideint输入图像步长
orientationBytedEffectConstants.Rotation输入图像旋转角
needFlipAlphaboolean输出图像是否需要翻转


备注
类HairMask详细情况可以参考com.bytedance.labcv.effectsdk.HairParser.java

/**
     * 头发分割结果
     */
    public class HairMask {
        private int width;
        private int height;
        private byte[] buffer;
        private int channel;

        public byte[] getBuffer() {
            return buffer;
        }

        public int getWidth() {
            return width;
        }

        public int getHeight() {
            return height;
        }

        @Override
        public String toString() {
            return String.format("l: %d w:%d, h:%d", buffer.length, width, height);
        }
    }

    private long mNativePtr;
    private boolean inited = false;

返回值
成功返回 类HairMask-头发分割结果

4.释放头发分割句柄

public void release()

FAQ

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

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

bef_effect_ai 和SMASH_E_LOG 以及 EffectSDK

2.头发分割设置后完全没有效果

答:建议按以下步骤排查下

  • 请确认头发分割句柄初始化是否成功
  • 请确认头发分割句柄已经授权成功
  • 如果初始化成功,请检查设置的输入图像数据完整且类型支持

错误码

错误码请参考错误码表