1. 概述
AR Scene是美摄SDK中用于展示AR效果的特技,现支持道具,美颜,美型,美妆等功能。
2. 使用
2.1 资源加载
AR Scene 中由于使用了人体检测相关的技术,在程序初始化阶段需要加载一些模型以及数据包资源。
2.1.1 模型加载
首先判断该SDK是否包含AR功能,不包含AR功能的SDK无法加载人体检测模型。
bool hasAR = NvsStreamingContext.hasARModule();
人体检测模型的加载通过调用 InitHumanDetection 和 InitHumanDetectionExt 实现。InitHumanDetection 指定主模型的加载,只能调用一次。InitHumanDetectionExt 指定扩展模型的加载,可以通过多次调用加载多个扩展模型。一般情况下我们使用人脸点位模型作为主模型。
如下是加载人脸点位模型与眼眼球轮廓模型的示例。
boolean initSuccess = NvsStreamingContext.initHumanDetection(
MSApplication.getContext(),
landmarksModelPath,
null,
NvsStreamingContext.HUMAN_DETECTION_FEATURE_FACE_LANDMARK |
NvsStreamingContext.HUMAN_DETECTION_FEATURE_FACE_ACTION |
NvsStreamingContext.HUMAN_DETECTION_FEATURE_VIDEO_MODE);
initSuccess = NvsStreamingContext.initHumanDetectionExt(
MSApplication.getContext(),
eyeballModelPath,
null,
NvsStreamingContext.HUMAN_DETECTION_FEATURE_EYEBALL_LANDMARK |
NvsStreamingContext.HUMAN_DETECTION_FEATURE_VIDEO_MODE);
在程序销毁时还需调用 closeHumanDetection 来卸载安装过的所有模型以及数据包。
NvsStreamingContext.closeHumanDetection();
注:
- 模型初始化操作涉及文件拷贝耗时操作,建议放在子线程去出处理。
- modelFilePath指定模型加载路径,不支持ASSET路径;
- 使用美摄自研点位SDK licenseFilePath为空;
- features项指定模型类型以及所有支持的检测模式;
- 所有InitHumanDetection 和InitHumanDetectionExt 调用中的检测模式,建议设置成相同模式,不同检测模式会影响程序运行效率。
2.1.1.1 模型类型
模型分为两种,普通模型与复合模型。普通模型只支持单一的功能,复合模型可以支持多项功能。例如人脸检测模型就是复合模型,同时支持点位检测以及人脸动作检测。
SDK现支持具体如下:
注:
- 106人脸检测模型与240人脸检测模型只能选用一个;
- 可以使用240模型,但只使用其中的106点位检测功能,不影响检测效率;
- 对于复合模型,某个功能项没有或上,那么,AR Scene或其他使用到该功能项的特技将无法正常运行。
2.1.1.2 检测模式
检测模式:
在调用InitHumanDetection 和 InitHumanDetectionExt 时features参数需要或上所有支持的检测模式。同时在AR Scene使用时,需要通过 setDetectionMode 指定该特技实例具体使用哪种检测模式。
例如,如下代码在模型加载阶段同时或上了“视频检测模式”和“图片检测模式”,在 AR Scene 特技使用时指定检测模型为“图片检测模式”。
boolean initSuccess = NvsStreamingContext.initHumanDetection(
MSApplication.getContext(),
landmarksModelPath,
null,
NvsStreamingContext.HUMAN_DETECTION_FEATURE_FACE_LANDMARK |
NvsStreamingContext.HUMAN_DETECTION_FEATURE_FACE_ACTION |
NvsStreamingContext.HUMAN_DETECTION_FEATURE_VIDEO_MODE|
NvsStreamingContext.HUMAN_DETECTION_FEATURE_IMAGE_MODE
);
....
NvsARSceneManipulate arSceneManipulate = mArSceneEffect.getARSceneManipulate();
if (arSceneManipulate != null) {
arSceneManipulate.setDetectionMode(NvsStreamingContext.HUMAN_DETECTION_FEATURE_IMAGE_MODE);
2.1.2 数据包加载
数据包使用 setupHumanDetectionData 来加载。如下代码展示美妆数据包的加载过程。
boolean setupSuccess = NvsStreamingContext.setupHumanDetectionData(
NvsStreamingContext.HUMAN_DETECTION_DATA_TYPE_MAKEUP2,
makeupDataFile);
数据包类型:
注:使用美妆需设置人脸通用数据包,使用高级颜需同时设置人脸通用数据包以及高级美颜数据包。
2.2 特技使用
2.2.1 特技创建
AR Scene 是内建特技,对应特技名称为“AR Scene”。可以使用美摄SDK内建特技的标准创建方式进行创建。例如拍摄模式下:
NvsVideoFx mArSceneEffect = mStreamingContext.appendBuiltinCaptureVideoFx("AR Scene");
2.2.2 其他设置
检测类特技,如AR Scene需要进行buddy buffer相关设置。分为以下几类情况:
拍摄模式
预览开启时需要设置buddy buffer相关flags,STREAMING_ENGINE_CAPTURE_FLAG_CAPTURE_BUDDY_HOST_VIDEO_FRAME。
mStreamingContext.startCapturePreview(mCurrentDeviceIndex, captureResolutionGrade,
NvsStreamingContext.STREAMING_ENGINE_CAPTURE_FLAG_DONT_USE_SYSTEM_RECORDER |
NvsStreamingContext.STREAMING_ENGINE_CAPTURE_FLAG_CAPTURE_BUDDY_HOST_VIDEO_FRAME |
NvsStreamingContext.STREAMING_ENGINE_CAPTURE_FLAG_ENABLE_TAKE_PICTURE |
NvsStreamingContext.STREAMING_ENGINE_CAPTURE_FLAG_STRICT_PREVIEW_VIDEO_SIZE, null);
编辑模式
检测类特效推荐以 Raw Filter 形式添加,效率更高。
播放时需要分别设置buddy buffer相关flags,STREAMING_ENGINE_PLAYBACK_FLAG_BUDDY_HOST_VIDEO_FRAME。
需要注意的是,如果特技是以 Raw Filter 的形式添加,flags 上才能够且必须或上STREAMING_ENGINE_PLAYBACK_FLAG_BUDDY_ORIGIN_VIDEO_FRAME,否则会造成部分效果异常。
mStreamingContext.playbackTimeline(mTimeLine, startTime, endTime, NvsStreamingContext.VIDEO_PREVIEW_SIZEMODE_LIVEWINDOW_SIZE, true,
NvsStreamingContext.STREAMING_ENGINE_PLAYBACK_FLAG_BUDDY_HOST_VIDEO_FRAME |
NvsStreamingContext.STREAMING_ENGINE_PLAYBACK_FLAG_BUDDY_ORIGIN_VIDEO_FRAME |
NvsStreamingContext.STREAMING_ENGINE_PLAYBACK_FLAG_LOW_PIPELINE_SIZE);
Seek时需要分别设置buddy buffer相关flags。STREAMING_ENGINE_SEEK_FLAG_BUDDY_HOST_VIDEO_FRAME。
需要注意的是,如果特技是以 Raw Filter 的形式添加,flags 上才能够且必须或上STREAMING_ENGINE_SEEK_FLAG_BUDDY_ORIGIN_VIDEO_FRAME,否则会造成部分效果异常。
mStreamingContext.seekTimeline(mTimeLine, timestamp, NvsStreamingContext.VIDEO_PREVIEW_SIZEMODE_LIVEWINDOW_SIZE,
seekShowMode |
NvsStreamingContext.STREAMING_ENGINE_SEEK_FLAG_BUDDY_HOST_VIDEO_FRAME |
STREAMING_ENGINE_SEEK_FLAG_BUDDY_ORIGIN_VIDEO_FRAME);
Compile时需要分别设置buddy buffer相关flags。STREAMING_ENGINE_COMPILE_FLAG_BUDDY_HOST_VIDEO_FRAME。
需要注意的是,如果特技是以 Raw Filter 的形式添加,flags 上才能够且必须或上STREAMING_ENGINE_COMPILE_FLAG_BUDDY_ORIGIN_VIDEO_FRAME,否则会造成部分效果异常。
mStreamingContext.compileTimeline(timeline, startTime, endTime, compileVideoPath, videoResolutionGrade, NvsStreamingContext.COMPILE_BITRATE_GRADE_HIGH,
encoderFlag |
NvsStreamingContext.STREAMING_ENGINE_COMPILE_FLAG_BUDDY_HOST_VIDEO_FRAME |
NvsStreamingContext.STREAMING_ENGINE_COMPILE_FLAG_BUDDY_ORIGIN_VIDEO_FRAME);
2.3 特技功能
2.3.1 道具
AR Scene 道具的应用,需要先安装道具包,再把返回的包ID设置给 AR Scene 特技。例如:
NvsAssetPackageManager assetPackageManager = mStreamingContext.getAssetPackageManager();
StringBuilder sceneId = new StringBuilder();
String packagePath = "assets:/arface/084A6EC1-43AB-40EF-BBD5-D83F692B011B.3.arscene";
int ret = assetPackageManager.installAssetPackage(packagePath , null,
NvsAssetPackageManager.ASSET_PACKAGE_TYPE_ARSCENE, true, sceneId);
mArSceneEffect.setStringVal("Scene Id", sceneId);
取消道具“Scene Id”传空。
mArSceneEffect.setStringVal("Scene Id", “”);
注:道具包使用前,需加载该包要求的人体检测模型以及数据包。各个包的具体要求参见美摄素材平台。
2.3.2 美颜
美颜功能分为普通美颜与高级美颜,普通美颜不需要人体检测的支持,高级美颜需要。
高级美颜与普通美颜都有磨皮的功能,如果同时开启,高级美颜的磨皮效果会覆盖普通美颜效果。
2.3.2.1 普通美颜
普通美颜功能包括:磨皮,Lut,美白,红润,锐化等功能。
具体参数参见 美颜参数
2.3.2.2 高级美颜
高级美颜功能包括:高级磨皮,祛黑眼圈,祛法令纹,眼亮,白牙,哑光,人脸Lut,清晰等功能。
具体参数参见 高级美颜参数 。
高级美颜要求加载106人脸点位检测模型或者240人脸点位检测模型,二者在效果上有细微差别。同时需设置人脸通用数据包以及高级美颜数据包。
2.3.3 美型
美型功能能够对面部细节进行一些微调。具体参数参见 美型参数 。
美型要求加载106人脸点位检测模型或者240人脸点位检测模型。二者在效果上没有差别。
美型的各项调节有默认的效果,同时也支持自定义美型包的形式。
如果使用美型包,需要先安装,再把返回的包ID设置给对应的包ID参数。
NvsAssetPackageManager assetPackageManager = mStreamingContext.getAssetPackageManager();
StringBuilder faceMeshId = new StringBuilder();
String packagePath = "assets:/facemesh/084A6EC1-43AB-40EF-BBD5-D83F692B011B.3.facemesh";
int ret = assetPackageManager.installAssetPackage(packagePath , null,
NvsAssetPackageManager.ASSET_PACKAGE_TYPE_FACE_MESH, true, faceMeshId );
mArSceneEffect.setStringVal("Face Mesh Eye Size Custom Package Id", faceMeshId );
如果要取消自定义美型效果,则对应包ID参数传空。
mArSceneEffect.setStringVal("Face Mesh Eye Size Custom Package Id", "");
2.3.4 美妆
美妆分为:单妆和妆容。
美妆要求加载240人脸点位检测模型,如果使用美瞳也还需要加载眼球轮廓检测模型。
美妆要求加载人脸通用数据包。
**2.3.4.1 单妆**
单妆是单一的美妆效果,现支持的有口红、眉毛、眼影、睫毛、眼线、腮红、高光、修容。
每个单妆需要安装对应单妆包才可使用。
如下是口红包的安装与使用过程。
NvsAssetPackageManager assetPackageManager = mStreamingContext.getAssetPackageManager();
StringBuilder makeupId = new StringBuilder();
String makeupPath="assets:/makeup/07E4CE0F-3AEA-4510-8C23-9267522B7BFE.1.makeup";
int ret = assetPackageManager.installAssetPackage(makeupPath, null,
NvsAssetPackageManager.ASSET_PACKAGE_TYPE_MAKEUP , true, uuid);
mArSceneEffect.setColorVal("Makeup Lip Color", new NvsColor(1, 0, 0, 1));
mArSceneEffect.setFloatVal("Makeup Lip Intensity", 1);
mArSceneEffect.setStringVal("Makeup Lip Package Id", makeupId);
2.3.4.2 妆容
妆容是若干单妆、美颜、美型、微整型、滤镜的整体效果。对于妆容的接入,美摄提供一套中间层的接口,具体可参考sdkdemo。
3. FAQ
问:为什么道具没有效果?
答:请做如下确认:
- SDK是否支持美摄的AR功能;
- 是否有相应功能的授权;
- 道具所需检测模型是否加载成功;
- 如果是假脸道具,假脸数据包是否加载成功;
- 如果是美妆道具,美妆数据包是否加载成功;
- buddy相关flags是否设置,见文中2.2.2;
- 道具包是否安装成功;
- 是否 AR Scene 指定的检测模式在模型加载阶段没有支持;
- 如果是Effect Sdk,渲染时传入的物理角度是否正确;
- 图像中人脸是不是过小,目前美摄检测模型支持的最小人脸屏占比为1;
问:为什么高级美颜,美型没有效果?
答:请做如下确认:
- SDK是否支持美摄的AR功能;
- 是否有相应功能的授权;
- 人脸检测模型是否加载成功;
- 人脸通用数据包和高级美颜数据包是否设置(适用高级美颜没效果的情况);
- buddy相关flags是否设置,见文中2.2.2;
- 开关是否开启,各子项强度是否大于0;
- 是否 AR Scene 指定的检测模式在模型加载阶段没有支持;
- 如果是Effect Sdk,渲染时传入的物理角度是否正确;
- 图像中人脸是不是过小,目前美摄检测模型支持的最小人脸屏占比为1;
问:为什么单妆没有效果?
答:请做如下确认:
- SDK是否支持美摄的AR功能;
- 是否有相应功能的授权;
- 240人脸检测模型是否加载成功,**如果使用美瞳,眼球轮廓检测模型是否加载成功**;
- 美妆数据包是否加载成功;
- buddy相关flags是否设置,见文中2.2.2;
- 美妆开关是否开启,美妆强度是否不为0,各子项强度是否大于0;
- 美妆包是否安装成功;
- 是否 AR Scene 指定的检测模式在模型加载阶段没有支持;
- 如果是Effect Sdk,渲染时传入的物理角度是否正确;
- 图像中人脸是不是过小,目前美摄检测模型支持的最小人脸屏占比为1;
问:为什么添加AR Scene后,添加的其他特效没有效果?
答:在 单缓冲 模式下,AR Scene之前的特效会失效,需要其他特效移到AR Scene之后,或者改用双缓冲模式。
问:想要自定义美型效果怎么办?
答:AR Scene 支持自定义美型包,请联系美摄设计同学定制。
问:如何确定检没检测到人体信息?
答:通过 setARSceneCallback 设置检测回调,查看检测到的目标个数。前提是,该荐功能已授权。
问:低端机效果卡顿怎么办?
答:需要对低端机做适配,可选配置如下:
- 背景分割使用快速模型;
- 禁用哑光效果;
- 禁用单缓冲模式;
- 通过 Unified Max Faces 和 Max Faces Respect Min 限制最大检测人脸数;
- 禁用美瞳;