ArcSoft ArcFace SDK Linux 平台 API 文档 V2.2
1 数据结构与枚举
1.1 数据结构
1.1.1 ASF_VERSION
结构体描述:
SDK版本信息
定义:
typedef struct {
MPChar Version; // 版本号
MPChar BuildDate; // 构建日期
MPChar CopyRight; // 版权说明
}ASF_VERSION;
1.1.2 ASF_ActiveFileInfo
结构体描述:
激活文件信息
定义:
typedef struct{
MPChar startTime; //SDK开始时间
MPChar endTime; //SDK截止时间
MPChar platform; //平台版本
MPChar sdkType; //SDK类型
MPChar appId; //APPID
MPChar sdkKey; //SDKKEY
MPChar sdkVersion; //SDK版本号
MPChar fileVersion; //激活文件版本号
}ASF_ActiveFileInfo, *LPASF_ActiveFileInfo;
1.1.3 ASF_SingleFaceInfo
结构体描述:
单人脸信息
定义:
typedef struct {
MRECT faceRect; // 人脸框
MInt32 faceOrient; //人脸角度
} ASF_SingleFaceInfo, *LPASF_SingleFaceInfo;
1.1.4 ASF_MultiFaceInfo
结构体描述:
多人脸信息
定义:
typedef struct {
MRECT* faceRect; // 人脸框数组
MInt32* faceOrient; // 人脸角度数组
MInt32 faceNum; // 检测到的人脸个数
MInt32* faceID; //在VIDEO模式下有效,IMAGE模式下为空
}ASF_MultiFaceInfo, *LPASF_MultiFaceInfo;
1.1.5 ASF_FaceFeature
结构体描述:
人脸特征
定义:
typedef struct {
MByte* feature; // 人脸特征
MInt32 featureSize; // 人脸特征长度
}ASF_FaceFeature, *LPASF_FaceFeature;
1.1.6 ASF_AgeInfo
结构体描述:
年龄信息
定义:
typedef struct{
MInt32* ageArray; // 0:未知; >0:年龄
MInt32 num; // 检测的人脸个数
}ASF_AgeInfo, *LPASF_AgeInfo;
1.1.7 ASF_GenderInfo
结构体描述:
性别信息
定义:
typedef struct{
MInt32* genderArray; // 0:男性; 1:女性; -1:未知
MInt32 num; // 检测的人脸个数
}ASF_GenderInfo, *LPASF_GenderInfo;
1.1.8 ASF_Face3DAngle
结构体描述:
3D角度信息
定义:
typedef struct{
MFloat* roll; //横滚角
MFloat* yaw; //偏航角
MFloat* pitch; //俯仰角
MInt32* status; //0:正常; 非0:异常
MInt32 num; //检测的人脸个数
}ASF_Face3DAngle, *LPASF_Face3DAngle;
1.1.9 ASF_LivenessThreshold
结构体描述:
活体置信度
定义:
typedef struct{
MFloat thresholdmodel_BGR; //RGB活体置信度
MFloat thresholdmodel_IR; //IR活体置信度
}ASF_LivenessThreshold, *LPASF_LivenessThreshold;
1.1.10 ASF_LivenessInfo
结构体描述:
活体信息
定义:
typedef struct{
MInt32* isLive; //0:非真人; 1:真人; -1:不确定; -2:传入人脸数>1
MInt32 num; //检测的人脸个数
}ASF_LivenessInfo, *LPASF_LivenessInfo;
2 枚举
2.1 人脸检测方向
根据应用场景,推荐选择单一角度,检测效果更优;
enum ArcSoftFace_OrientPriority {
ASF_OP_0_ONLY = 0x1, // 仅检测0度
ASF_OP_90_ONLY = 0x2, // 仅检测90度
ASF_OP_270_ONLY = 0x3, // 仅检测270度
ASF_OP_180_ONLY = 0x4, // 仅检测180度
ASF_OP_0_HIGHER_EXT = 0x5, // 全角度检测
};
注:IMAGE模式下为了提高检测识别率,不支持ASF_OP_0_HIGHER_EXT检测
2.2 检测到的人脸角度(按逆时针方向)
enum ArcSoftFace_OrientCode {
ASF_OC_0 = 0x1, // 0度
ASF_OC_90 = 0x2, // 90度
ASF_OC_270 = 0x3, // 270度
ASF_OC_180 = 0x4, // 180度
ASF_OC_30 = 0x5, // 30度
ASF_OC_60 = 0x6, // 60度
ASF_OC_120 = 0x7, // 120度
ASF_OC_150 = 0x8, // 150度
ASF_OC_210 = 0x9, // 210度
ASF_OC_240 = 0xa, // 240度
ASF_OC_300 = 0xb, // 300度
ASF_OC_330 = 0xc // 330度
};
3. 接口
3.1 接口说明
3.1.1 ASFGetActiveFileInfo
接口
MRESULT ASFGetActiveFileInfo(
LPASF_ActiveFileInfo activeFileInfo
);
功能描述
获取激活文件信息
参数
名称 | IN/OUT | 说明 |
---|---|---|
activeFileInfo | [out] | 激活文件信息 |
返回值
成功返回MOK,失败详见 3.2错误码列表
3.1.2 ASFOnlineActivation
接口
MRESULT ASFOnlineActivation(
MPChar AppId,
MPChar SDKKey
);
功能描述
用于在线激活SDK
注:
1) 初次使用SDK时需要对SDK先进行激活,激活后无需重复调用;
2) 调用此接口时必须为联网状态,激活成功后即可离线使用;
参数
名称 | IN/OUT | 说明 |
---|---|---|
AppId | [in] | 官网获取的APPID |
SDKKey | [in] | 官网获取的SDKKEY |
返回值
成功返回MOK或MERR_ASF_ALREADY_ACTIVATED,失败详见 3.2错误码列表
3.1.3 ASFActivation
接口
MRESULT ASFActivation(
MPChar AppId,
MPChar SDKKey
);
功能描述
在线激活SDK,与ASFOnlineActivation接口功能相同,首次需要联网激活,生成激活文件之后即可进行本地校验。(ASFOnlineActivation接口做了激活方案的优化,推荐使用ASFOnlineActivation接口)
参数
名称 | IN/OUT | 说明 |
---|---|---|
AppId | [in] | 官网获取的APPID |
SDKKey | [in] | 官网获取的SDKKEY |
返回值
成功返回MOK或MERR_ASF_ALREADY_ACTIVATED,失败详见 3.2错误码列表
3.1.4 ASFInitEngine
接口
MRESULT ASFInitEngine(
MUInt32 detectMode,
ASF_OrientPriority detectFaceOrientPriority,
MInt32 detectFaceScaleVal,
MInt32 detectFaceMaxNum,
MInt32 combinedMask,
MHandle* hEngine
);
功能描述
初始化引擎
参数
名称 | IN/OUT | 说明 |
---|---|---|
detectMode | [in] | VIDEO模式/IMAGE模式 VIDEO模式,:处理连续帧的图像数据 IMAGE模式:,处理单张的图像数据 |
detectFaceOrientPriority | [in] | 人脸检测角度,推荐单一角度检测;IMAGE模式下不支持全角度(ASF_OP_0_HIGHER_EXT)检测 |
detectFaceScaleVal | [in] | 识别的最小人脸比例(图片长边与人脸框长边的比值) VIDEO模式取值范围[2,32],推荐值为16 IMAGE模式取值范围[2,32],推荐值为30 |
detectFaceMaxNum | [in] | 最大需要检测的人脸个数,取值范围[1,50] |
combinedMask | [in] | 需要启用的功能组合,可多选 |
hEngine | [out] | 引擎句柄 |
返回值
成功返回MOK,失败详见 3.2错误码列表
3.1.5 ASFDetectFaces
接口
MRESULT ASFDetectFaces(
MHandle hEngine,
MInt32 width,
MInt32 height,
MInt32 format,
MUInt8* imgData,
LPASF_MultiFaceInfo detectedFaces
);
功能描述
人脸检测
参数
名称 | IN/OUT | 说明 |
---|---|---|
hEngine | [in] | 引擎句柄 |
width | [in] | 图片宽度,为4的倍数 |
height | [in] | 图片高度,YUYV/I420/NV21/NV12格式为2的倍数;BGR24/GRAY/DEPTH_U16格式无限制 |
format | [in] | 颜色空间格式 |
imgData | [in] | 图片数据 |
detectedFaces | [out] | 检测到的人脸信息 |
返回值
成功返回MOK,失败详见 3.2错误码列表
3.1.6 ASFFaceFeatureExtract
接口
MRESULT ASFFaceFeatureExtract(
MHandle hEngine,
MInt32 width,
MInt32 height,
MInt32 format,
MUInt8* imgData,
LPASF_SingleFaceInfo faceInfo,
LPASF_FaceFeature feature
);
功能描述
单人脸特征提取
参数
名称 | IN/OUT | 说明 |
---|---|---|
hEngine | [in] | 引擎句柄 |
width | [in] | 图片宽度,为4的倍数 |
height | [in] | 图片高度,YUYV/I420/NV21/NV12格式为2的倍数;BGR24/GRAY格式无限制 |
format | [in] | 颜色空间格式 |
imgData | [in] | 图片数据 |
faceInfo | [in] | 单张人脸信息 |
feature | [out] | 人脸特征 |
返回值
成功返回MOK,失败详见 3.2错误码列表
3.1.7 ASFFaceFeatureCompare
接口
MRESULT ASFFaceFeatureCompare(
MHandle hEngine,
LPASF_FaceFeature feature1,
LPASF_FaceFeature feature2,
MFloat* confidenceLevel
);
功能描述
人脸特征比对
参数
名称 | IN/OUT | 说明 |
---|---|---|
hEngine | [in] | 引擎句柄 |
feature1 | [in] | 人脸特征值 |
feature2 | [in] | 人脸特征值 |
confidenceLevel | [out] | 比对结果,相似度 |
返回值
成功返回MOK,失败详见 3.2错误码列表
3.1.8 ASFSetLivenessParam
接口
MRESULT ASFSetLivenessParam(
MHandle hEngine,
LPASF_LivenessThreshold threshold
);
功能描述
修改RGB/IR活体阈值,SDK默认RGB:0.75,IR:0.7
参数
名称 | IN/OUT | 说明 |
---|---|---|
hEngine | [in] | 引擎句柄 |
threshold | [in] | 活体置信度,推荐阈值 RGB:0.75, IR:0.7 |
返回值
成功返回MOK,失败详见 3.2错误码列表
3.1.9 ASFProcess
接口
MRESULT ASFProcess(
MHandle hEngine,
MInt32 width,
MInt32 height,
MInt32 format,
MUInt8* imgData,
LPASF_MultiFaceInfo detectedFaces,
MInt32 combinedMask
);
功能描述
人脸信息检测(年龄/性别/人脸3D角度),最多支持4张人脸信息检测,超过部分返回未知(活体仅支持单张人脸检测,超出返回未知),接口不支持IR图像检测。
参数
名称 | IN/OUT | 说明 |
---|---|---|
hEngine | [in] | 引擎句柄 |
width | [in] | 图片宽度,为4的倍数 |
height | [in] | 图片高度,YUYV/I420/NV21/NV12格式为2的倍数,BGR24格式无限制 |
format | [in] | 颜色空间格式 |
imgData | [in] | 图片数据 |
detectedFaces | [in] | 检测到的人脸信息 |
combinedMask | [in] | 检测的属性(ASF_AGE、ASF_GENDER、 ASF_FACE3DANGLE、ASF_LIVENESS),支持多选 |
注:检测的属性须在引擎初始化接口的combinedMask参数中启用
返回值
成功返回MOK,失败详见 3.2错误码列表
3.1.10 ASFProcess_IR
接口
MRESULT ASFProcess_IR(
MHandle hEngine,
MInt32 width,
MInt32 height,
MInt32 format,
MUInt8* imgData,
LPASF_MultiFaceInfo detectedFaces,
MInt32 combinedMask
);
功能描述
IR活体单人脸检测
参数
名称 | IN/OUT | 说明 |
---|---|---|
hEngine | [in] | 引擎句柄 |
width | [in] | 图片宽度,为4的倍数 |
height | [in] | 图片高度,I420/NV21/NV12格式为2的倍数,DEPTH_U16/GRAY格式无限制 |
format | [in] | 颜色空间格式, 支持(I420/NV21/NV12/DEPTH_U16/GRAY)的检测 |
imgData | [in] | 图片数据 |
detectedFaces | [in] | 人脸信息,用户根据待检测的功能选择需要使用的人脸。 |
combinedMask | [in] | 检测的属性(ASF_IR_LIVENESS)。 |
注:检测的属性须在引擎初始化接口的combinedMask参数中启用
返回值
成功返回MOK,失败详见 3.2错误码列表
3.1.11 ASFGetAge
接口
MRESULT ASFGetAge(
MHandle hEngine,
LPASF_AgeInfo ageInfo
);
功能描述
获取年龄信息
参数
名称 | IN/OUT | 说明 |
---|---|---|
hEngine | [in] | 引擎句柄 |
ageInfo | [out] | 检测到的年龄信息 |
返回值
成功返回MOK,失败详见 3.2错误码列表
3.1.12 ASFGetGender
接口
MRESULT ASFGetGender(
MHandle hEngine,
LPASF_GenderInfo genderInfo
);
功能描述
获取性别信息
参数
名称 | IN/OUT | 说明 |
---|---|---|
hEngine | [in] | 引擎句柄 |
genderInfo | [out] | 检测到的性别信息 |
返回值
成功返回MOK,失败详见 3.2错误码列表
3.1.13 ASFGetFace3DAngle
接口
MRESULT ASFGetFace3DAngle(
MHandle hEngine,
LPASF_Face3DAngle p3DAngleInfo
);
功能描述
获取3D角度信息
参数
名称 | IN/OUT | 说明 |
---|---|---|
hEngine | [in] | 引擎句柄 |
p3DAngleInfo | [out] | 检测到脸部3D 角度信息 |
返回值
成功返回MOK,失败详见 3.2错误码列表
3.1.14 ASFGetLivenessScore
接口
MRESULT ASFGetLivenessScore(
MHandle hEngine,
LPASF_LivenessInfo livenessInfo
);
功能描述
获取RGB活体信息
参数
名称 | IN/OUT | 说明 |
---|---|---|
hEngine | [in] | 引擎句柄 |
livenessInfo | [out] | RGB活体信息,详见 2.2.10 ASF_LivenessInfo |
返回值
成功返回MOK,失败详见 3.2错误码列表
3.1.15 ASFGetLivenessScore_IR
接口
MRESULT ASFGetLivenessScore_IR(
MHandle hEngine,
LPASF_LivenessInfo livenessInfo
);
功能描述
获取IR活体信息
参数
名称 | IN/OUT | 说明 |
---|---|---|
hEngine | [in] | 引擎句柄 |
livenessInfo | [out] | IR活体信息,详见 2.2.10 ASF_LivenessInfo |
返回值
成功返回MOK,失败详见 3.2错误码列表
3.1.16 ASFGetVersion
接口
const ASF_VERSION* ASFGetVersion(
MHandle hEngine
);
功能描述
获取版本信息
参数
名称 | IN/OUT | 说明 |
---|---|---|
hEngine | [in] | 引擎句柄 |
返回值
成功返回版本信息,失败返回MNull。
3.1.17 ASFUninitEngine
接口
MRESULT ASFUninitEngine(
MHandle hEngine
);
功能描述
销毁引擎
参数
名称 | IN/OUT | 说明 |
---|---|---|
hEngine | [in] | 引擎句柄 |
返回值
成功返回MOK,失败详见 3.2错误码列表
3.2 错误码列表
错误码名 | 十六进制 | 十进制 | 错误码说明 |
---|---|---|---|
MOK | 0x0 | 0 | 成功 |
MERR_UNKNOWN | 0x1 | 1 | 错误原因不明 |
MERR_INVALID_PARAM | 0x2 | 2 | 无效的参数 |
MERR_UNSUPPORTED | 0x3 | 3 | 引擎不支持 |
MERR_NO_MEMORY | 0x4 | 4 | 内存不足 |
MERR_BAD_STATE | 0x5 | 5 | 状态错误 |
MERR_USER_CANCEL | 0x6 | 6 | 用户取消相关操作 |
MERR_EXPIRED | 0x7 | 7 | 操作时间过期 |
MERR_USER_PAUSE | 0x8 | 8 | 用户暂停操作 |
MERR_BUFFER_OVERFLOW | 0x9 | 9 | 缓冲上溢 |
MERR_BUFFER_UNDERFLOW | 0xA | 10 | 缓冲下溢 |
MERR_NO_DISKSPACE | 0xB | 11 | 存贮空间不足 |
MERR_COMPONENT_NOT_EXIST | 0xC | 12 | 组件不存在 |
MERR_GLOBAL_DATA_NOT_EXIST | 0xD | 13 | 全局数据不存在 |
MERR_FSDK_INVALID_APP_ID | 0x7001 | 28673 | 无效的AppId |
MERR_FSDK_INVALID_SDK_ID | 0x7002 | 28674 | 无效的SDKkey |
MERR_FSDK_INVALID_ID_PAIR | 0x7003 | 28675 | AppId和SDKKey不匹配 |
MERR_FSDK_MISMATCH_ID_AND_SDK | 0x7004 | 28676 | SDKKey和使用的SDK不匹配(注意:调用初始化引擎接口时,请确认激活接口传入的参数,并重新激活) |
MERR_FSDK_SYSTEM_VERSION_UNSUPPORTED | 0x7005 | 28677 | 系统版本不被当前SDK所支持 |
MERR_FSDK_LICENCE_EXPIRED | 0x7006 | 28678 | SDK有效期过期,需要重新下载更新 |
MERR_FSDK_FR_INVALID_MEMORY_INFO | 0x12001 | 73729 | 无效的输入内存 |
MERR_FSDK_FR_INVALID_IMAGE_INFO | 0x12002 | 73730 | 无效的输入图像参数 |
MERR_FSDK_FR_INVALID_FACE_INFO | 0x12003 | 73731 | 无效的脸部信息 |
MERR_FSDK_FR_MISMATCHED_FEATURE_LEVEL | 0x12005 | 73733 | 待比较的两个人脸特征的版本不一致 |
MERR_FSDK_FACEFEATURE_UNKNOWN | 0x14001 | 81921 | 人脸特征检测错误未知 |
MERR_FSDK_FACEFEATURE_MEMORY | 0x14002 | 81922 | 人脸特征检测内存错误 |
MERR_FSDK_FACEFEATURE_INVALID_FORMAT | 0x14003 | 81923 | 人脸特征检测格式错误 |
MERR_FSDK_FACEFEATURE_INVALID_PARAM | 0x14004 | 81924 | 人脸特征检测参数错误 |
MERR_FSDK_FACEFEATURE_LOW_CONFIDENCE_LEVEL | 0x14005 | 81925 | 人脸特征检测结果置信度低 |
MERR_ASF_EX_FEATURE_UNSUPPORTED_ON_INIT | 0x15001 | 86017 | Engine不支持的检测属性 |
MERR_ASF_EX_FEATURE_UNINITED | 0x15002 | 86018 | 需要检测的属性未初始化 |
MERR_ASF_EX_FEATURE_UNPROCESSED | 0x15003 | 86019 | 待获取的属性未在process中处理过 |
MERR_ASF_EX_FEATURE_UNSUPPORTED_ON_PROCESS | 0x15004 | 86020 | PROCESS不支持的检测属性,例如FR,有自己独立的处理函数 |
MERR_ASF_EX_INVALID_IMAGE_INFO | 0x15005 | 86021 | 无效的输入图像 |
MERR_ASF_EX_INVALID_FACE_INFO | 0x15006 | 86022 | 无效的脸部信息 |
MERR_ASF_ACTIVATION_FAIL | 0x16001 | 90113 | SDK激活失败,请打开读写权限 |
MERR_ASF_ALREADY_ACTIVATED | 0x16002 | 90114 | SDK已激活 |
MERR_ASF_NOT_ACTIVATED | 0x16003 | 90115 | SDK未激活 |
MERR_ASF_SCALE_NOT_SUPPORT | 0x16004 | 90116 | detectFaceScaleVal不支持 |
MERR_ASF_ACTIVEFILE_SDKTYPE_MISMATCH | 0x16005 | 90117 | 激活文件与SDK类型不匹配,请确认使用的sdk |
MERR_ASF_DEVICE_MISMATCH | 0x16006 | 90118 | 设备不匹配 |
MERR_ASF_UNIQUE_IDENTIFIER_ILLEGAL | 0x16007 | 90119 | 唯一标识不合法 |
MERR_ASF_PARAM_NULL | 0x16008 | 90120 | 参数为空 |
MERR_ASF_VERSION_NOT_SUPPORT | 0x1600A | 90122 | 版本不支持 |
MERR_ASF_SIGN_ERROR | 0x1600B | 90123 | 签名错误 |
MERR_ASF_DATABASE_ERROR | 0x1600C | 90124 | 激活信息保存异常 |
MERR_ASF_UNIQUE_CHECKOUT_FAIL | 0x1600D | 90125 | 唯一标识符校验失败 |
MERR_ASF_COLOR_SPACE_NOT_SUPPORT | 0x1600E | 90126 | 颜色空间不支持 |
MERR_ASF_IMAGE_WIDTH_HEIGHT_NOT_SUPPORT | 0x1600F | 90127 | 图片宽高不支持,宽度需四字节对齐 |
MERR_ASF_ACTIVATION_DATA_DESTROYED | 0x16011 | 90129 | 激活数据被破坏,请删除激活文件,重新进行激活 |
MERR_ASF_SERVER_UNKNOWN_ERROR | 0x16012 | 90130 | 服务端未知错误 |
MERR_ASF_ACTIVEFILE_SDK_MISMATCH | 0x16014 | 90132 | 激活文件与SDK版本不匹配,请重新激活 |
MERR_ASF_DEVICEINFO_LESS | 0x16015 | 90133 | 设备信息太少,不足以生成设备指纹 |
MERR_ASF_REQUEST_TIMEOUT | 0x16016 | 90134 | 客户端时间与服务器时间(即北京时间)前后相差在30分钟以上 |
MERR_ASF_APPID_DATA_DECRYPT | 0x16017 | 90135 | 数据校验异常 |
MERR_ASF_APPID_APPKEY_SDK_MISMATCH | 0x16018 | 90136 | 传入的AppId和AppKey与使用的SDK版本不一致 |
MERR_ASF_NO_REQUEST | 0x16019 | 90137 | 短时间大量请求会被禁止请求,30分钟之后解封 |
MERR_ASF_ACTIVE_FILE_NO_EXIST | 0x1601A | 90138 | 激活文件不存在 |
MERR_ASF_IMAGEMODE_0_HIGHER_EXT_UNSUPPORT | 0x1601B | 90139 | IMAGE模式下不支持全角度(ASF_OP_0_HIGHER_EXT)检测 |
MERR_ASF_NETWORK_COULDNT_RESOLVE_HOST | 0x17001 | 94209 | 无法解析主机地址 |
MERR_ASF_NETWORK_COULDNT_CONNECT_SERVER | 0x17002 | 94210 | 无法连接服务器 |
MERR_ASF_NETWORK_CONNECT_TIMEOUT | 0x17003 | 94211 | 网络连接超时 |
MERR_ASF_NETWORK_UNKNOWN_ERROR | 0x17004 | 94212 | 网络未知错误 |
3.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>
#define APPID "官网获取APPID"
#define SDKKey "官网获取SDKKEY"
#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; }
#define NSCALE "取值范围[2,32],VIDEO模式推荐值16,IMAGE模式内部设置固定值为30"
#define FACENUM "检测的人脸数"
int main()
{
//激活SDK
MRESULT res = ASFOnlineActivation(APPID, SDKKEY);
if (MOK != res && MERR_ASF_ALREADY_ACTIVATED != res)
printf("ASFOnlineActivation fail: %d\n", res);
else
printf("ASFOnlineActivation sucess: %d\n", res);
//初始化引擎
MHandle handle = NULL;
MInt32 mask = ASF_FACE_DETECT | ASF_FACERECOGNITION | ASF_AGE | ASF_GENDER | ASF_FACE3DANGLE | ASF_LIVENESS | ASF_IR_LIVENESS;
res = ASFInitEngine(ASF_DETECT_MODE_IMAGE, ASF_OP_0_ONLY, NSCALE, FACENUM, mask, &handle);
if (res != MOK)
printf("ALInitEngine fail: %d\n", res);
else
printf("ALInitEngine sucess: %d\n", res);
char* picPath1 = "图片路径,该demo只支持裸数据(NV21/BGR24/BMP等)格式";
int Width1 = 图片宽度;
int Height1 = 图片高度;
int Format1 = ASVL_PAF_RGB24_B8G8R8; //图像数据为RGB24颜色格式
MUInt8* imageData1 = (MUInt8*)malloc(Height1*Width1*3);
FILE* fp1 = fopen(picPath1, "rb");
char* picPath2 = "图片路径,该demo只支持裸数据(NV21/BGR24/BMP等)格式";
int Width2 = 图片宽度;
int Height2 = 图片高度;
int Format2 = ASVL_PAF_RGB24_B8G8R8; //图像数据为RGB24颜色格式
MUInt8* imageData2 = (MUInt8*)malloc(Height2*Width2*3);
FILE* fp2 = fopen(picPath2, "rb");
char* picPath3 = "图片路径,这里用的NV21为例";
int Width3 = 图片宽度;
int Height3 = 图片高度;
int Format3 = ASVL_PAF_GRAY; //用于红外活体检测
//只读NV21前2/3的数据为灰度数据
MUInt8* imageData3 = (MUInt8*)malloc(Height2*Width2);
FILE* fp3 = fopen(picPath3, "rb");
if (fp1 && fp2 && fp3)
{
fread(imageData1, 1, Height1*Width1*3, fp1); //读BGR裸数据
fclose(fp1);
fread(imageData2, 1, Height2*Width2*3, fp2); //读BGR裸数据
fclose(fp2);
fread(imageData3, 1, Height3*Width3, fp3);//读NV21前2/3的数据,用于红外活体检测
fclose(fp3);
// 人脸检测
ASF_MultiFaceInfo detectedFaces1 = { 0 };
ASF_SingleFaceInfo SingleDetectedFaces = { 0 };
ASF_FaceFeature feature1 = { 0 };
ASF_FaceFeature copyfeature1 = { 0 };
res = ASFDetectFaces(handle, Width1, Height1, Format1, 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, Format1, imageData1, &SingleDetectedFaces, &feature1);
if (res != MOK)
printf("%s ASFFaceFeatureExtract fail: %d\n", picPath1, res);
else
{
printf("%s ASFFaceFeatureExtract 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, Format2, 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, Format2, 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);
//设置活体置信度 SDK内部默认值为 IR:0.7 RGB:0.75(无特殊需要,可以不设置)
ASF_LivenessThreshold threshold = { 0 };
threshold.thresholdmodel_BGR = 0.75;
threshold.thresholdmodel_IR = 0.7;
res = ASFSetLivenessParam(handle, &threshold);
if (res != MOK)
printf("ASFSetLivenessParam fail: %d\n", res);
else
printf("ASFSetLivenessParam sucess: %d\n", res);
// 人脸信息检测
MInt32 lastMask = ASF_AGE | ASF_GENDER | ASF_FACE3DANGLE | ASF_LIVENESS;
res = ASFProcess(handle, Width2, Height2, Format2, 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 rgbLivenessInfo = { 0 };
res = ASFGetLivenessScore(handle, &rgbLivenessInfo);
if (res != MOK)
printf("ASFGetLivenessScore fail: %d\n", res);
else
printf("ASFGetLivenessScore sucess: %d\n", rgbLivenessInfo.isLive[0]);
//**************进行IR活体检测********************
printf("\n**********IR LIVENESS*************\n");
ASF_MultiFaceInfo detectedFaces3 = { 0 };
//以GRAY图像为例进行红外活体检测
res = ASFDetectFaces(handle, Width3, Height3, Format3, imageData3, &detectedFaces3);
if (res != MOK)
printf("ASFDetectFaces fail: %d\n", res);
else
printf("Face num: %d\n", detectedFaces3.faceNum);
//IR图像活体检测
MInt32 processIRMask = ASF_IR_LIVENESS;
res = ASFProcess_IR(handle, Width3, Height3, ASVL_PAF_GRAY, imageData3, &detectedFaces3, processIRMask);
if (res != MOK)
printf("ASFProcess_IR fail: %d\n", res);
else
printf("ASFProcess_IR sucess: %d\n", res);
//获取IR活体信息
ASF_LivenessInfo irLivenessInfo = { 0 };
res = ASFGetLivenessScore_IR(handle, &irLivenessInfo);
if (res != MOK)
printf("ASFGetLivenessScore_IR fail: %d\n", res);
else
printf("IR Liveness: %d\n", irLivenessInfo.isLive[0]);
SafeFree(copyfeature1.feature); //释放内存
SafeArrayDelete(imageData1);
SafeArrayDelete(imageData2);
SafeArrayDelete(imageData3);
//获取版本信息
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;
}