1 数据结构
1.1 ASF_VERSION
功能描述:
版本信息;
定义:
typedef struct {
MPChar Version; // 版本号
MPChar BuildDate; // 构建日期
MPChar CopyRight; // 版权说明
}ASF_VERSION;
1.2 ASF_SingleFaceInfo
类描述:
单人脸信息;
定义:
typedef struct {
MRECT faceRect; // 人脸框
MInt32 faceOrient; //人脸角度
} ASF_SingleFaceInfo, *LPASF_SingleFaceInfo;
1.3 ASF_MultiFaceInfo
类描述:
多人脸信息;
定义:
typedef struct {
MRECT* faceRect; // 人脸框数组
MInt32* faceOrient; // 人脸角度数组
MInt32 faceNum; // 检测到的人脸个数
}ASF_MultiFaceInfo, *LPASF_MultiFaceInfo;
1.4 ASF_FaceFeature
功能描述:
人脸特征;
定义:
typedef struct {
MByte* feature; // 人脸特征
MInt32 featureSize; // 人脸特征长度
}ASF_FaceFeature, *LPASF_FaceFeature;
1.5 ASF_AgeInfo
功能描述:
年龄信息;
定义:
typedef struct{
MInt32* ageArray; // 0代表未知,大于0的数值即检测的年龄结果
MInt32 num; // 检测的人脸个数
}ASF_AgeInfo, *LPASF_AgeInfo;
1.6 ASF_GenderInfo
功能描述:
性别信息;
定义:
typedef struct{
MInt32* genderArray; // 0表示男性,1表示女性,-1表示未知
MInt32 num; // 检测的人脸个数
}ASF_GenderInfo, *LPASF_GenderInfo;
1.7 ASF_Face3DAngle
功能描述:
3D角度信息;
定义:
typedef struct{
MFloat* roll; //横滚角
MFloat* yaw; //偏航角
MFloat* pitch; //俯仰角
MInt32* status; //0: 正常,其他数值:出错
MInt32 num; //检测的人脸个数
}ASF_Face3DAngle, *LPASF_Face3DAngle;
1.8 ASF_LivenessInfo
功能描述:
活体信息;
定义:
typedef struct
{
MInt32* isLive; // [out] 判断是否真人, 0:非真人;
// 1:真人;
// -1:不确定;
// -2:传入人脸数>1;
MInt32 num;
}ASF_LivenessInfo, *LPASF_LivenessInfo;
2. 接口
2.1 接口说明
2.1.1 ASFActivation
原型
MRESULT ASFActivation(
MPChar AppId,
MPChar SDKKey
);
功能描述
激活SDK。
参数 | 出/入参 | 说明 |
---|---|---|
AppId | [in] | 官网获取的APPID |
SDKKey | [in] | 官网获取的SDKKEY |
返回值
成功返回MOK或MERR_ASF_ALREADY_ACTIVATED,否则返回失败codes。
2.1.2 ASFInitEngine
原型
MRESULT ASFInitEngine(
MLong detectMode,
ASF_OrientPriority detectFaceOrientPriority,
MInt32 detectFaceScaleVal,
MInt32 detectFaceMaxNum,
MInt32 combinedMask,
MHandle* hEngine
);
功能描述
初始化引擎。
参数 | 出/入参 | 说明 |
---|---|---|
detectMode | [in] | VIDEO模式/IMAGE模式VIDEO模式:处理连续帧的图像数据,并返回检测结果,需要将所有图像帧的数据都传入接口进行处理;IMAGE模式:处理单帧的图像数据,并返回检测结果 |
detectFaceOrientPriority | [in] | 检测脸部的角度优先值,推荐仅检测单一角度,效果更优 |
detectFaceScaleVal | [in] | 用于数值化表示的最小人脸尺寸,该尺寸代表人脸尺寸相对于图片长边的占比。video 模式有效值范围[2,16], Image 模式有效值范围[2,32]推荐值为 16 |
detectFaceMaxNum | [in] | 最大需要检测的人脸个数[1-50] |
combinedMask | [in] | 用户选择需要检测的功能组合,可单个或多个 |
hEngine | [out] | 初始化返回的引擎handle |
返回值
成功返回MOK,否则返回失败codes。
2.1.3 ASFDetectFaces
原型
MRESULT ASFDetectFaces(
MHandle hEngine,
MInt32 width,
MInt32 height,
MInt32 format,
MUInt8* imgData,
LPASF_MultiFaceInfo detectedFaces
);
功能描述
人脸检测。
参数 | 出/入参 | 说明 |
---|---|---|
hEngine | [in] | 引擎handle |
width | [in] | 图片宽度为4的倍数且大于0 |
height | [in] | YUYV/I420/NV21/NV12格式的图片高度为2的倍数,BGR24格式的图片高度不限制 |
format | [in] | 颜色空间格式 |
imgData | [in] | 图片数据 |
detectedFaces | [out] | 检测到的人脸信息 |
返回值
成功返回MOK,否则返回失败codes。
2.1.4 ASFFaceFeatureExtract
原型
MRESULT ASFFaceFeatureExtract(
MHandle hEngine,
MInt32 width,
MInt32 height,
MInt32 format,
MUInt8* imgData,
LPASF_SingleFaceInfo faceInfo,
LPASF_FaceFeature feature
);
功能描述
单人脸特征提取。
参数 | 出/入参 | 说明 |
---|---|---|
hEngine | [in] | 引擎handle |
width | [in] | 图片宽度为4的倍数且大于0 |
height | [in] | YUYV/I420/NV21/NV12格式的图片高度为2的倍数,BGR24格式的图片高度不限制 |
format | [in] | 颜色空间格式 |
imgData | [in] | 图片数据 |
faceInfo | [in] | 单张人脸位置和角度信息 |
feature | [out] | 人脸特征 |
返回值
成功返回MOK,否则返回失败codes。
2.1.5 ASFFaceFeatureCompare
原型
MRESULT ASFFaceFeatureCompare(
MHandle hEngine,
LPASF_FaceFeature feature1,
LPASF_FaceFeature feature2,
MFloat* confidenceLevel
);
功能描述
人脸特征比对。
参数 | 出/入参 | 说明 |
---|---|---|
hEngine | [in] | 引擎handle |
feature1 | [in] | 待比对的人脸特征 |
feature2 | [in] | 待比对的人脸特征 |
confidenceLevel | [out] | 比对结果,置信度数值 |
返回值
成功返回MOK,否则返回失败codes。
2.1.6 ASFProcess
原型
MRESULT ASFProcess(
MHandle hEngine,
MInt32 width,
MInt32 height,
MInt32 format,
MUInt8* imgData,
LPASF_MultiFaceInfo detectedFaces,
MInt32 combinedMask
);
功能描述
人脸信息检测(年龄/性别/人脸3D角度/活体),最多支持4张人脸信息检测,超过部分返回未知(活体仅支持单张人脸检测,超出返回未知)。
参数 | 出/入参 | 说明 |
---|---|---|
hEngine | [in] | 引擎handle |
width | [in] | 图片宽度为4的倍数且大于0 |
height | [in] | YUYV/I420/NV21/NV12格式的图片高度为2的倍数,BGR24格式的图片高度不限制 |
format | [in] | 颜色空间格式 |
imgData | [in] | 图片数据 |
detectedFaces | [in] | 检测到的人脸信息 |
combinedMask | [in] | 初始化中参数combinedMask与ASF_AGE |
返回值
成功返回MOK,否则返回失败codes。
2.1.7 ASFGetAge
原型
MRESULT ASFGetAge(
MHandle hEngine,
LPASF_AgeInfo ageInfo
);
功能描述
获取年龄信息。
参数 | 出/入参 | 说明 |
---|---|---|
hEngine | [in] | 引擎handle |
ageInfo | [out] | 检测到的年龄信息 |
返回值
成功返回MOK,否则返回失败codes。
2.1.8 ASFGetGender
原型
MRESULT ASFGetGender(
MHandle hEngine,
LPASF_GenderInfo genderInfo
);
功能描述
获取性别信息。
参数 | 出/入参 | 说明 |
---|---|---|
hEngine | [in] | 引擎handle |
genderInfo | [out] | 检测到的性别信息 |
返回值
成功返回MOK,否则返回失败codes。
2.1.9 ASFGetFace3DAngle
原型
MRESULT ASFGetFace3DAngle(
MHandle hEngine,
LPASF_Face3DAngle p3DAngleInfo
);
功能描述
获取3D角度信息。
参数 | 出/入参 | 说明 |
---|---|---|
hEngine | [in] | 引擎handle |
p3DAngleInfo | [out] | 检测到脸部3D 角度信息 |
返回值
成功返回MOK,否则返回失败codes。
2.1.10 ASFGetLivenessScore
原型
MRESULT ASFGetLivenessScore(
MHandle hEngine,
LPASF_LivenessInfo livenessInfo
);
功能描述
获取活体信息。
参数 | 出/入参 | 说明 |
---|---|---|
hEngine | [in] | 引擎handle |
livenessInfo | [out] | 检测到的活体信息 |
返回值
成功返回MOK,否则返回失败codes。
2.1.11 ASFGetVersion
原型
const ASF_VERSION* ASFGetVersion(
MHandle hEngine
);
功能描述
获取版本信息。
参数 | 出/入参 | 说明 |
---|---|---|
hEngine | [in] | 引擎handle |
返回值
成功返回版本信息,否则返回MNull。
2.1.12 ASFUninitEngine
原型
MRESULT ASFUninitEngine(
MHandle hEngine
);
功能描述
销毁引擎。
参数 | 出/入参 | 说明 |
---|---|---|
hEngine | [in] | 引擎handle |
返回值
成功返回MOK,否则返回失败codes。
2.2 错误码概览
错误码名 | 十六进制 | 十进制 | 错误码说明 |
---|---|---|---|
MOK | 0 | 0 | 成功 |
MERR_UNKNOWN | 1 | 1 | 错误原因不明 |
MERR_INVALID_PARAM | 2 | 2 | 无效的参数 |
MERR_UNSUPPORTED | 3 | 3 | 引擎不支持 |
MERR_NO_MEMORY | 4 | 4 | 内存不足 |
MERR_BAD_STATE | 5 | 5 | 状态错误 |
MERR_USER_CANCEL | 6 | 6 | 用户取消相关操作 |
MERR_EXPIRED | 7 | 7 | 操作时间过期 |
MERR_USER_PAUSE | 8 | 8 | 用户暂停操作 |
MERR_BUFFER_OVERFLOW | 9 | 9 | 缓冲上溢 |
MERR_BUFFER_UNDERFLOW | A | 10 | 缓冲下溢 |
MERR_NO_DISKSPACE | B | 11 | 存贮空间不足 |
MERR_COMPONENT_NOT_EXIST | C | 12 | 组件不存在 |
MERR_GLOBAL_DATA_NOT_EXIST | D | 13 | 全局数据不存在 |
MERR_FSDK_INVALID_APP_ID | 7001 | 28673 | 无效的AppId |
MERR_FSDK_INVALID_SDK_ID | 7002 | 28674 | 无效的SDKkey |
MERR_FSDK_INVALID_ID_PAIR | 7003 | 28675 | AppId和SDKKey不匹配 |
MERR_FSDK_MISMATCH_ID_AND_SDK | 7004 | 28676 | SDKKey和使用的SDK不匹配 |
MERR_FSDK_SYSTEM_VERSION_UNSUPPORTED | 7005 | 28677 | 系统版本不被当前SDK所支持 |
MERR_FSDK_LICENCE_EXPIRED | 7006 | 28678 | SDK有效期过期,需要重新下载更新 |
MERR_FSDK_FR_INVALID_MEMORY_INFO | 12001 | 73729 | 无效的输入内存 |
MERR_FSDK_FR_INVALID_IMAGE_INFO | 12002 | 73730 | 无效的输入图像参数 |
MERR_FSDK_FR_INVALID_FACE_INFO | 12003 | 73731 | 无效的脸部信息 |
MERR_FSDK_FR_NO_GPU_AVAILABLE | 12004 | 73732 | 当前设备无GPU可用 |
MERR_FSDK_FR_MISMATCHED_FEATURE_LEVEL | 12005 | 73733 | 待比较的两个人脸特征的版本不一致 |
MERR_FSDK_FACEFEATURE_UNKNOWN | 14001 | 81921 | 人脸特征检测错误未知 |
MERR_FSDK_FACEFEATURE_MEMORY | 14002 | 81922 | 人脸特征检测内存错误 |
MERR_FSDK_FACEFEATURE_INVALID_FORMAT | 14003 | 81923 | 人脸特征检测格式错误 |
MERR_FSDK_FACEFEATURE_INVALID_PARAM | 14004 | 81924 | 人脸特征检测参数错误 |
MERR_FSDK_FACEFEATURE_LOW_CONFIDENCE_LEVEL | 14005 | 81925 | 人脸特征检测结果置信度低 |
MERR_ASF_EX_FEATURE_UNSUPPORTED_ON_INIT | 15001 | 86017 | Engine不支持的检测属性 |
MERR_ASF_EX_FEATURE_UNINITED | 15002 | 86018 | 需要检测是属性未初始化 |
MERR_ASF_EX_FEATURE_UNPROCESSED | 15003 | 86019 | 待获取的属性未在process中处理过 |
MERR_ASF_EX_FEATURE_UNSUPPORTED_ON_PROCESS | 15004 | 86020 | PROCESS不支持的检测属性,例如FR,有自己独立的处理函数 |
MERR_ASF_EX_INVALID_IMAGE_INFO | 15005 | 86021 | 无效的输入图像 |
MERR_ASF_EX_INVALID_FACE_INFO | 15006 | 86022 | 无效的脸部信息 |
MERR_ASF_ACTIVATION_FAIL | 16001 | 90113 | SDK激活失败,请打开读写权限 |
MERR_ASF_ALREADY_ACTIVATED | 16002 | 90114 | SDK已激活 |
MERR_ASF_NOT_ACTIVATED | 16003 | 90115 | SDK未激活 |
MERR_ASF_SCALE_NOT_SUPPORT | 16004 | 90116 | detectFaceScaleVal不支持 |
MERR_ASF_VERION_MISMATCH | 16005 | 90117 | SDK版本不匹配 |
MERR_ASF_DEVICE_MISMATCH | 16006 | 90118 | 设备不匹配 |
MERR_ASF_UNIQUE_IDENTIFIER_MISMATCH | 16007 | 90119 | 唯一标识不匹配 |
MERR_ASF_PARAM_NULL | 16008 | 90120 | 参数为空 |
MERR_ASF_LIVENESS_EXPIRED | 16009 | 90121 | 活体检测功能已过期 |
MERR_ASF_VERSION_NOT_SUPPORT | 1600A | 90122 | 版本不支持 |
MERR_ASF_SIGN_ERROR | 1600B | 90123 | 签名错误 |
MERR_ASF_DATABASE_ERROR | 1600C | 90124 | 数据库插入错误 |
MERR_ASF_UNIQUE_CHECKOUT_FAIL | 1600D | 90125 | 唯一标识符校验失败 |
MERR_ASF_COLOR_SPACE_NOT_SUPPORT | 1600E | 90126 | 颜色空间不支持 |
MERR_ASF_IMAGE_WIDTH_HEIGHT_NOT_SUPPORT | 1600F | 90127 | 图片宽度或高度不支持 |
MERR_ASF_READ_PHONE_STATE_DENIED | 16010 | 90128 | android.permission.READ_PHONE_STATE权限被拒绝 |
MERR_ASF_ACTIVATION_DATA_DESTROYED | 16011 | 90129 | 激活数据被破坏,请删除激活文件,重新进行激活 |
MERR_ASF_SERVER_UNKNOWN_ERROR | 16012 | 90130 | 服务端未知错误 |
MERR_ASF_INTERNET_DENIED | 16013 | 90131 | INTERNET权限被拒绝 |
MERR_ASF_ACTIVEFILE_SDK_MISMATCH | 16014 | 90132 | 激活文件与SDK版本不匹配,请重新激活 |
MERR_ASF_DEVICEINFO_LESS | 16015 | 90133 | 设备信息太少,不足以生成设备指纹 |
MERR_ASF_REQUEST_TIMEOUT | 16016 | 90134 | 客户端时间与服务器时间(即北京时间)前后相差在30分钟之内 |
MERR_ASF_APPID_DATA_DECRYPT | 16017 | 90135 | 服务端解密失败 |
MERR_ASF_APPID_APPKEY_SDK_MISMATCH | 16018 | 90136 | 传入的AppId和AppKey与使用的SDK版本不一致 |
MERR_ASF_NO_REQUEST | 16019 | 90137 | 短时间大量请求会被禁止请求,30分钟之后会解封 |
MERR_ASF_NETWORK_COULDNT_RESOLVE_HOST | 17001 | 94209 | 无法解析主机地址 |
MERR_ASF_NETWORK_COULDNT_CONNECT_SERVER | 17002 | 94210 | 无法连接服务器 |
MERR_ASF_NETWORK_CONNECT_TIMEOUT | 17003 | 94211 | 网络连接超时 |
MERR_ASF_NETWORK_UNKNOWN_ERROR | 17004 | 94212 | 网络未知错误 |
MERR_ASF_ACTIVEKEY_COULDNT_CONNECT_SERVER | 18001 | 98305 | 无法连接激活码服务器 |
MERR_ASF_ACTIVEKEY_SERVER_SYSTEM_ERROR | 18002 | 98306 | 服务器系统错误 |
MERR_ASF_ACTIVEKEY_POST_PARM_ERROR | 18003 | 98307 | 请求参数错误 |
MERR_ASF_ACTIVEKEY_PARM_MISMATCH | 18004 | 98308 | 激活码正确,且未被使用,但和传入的APPID及APPKEY不匹配 |
MERR_ASF_ACTIVEKEY_ACTIVEKEY_ACTIVATED | 18005 | 98309 | 传入的KEY值虽然正确,但此KEY已经被激活 |
MERR_ASF_ACTIVEKEY_ACTIVEKEY_FORMAT_ERROR | 18006 | 98310 | KEY格式不对,一般来说是KEY错误或者未传入KEY值 |
MERR_ASF_ACTIVEKEY_APPID_PARM_MISMATCH | 18007 | 98311 | 激活码正确,被使用,但传入的APPID不匹配 |
MERR_ASF_ACTIVEKEY_PAYSDK_FREEFILE_MISMATCH | 18008 | 98312 | 付费版sdk不能使用免费版本的激活文件 |
2.3 示例代码
#include "arcsoft_face_sdk.h"
#include "amcomdef.h"
#include "asvloffscreen.h"
#include "merror.h"
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define APPID "官网下载的APPID"
#define SDKKey "官网下载的SDKKey"
#define NSCALE "nscale值,IMAGE模式下2-32,video模式下2-16,推荐值16"
#define FACENUM "检测的人脸数"
#define SafeFree(p) { if ((p)) free(p); (p) = NULL; }
#define SafeArrayDelete(p) { if ((p)) delete [] (p); (p) = NULL; }
#define SafeDelete(p) { if ((p)) delete (p); (p) = NULL; }
int main()
{
//激活SDK
MRESULT res = ASFActivation(APPID, SDKKey);
if (MOK != res && MERR_ASF_ALREADY_ACTIVATED != res)
printf("ASFActivation fail: %d\n", res);
else
printf("ASFActivation sucess: %d\n", res);
//初始化引擎
MHandle handle = NULL;
MInt32 mask = ASF_FACE_DETECT | ASF_FACERECOGNITION | ASF_AGE | ASF_GENDER | ASF_FACE3DANGLE | ASF_LIVENESS;
res = ASFInitEngine(ASF_DETECT_MODE_IMAGE, ASF_OP_0_ONLY, NSCALE, FACENUM, mask, &handle);
if (res != MOK)
printf("ASFInitEngine fail: %d\n", res);
else
printf("ASFInitEngine sucess: %d\n", res);
char* picPath1 = "图片路径,采用bgr24格式图片";
int Width1 = 图片宽度;
int Height1 = 图片高度;
int Format1 = ASVL_PAF_RGB24_B8G8R8;
MUInt8* imageData1 = (MUInt8*)malloc(Height1*Width1*3);
FILE* fp1 = fopen(picPath1, "rb");
char* picPath2 = "图片路径,采用bgr24格式图片";
int Width2 = 图片宽度;
int Height2 = 图片高度;
int Format2 = ASVL_PAF_RGB24_B8G8R8;
MUInt8* imageData2 = (MUInt8*)malloc(Height2*Width2*3);
FILE* fp2 = fopen(picPath2, "rb");
if (fp1 && fp2)
{
fread(imageData1, 1, Height1*Width1*3, fp1); //读图片数据
fclose(fp1);
fread(imageData2, 1, Height2*Width2*3, fp2); //读图片数据
fclose(fp2);
// 人脸检测
ASF_MultiFaceInfo detectedFaces1 = { 0 };
ASF_SingleFaceInfo SingleDetectedFaces = { 0 };
ASF_FaceFeature feature1 = { 0 };
ASF_FaceFeature copyfeature1 = { 0 };
res = ASFDetectFaces(handle, Width1, Height1, ASVL_PAF_RGB24_B8G8R8, imageData1, &detectedFaces1);
if (res != MOK)
printf("%s ASFDetectFaces fail: %d\n", picPath1, res);
else
{
printf("%s ASFDetectFaces sucess: %d\n", picPath1, res);
SingleDetectedFaces.faceRect.left = detectedFaces1.faceRect[0].left;
SingleDetectedFaces.faceRect.top = detectedFaces1.faceRect[0].top;
SingleDetectedFaces.faceRect.right = detectedFaces1.faceRect[0].right;
SingleDetectedFaces.faceRect.bottom = detectedFaces1.faceRect[0].bottom;
SingleDetectedFaces.faceOrient = detectedFaces1.faceOrient[0];
}
// 单人脸特征提取
res = ASFFaceFeatureExtract(handle, Width1, Height1, ASVL_PAF_RGB24_B8G8R8, imageData1, &SingleDetectedFaces, &feature1);
if (res != MOK)
printf("%s ASFFaceFeatureExtract fail: %d\n", picPath1, res);
else
{
printf("%s ASFFaceFeatureExtract 1 sucess: %d\n", picPath1, res);
//拷贝feature,否则第二次进行特征提取,会覆盖第一次特征提取的数据,导致比对的结果为1
copyfeature1.featureSize = feature1.featureSize;
copyfeature1.feature = (MByte *)malloc(feature1.featureSize);
memset(copyfeature1.feature, 0, feature1.featureSize);
memcpy(copyfeature1.feature, feature1.feature, feature1.featureSize);
}
ASF_MultiFaceInfo detectedFaces2 = { 0 };
ASF_FaceFeature feature2 = { 0 };
res = ASFDetectFaces(handle, Width2, Height2, ASVL_PAF_RGB24_B8G8R8, imageData2, &detectedFaces2);
if (res != MOK)
printf("%s ASFDetectFaces fail: %d\n", picPath2, res);
else
{
printf("%s ASFDetectFaces sucess: %d\n", picPath2, res);
SingleDetectedFaces.faceRect.left = detectedFaces2.faceRect[0].left;
SingleDetectedFaces.faceRect.top = detectedFaces2.faceRect[0].top;
SingleDetectedFaces.faceRect.right = detectedFaces2.faceRect[0].right;
SingleDetectedFaces.faceRect.bottom = detectedFaces2.faceRect[0].bottom;
SingleDetectedFaces.faceOrient = detectedFaces2.faceOrient[0];
}
res = ASFFaceFeatureExtract(handle, Width2, Height2, ASVL_PAF_RGB24_B8G8R8, imageData2, &SingleDetectedFaces, &feature2);
if (res != MOK)
printf("%s ASFFaceFeatureExtract fail: %d\n", picPath2, res);
else
printf("%s ASFFaceFeatureExtract sucess: %d\n", picPath2, res);
// 单人脸特征比对
MFloat confidenceLevel;
res = ASFFaceFeatureCompare(handle, ©feature1, &feature2, &confidenceLevel);
if (res != MOK)
printf("ASFFaceFeatureCompare fail: %d\n", res);
else
printf("ASFFaceFeatureCompare sucess: %lf\n", confidenceLevel);
// 人脸信息检测
MInt32 lastMask = ASF_AGE | ASF_GENDER | ASF_FACE3DANGLE | ASF_LIVENESS;
res = ASFProcess(handle, Width2, Height2, ASVL_PAF_RGB24_B8G8R8, imageData2, &detectedFaces2, lastMask);
if (res != MOK)
printf("ASFProcess fail: %d\n", res);
else
printf("ASFProcess sucess: %d\n", res);
// 获取年龄
ASF_AgeInfo ageInfo = { 0 };
res = ASFGetAge(handle, &ageInfo);
if (res != MOK)
printf("%s ASFGetAge fail: %d\n", picPath2, res);
else
printf("%s ASFGetAge sucess: %d First face age: %d\n", picPath2, res, ageInfo.ageArray[0]);
// 获取性别
ASF_GenderInfo genderInfo = { 0 };
res = ASFGetGender(handle, &genderInfo);
if (res != MOK)
printf("%s ASFGetGender fail: %d\n", picPath2, res);
else
printf("%s ASFGetGender sucess: %d First face gender: %d\n", picPath2, res, genderInfo.genderArray[0]);
// 获取3D角度
ASF_Face3DAngle angleInfo = { 0 };
res = ASFGetFace3DAngle(handle, &angleInfo);
if (res != MOK)
printf("%s ASFGetFace3DAngle fail: %d\n", picPath2, res);
else
printf("%s ASFGetFace3DAngle sucess: %d First face 3dAngle: roll: %lf yaw: %lf pitch: %lf\n", picPath2, res, angleInfo.roll[0], angleInfo.yaw[0], angleInfo.pitch[0]);
//获取活体信息
ASF_LivenessInfo livenessInfo = { 0 };
res = ASFGetLivenessScore(handle, &livenessInfo);
if (res != MOK)
printf("ASFGetLivenessScore fail: %d\n", res);
else
printf("ASFGetLivenessScore sucess: %d\n", livenessInfo.isLive[0]);
SafeFree(copyfeature1.feature); //释放内存
SafeArrayDelete(imageData1);
SafeArrayDelete(imageData2);
//获取版本信息
const ASF_VERSION* pVersionInfo = ASFGetVersion(handle);
//销毁引擎
res = ASFUninitEngine(handle);
if (res != MOK)
printf("ALUninitEngine fail: %d\n", res);
else
printf("ALUninitEngine sucess: %d\n", res);
}
else{
printf("No pictures found.\n");
}
getchar();
return 0;
}