MagicEngine.framework
为特效引擎(人像美化)静态frameworkopencv2.framework
依赖库libtensorflowlite.a
依赖库CoreML.framework
依赖库MetalPerformanceShader.framework
依赖库StreamLakeLicensing.framework
鉴权库StreamLakeOpenAPI.framework
鉴权库MagicEngine.bundle
人像美化SDK内置素材,细条特效需要用到,实例化sdk时设到MEEngineConfig
的builtinPath
ycnn_metal.bundle
AI推理所需的资源文件,需要内置放在打包的.ipa
根目录target->Build Phases->Link Binary With Libraries
。+
再从弹窗最下面选择Add Other
按钮,点击Add Files
从弹出的文件选择框中选择你本地的MagicEngine.framework
,opencv2.framework
,StreamLakeLicensing.framework
,StreamLakeOpenAPI.framework
,libtensorflowlite.a
进行添加。+
再从弹窗最下面选择Add Other
按钮,点击Add Files
从弹出的文件选择框中选择你本地的``进行添加。+
再弹窗中依次搜搜CoreML.framework
,MetalPerformanceShader.framework
点击Add
进行添加依赖库。target->Build Settings
搜 Other Linker Flags
, 双击点击底下加号添加 $(inherited)
,-ObjC
, -l"c++"
bitcode
/**
* 业务类型
*/
typedef enum MEBusinessType
{
MEBusinessType_Camera = 0, ///< 相机业务
MEBusinessType_Video, ///< 视频业务
MEBusinessType_Image ///< 图片业务
} MEBusinessType;
/**
* 引擎配置
*/
typedef struct MEEngineConfig
{
char builtinPath[ME_PATH_MAX]; ///< 内置资源跟目录
MEBusinessType businessType; ///< 业务类型
int width; ///< 渲染尺寸
int height; ///< 渲染尺寸
} MEEngineConfig;
/**
* 色域类型
*/
typedef enum MEColorSpace
{
MEColorSpace_601VideoRange = 0,
MEColorSpace_601FullRange,
MEColorSpace_709VideoRange,
MEColorSpace_709FullRange,
MEColorSpace_2020VideoRange,
MEColorSpace_2020FullRange
} MEColorSpace;
/**
* YUV数据类型
*/
typedef enum MEYUVDataFormat
{
MEYUVDataFormat_NV21,
MEYUVDataFormat_NV12,
MEYUVDataFormat_I420
} MEYUVDataFormat;
/**
* 相机位置
*/
typedef enum MECameraPosition
{
MECameraPosition_Unknown = 0, ///< 未定义的相机位置
MECameraPosition_Front, ///< 前置
MECameraPosition_Back ///< 后置
} MECameraPosition;
typedef struct MEFrameData
{
const unsigned char* data[3]; ///< YUV像素数据
int stride; ///< data的Y平面一行字节数
MECameraPosition position; ///< 相机位置(前置,后置)
MEColorSpace colorSpace; ///< 色域类型
MEYUVDataFormat format; ///< 像素数据格式
int width; ///< 宽度
int height; ///< 高度
int rotation; ///< 顺时针旋转这个角度后为正图
float fov; ///< 相机视野角度
bool mirror; ///< 镜像
void* extraData; ///< 额外数据
} MEFrameData;
/**
* 特效类型
*/
typedef enum MEEffectType
{
MEEffectType_Beautify = 0, ///< 美颜
MEEffectType_Makeup, ///< 美妆
MEEffectType_Deform, ///< 美型
MEEffectType_Lookup, ///< 滤镜
MEEffectType_BodySlimming ///< 美体
} MEEffectType;
/**
* 滤镜Lut类型
*/
typedef enum MELookupType
{
MELookupType_NxN = 0, ///< 方形NxN的Lut
MELookupType_Nx1 ///< 横向Nx1的Lut
} MELookupType;
/**
* 滤镜配置
*/
typedef struct MELookupInfo
{
char path[ME_PATH_MAX]; ///< Lut图路径
float intensity; ///< 强度
int dimension; ///< 维数
MELookupType type; ///< Lut类型
} MELookupInfo;
/**
* 美妆配置
*/
typedef struct MEMakeupInfo
{
char resourceDir[ME_PATH_MAX]; ///< 资源路径
char key[ME_PATH_MAX]; ///< 资源key, 用于替换
float intensity; ///< 强度
} MEMakeupInfo;
/**
* 美颜调节类型
*/
typedef enum MEBeautyType
{
MEBeautyType_Bright = 0, ///< 美白
MEBeautyType_Soften, ///< 磨皮
MEBeautyType_WrinkleRemove, ///< 法令纹
MEBeautyType_EyeBagRemove, ///< 黑眼圈
MEBeautyType_Teeth, ///< 白牙
MEBeautyType_EyeBrighten, ///< 亮眼
MEBeautyType_FaceShadow, ///< 立体
MEBeautyType_Clarity, ///< 清晰
MEBeautyType_EvenSkin, ///< 匀肤
} MEBeautyType;
/**
* 美体调节
*/
typedef enum MEBodySlimmingType
{
MEBodySlimmingType_Head = 0, ///< 小头
MEBodySlimmingType_Neck, ///< 天鹅颈
MEBodySlimmingType_Waist, ///< 瘦腰
MEBodySlimmingType_Hip, ///< 美胯
MEBodySlimmingType_Leg, ///< 长腿
MEBodySlimmingType_Shoulder, ///< 瘦肩
MEBodySlimmingType_Breast, ///< 丰胸
} MEBodySlimmingType;
/**
* 传感器配置类型
*/
typedef enum MESensorConfigType
{
MESensorConfigType_Reset = 0, ///<重置
MESensorConfigType_Remove ///<移除
} MESensorConfigType;
/**
* 传感器配置
*/
typedef struct MESensorConfig
{
float updateInterval; ///< 更新时间间隔
MESensorConfigType configType; ///< 传感器配置配型
} MESensorConfig;
/**
* 传感器数据
*/
typedef struct MESensorData
{
double timestamp; ///< 传感器时间戳
float rotation; ///< 旋转角度
double attitude[4]; ///< 设备姿态
double acceleration[3]; ///< 加速度
} MESensorData;
/**
* 日志类型
*/
typedef enum MELogType
{
MELogType_Debug = 0, ///< 调试
MELogType_Info, ///< 信息
MELogType_Warning, ///< 警告
MELogType_Error, ///< 错误
} MELogType;
人像美化SDK的使用依赖StreamlakeLicensing,请务必先初始化Licensing SDK,否则人像美化SDK会调用失败,不生效
OpenAPI 网络库配置:
https://vod.streamlakeapi.com
#import <StreamLakeOpenAPI/SLONetworkingSetupConfig.h>
@interface SLAppDelegate()<SLONetworkingSetup>
@end
@implementation SLAppDelegate
// 填写申请的AK
+ (NSString *)openAPI_AccessKey {
return @"xx";
}
+ (NSString *)openAPI_DeployVersion {
return @"2022-02-10";
}
+ (NSArray<NSString *> *)openAPI_OnlineHosts {
return @[@"https://vod.streamlakeapi.com"];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 尽早设置 配置实现类
[SLONetworkingSetupConfig setupNetworking:self.class];
return YES;
}
ProdCode传入"y-tech"
RSAPublicKey传入申请好的公钥。注意公钥格式换行
举个例子:每行都需要换行,第2行-第8行需要靠左顶到头,不要多余空格
NSString *publicKey = @"-----BEGIN RSA PUBLIC KEY-----\n\
MIIBCgKCAQEA6l1y9YEIxzJ7ZaVyQQZbi0FyNTDom0Bhe68Vb5ep8/jqsL4pHvDc\n\
tc5b5jiqmW8mNXNP6dQ4wHmDeq/YtDk27bGTJ/vKTtqrGf6iZrpTwcDoq4+1fsgv\n\
KsO2c3Mw7mo7t/4Z4R2gW8qng1ZSU27WlWJakcDUcV3NJW1znIdkLzxbadX2apWl\n\
FBjfon6TLK/VTmbwYxavKPBfmqAmMeh9e1jfP/swk7O5BT3KhfYaltflMaUODZ2D\n\
YO88uVslHCX4WhGlCLrbDgVhCNMQ6ANEKOr1U6iEujC98h+2oKgw41Pj0f6rcii6\n\
ksCBQBpc5ngug/dOgVT8e2sB6xDpPzppmQIDAQAB\n\
-----END RSA PUBLIC KEY-----";
_ytechLicensingMgr = [[SLLicensingManager alloc] initWithRSAPublicKey:publicKey prodCode:@"y-tech"];
[_ytechLicensingMgr setupWithCompletion:^(BOOL success) {
NSLog(@"y-tech setup %@, begin verify", @(success));
}];
人像美化SDK需要引以下的头文件:
#import <MagicEngine/MagicEngine.h>
API中的参数和返回值类型以及每个属性的含义请看上面的**3.数据结构与枚举
**
人像美化SDK主要包含滤镜,美妆,美颜,美型,美体。需要单独开启和关闭并设定参数
/**
* @brief 实例化人像美化SDK
* @param config 引擎的配置数据
* @return 引擎实例
*/
+ (id<MagicEngineSync>)createSyncMagicEngine:(MEEngineConfig*)config;
/**
* @brief 同步渲染接口,结果写入返回值frameData中,不要求在GL上下文中调用
* @param frameData 帧数据描述
* @return 带渲染结果的MEFrameData
*/
- (MEFrameData*)processWithFrameData:(MEFrameData*)frameData;
下面这些接口主要是用来设定及调节美颜,美型,美妆,美体,滤镜等。
/**
* @brief 人像美化协议
*/
@property (nonatomic, weak) id<MagicEngineDelegate> delegate;
/**
* @brief 设定模型路径
* @param pathDic 模型key和path的字典
*/
- (void)setModelPathDic:(NSDictionary<NSString*, NSString*>*)pathDic;
/**
* @brief 开启/关闭 单个特效
* @param effectType 需要开启的特效类型
* @param enable 开启或者关闭状态
*/
- (void)setEffectEnabledWidthEffectType:(MEEffectType)effectType enable:(bool)enable;
/**
* @brief 设定滤镜资源
* @param lookupInfo 需要设定的拍前滤镜信息
*/
- (void)setLookupInfo:(MELookupInfo)lookupInfo;
/**
* @brief 设定滤镜强度
* @param intensity 滤镜强度
*/
- (void)setLookupIntensity:(float)intensity;
/**
* @brief 设定美妆资源
* @param makeupInfo 需要设定的美妆信息,每个部分都是一个MakeupInfo结构
*/
- (void)setMakeupInfo:(NSArray<NSValue*>*)makeupInfo;
/**
* @brief 设定美妆强度
* @param key 需要调整的美妆key(设定美妆时用户自定义)
* @param intensity 强度
*/
- (void)setMakeupIntensityWithKey:(NSString*)key intensity:(float)intensity;
/**
* @brief 设定美颜强度
* @param type 需要调节的美颜类型
* @param intensity 强度
*/
- (void)setBeautyIntensityWithType:(MEBeautyType)type intensity:(float)intensity;
/**
* @brief 设定美型强度
* @param mode 美型类型
* @param intensity 强度
*/
- (void)setDeformIntensityWithMode:(int)mode intensity:(float)intensity;
/**
* @brief 设定美体强度
* @param type 需要调整的美体类型
* @param intensity 强度
*/
- (void)setBodySlimmingIntensityWithType:(MEBodySlimmingType)type intensity:(float)intensity;
/**
* 更新传感器数据
* @param sensorData 传感器数据
*/
- (void)setSensorData:(MESensorData)sensorData;
/**
* 清理内部正在处理的数据帧队列
*/
- (void)clearFrameQueue;
/**
* @brief 销毁引擎. 调用之后此实例不可再使用. 此方法主要用于保障 MagicEngine 在合适的时机合适的线程释放资源.
*/
- (void)destroy;
美颜美型等都需要一些AI模型的支持。模型的路径通过上面所说的setModelPathDic
方法设定。模型资源都放在了resource目录中的model.7z
中,解压之后就能看到。其中模型的key为文件夹名字,path设此文件夹的路径。例如:key为magic_ycnn_model_landmark
的路径设为/path/to/magic_ycnn_model_landmark
。
当前所有的模型为:
magic_mmu_model_animoji1
magic_mmu_model_basewhite
magic_ycnn_model_cloth_seg
magic_ycnn_model_face_attributes
magic_ycnn_model_face_seg
magic_ycnn_model_finger
magic_ycnn_model_general_handpose
magic_ycnn_model_gesture
magic_ycnn_model_hair
magic_ycnn_model_head_seg
magic_ycnn_model_humanpose
magic_ycnn_model_landmark
magic_ycnn_model_matting
magic_ycnn_model_skin_seg
magic_ycnn_model_landmark
magic_ycnn_model_landmark
magic_ycnn_model_face_attributes
magic_ycnn_model_face_seg
magic_ycnn_model_landmark
magic_ycnn_model_landmark
magic_ycnn_model_humanpose
不需要AI模型
通过setModelPathDic
可以多次设定或刚开始把模型key和对应的路径先设定,应用对应功能之前确保再该路径中下载好或者放好对应模型。原则上需要模型的功能在被调用之前把对应的key和path通过这个dictionary设进去即可。
例如:刚开始只调用美颜和美型可以设定magic_ycnn_model_landmark
,magic_ycnn_model_face_attributes
,后面调节美体可以在之前的基础上添加magic_ycnn_model_humanpose
三个一起设进去。可以一直累加,外部维护一个dictionary,或者全部一起设定,之后在确保模型存于早先设定的路径。
1.调用鉴权API
进行授权
2.调用 createSyncMagicEngine:
创建人像美化
3.调用 processWithFrameData:
进行数据处理
4.准备退出时调用 destroy
方法销毁SDK