将图像或视频中检测到的人脸,生成对应的3D游戏风格人脸图像。支持同时处理多张人脸
API的输入、输出对象可参考 VNN 数据结构
API的执行情况(是否成功、错误原因等)可参考 VNN_Result
对应的 状态码表
指标 | 参数 |
---|---|
支持图片格式 | BGRA、RGBA、RGB、NV12、NV21、YUV420 |
支持架构 | armeabi-v7、arm64-v8a |
Android系统版本 | 5.0+ |
iOS系统版本 | 9.0+ |
最大支持人脸数 | 5 |
指标 | 参数 |
---|---|
支持图片格式 | BGRA、RGBA、RGB、YUV420F |
支持架构 | x86(Win Only)、x86_64、arm64(MacOS Only) |
Windows系统版本 | Win 7+ |
MacOS系统版本 | 10.10+ |
最大支持人脸数 | 5 |
vnn_face.h
vnn_stylizing.h
vnn_kit.h
vnn_define.h
face_3dgame[1.0.0].vnnmodel
Android/Linux
libvnn_core.so
libvnn_kit.so
libvnn_face.so
libvnn_stylizing.so
iOS
Accelerate.framework
CoreVideo.framework
Foundation.framework
vnn_core_ios.framework
vnn_kit_ios.framework
vnn_face_ios.framework
vnn_stylizing_ios.framework
MacOS
Accelerate.framework
CoreVideo.framework
Cocoa.framework
vnn_core_osx.framework
vnn_kit_osx.framework
vnn_face_osx.framework
vnn_stylizing_osx.framework
Windows
vnn_core.dll
vnn_kit.dll
vnn_face.dll
vnn_stylizing.dll
Android: 链接
iOS: 链接
Windows: 链接
MaoOS: 链接
Linux: 链接
由于本SDK生成的Mask包含人脸和部分背景,在人脸靠近情况下,Mask将会重叠且难以确认渲染先后顺序。如有必要,可使用人脸分割SDK生成仅含人脸的准确Mask,以避免此问题
产生原因与解决办法同上
说明: 输入模型路径,完成SDK的初始化,获得用于调用后续功能的Handle
VNN_Result VNN_Create_Stylizing( VNNHandle * handle, const int argc, const void * argv[] )
参数 | 含义 |
---|---|
handle | 函数调用成功后记录合法的索引,用于调用后续功能,类型为VNN_Handle*,调用成功后handle数值大于0,输出 |
argc | 输入模型文件数,类型为const int,输入 |
argv | 每个模型文件的具体路径,类型为const char*[ ],输入 |
返回值: VNN_Result,具体值参见 状态码表
调用示例:
VNN_Handle _handle;
std::string model = _modelpath + "/face_3dgame[1.0.0].vnnmodel";
const char* argv[] = {
model.c_str(),
};
const int argc = sizeof(argv)/sizeof(argv[0]);
VNN_Result ret = VNN_Create_Stylizing(&_handle, argc, argv);
说明: 输入包含人脸的图像,输出检测结果
VNN_Result VNN_Apply_Stylizing_CPU(VNNHandle handle, const void* in_image, const void* face_data, void* output)
参数 | 含义 |
---|---|
handle | SDK实例索引,类型为VNN_Handle,输入 |
in_image | 输入图像,类型为 VNN_Image*,输入 |
face_data | 每张人脸的关键点检测信息,类型为 VNN_FaceFrameDataArr*,输入 |
output | 检测结果,类型为 VNN_ImageArr*,输出 |
返回值: VNN_Result,具体值参见 状态码表
调用示例:
#define FACE_CHANNEL (3)
#define FACE_HEIGHT (512)
#define FACE_WIDTH (512)
// input: 视频帧或图像,类型 VNN_Image
// faceArr:人脸关键点检测结果,类型 VNN_FaceFrameDataArr
VNN_ImageArr faceImageArr;
faceImageArr.imgsNum = faceArr.facesNum;
if (!_faceBuffer) {
// 按最大支持人脸数申请Buffer
_faceBuffer = (unsigned char *) malloc(FACE_HEIGHT * FACE_WIDTH * VNN_FRAMEDATAARR_MAX_FACES_NUM);
}
// 按实际检测出的人脸数设置输出对象
for (int f = 0; f < output.imgsNum ; f++) {
output.imgsArr[f].width = FACE_WIDTH; // 输出图像的宽
faceImageArr.imgsArr[f].height = FACE_HEIGHT; // 输出图像的高
faceImageArr.imgsArr[f].channels = FACE_CHANNEL; // 输出
faceImageArr.imgsArr[f].pix_fmt = VNN_PIX_FMT_RGB888; // 格式HWC,RGB
faceImageArr.imgsArr[f].data = _faceBuffer + f * FACE_CHANNEL * FACE_HEIGHT * FACE_WIDTH; // 对应Buffer的首地址
}
VNN_Apply_Stylizing_CPU(_handle, &input, &faceArr, &faceImageArr);
说明: 不再使用SDK,释放内存等资源
VNN_Result VNN_Destroy_Stylizing(VNNHandle* handle)
参数 | 含义 |
---|---|
handle | SDK实例索引,成功释放资源后将被修改为0(无效值),类型为VNN_Handle*,输入&输出 |
返回值: VNN_Result,具体值参见 状态码表
调用示例:
VNN_Result ret = VNN_Destory_Stylizing(&_handle);
// VNN_Result ret = VNN_Destory_Face(&_handle_face); // 如不再使用人脸关键点检测SDK,也一并释放资源
说明: 设定SDK实例的运行参数
VNN_Result VNN_Set_Stylizing_Attr( VNNHandle handle, const char * name, const void * value )
参数 | 含义 |
---|---|
handle | SDK实例索引,类型为VNN_Handle,输入 |
name | 属性名,类型const char*,输入 |
value | 属性值,类型参见下表,输入 |
合法属性名和属性值
属性名 | 属性含义 | 属性值 | 属性值类型 |
---|---|---|---|
暂时为空 |
返回值: VNN_Result,具体值参见 状态码表
调用示例:
// 暂时为空
说明: 获取SDK实例的运行参数
VNN_Result VNN_Get_Stylizing_Attr( VNNHandle handle, const char * name, const void * value )
参数 | 含义 |
---|---|
handle | SDK实例索引,类型为VNN_Handle,输入 |
name | 属性名,类型const char*,输入 |
value | 属性值,类型参见下表,输出 |
合法属性名和属性值
属性名 | 属性含义 | 属性值 | 属性值类型 |
---|---|---|---|
_Mask | 对应各张人脸的Mask | 类型为unsigned char,人脸附近区域数值为255,非人脸附近区域数值为0 | VNN_ImageArr* |
返回值: VNN_Result,具体值参见 状态码表
调用示例:
// 获取对应的Mask
#define MASK_CHANNEL (1)
#define MASK_HEIGHT (512)
#define MASK_WIDTH (512)
if (!_maskBuffer) {
// 按最大支持人脸数申请Buffer
_maskBuffer = (unsigned char *) malloc(MASK_CHANNEL * MASK_HEIGHT * MASK_WIDTH * VNN_FRAMEDATAARR_MAX_FACES_NUM);
}
VNN_ImageArr faceMaskArr;
faceMaskArr.imgsNum = faceArr.facesNum;
// 按实际检测出的人脸数设置输出对象
for (int f = 0; f < faceArr.facesNum; f++) {
faceMaskDataArr.imgsArr[f].width = MASK_WIDTH;
faceMaskDataArr.imgsArr[f].height = MASK_HEIGHT;
faceMaskDataArr.imgsArr[f].channels = MASK_CHANNEL;
faceMaskDataArr.imgsArr[f].pix_fmt = VNN_PIX_FMT_GRAY8;
faceMaskDataArr.imgsArr[f].data = _maskBuffer + f * MASK_CHANNEL * MASK_HEIGHT * MASK_WIDTH;
}
VNN_Get_Stylizing_Attr(_handle, "_Mask", &faceMaskArr);
参考 链接
版本 | 日期 | 更新说明 |
---|---|---|
v1.0.0 | 2021.12.07 | 初次发布 |