完善个人信息

完善您的账号信息,便于为您提供更精准的服务

跳过
开发者类型:
企业名称:
联系人姓名:
真实姓名:
行业:
地区:

 无标题文档

ArcSoft ArcFace SDK Windows 平台 API 文档 V2.2

1 数据结构与枚举

1.1 数据结构

1.1.1 ASF_VERSION

结构体描述:
SDK版本信息
定义:

  1. typedef struct {
  2. MPChar Version; // 版本号
  3. MPChar BuildDate; // 构建日期
  4. MPChar CopyRight; // 版权说明
  5. }ASF_VERSION;

1.1.2 ASF_ActiveFileInfo

结构体描述:
激活文件信息
定义:

  1. typedef struct{
  2. MPChar startTime; //SDK开始时间
  3. MPChar endTime; //SDK截止时间
  4. MPChar platform; //平台版本
  5. MPChar sdkType; //SDK类型
  6. MPChar appId; //APPID
  7. MPChar sdkKey; //SDKKEY
  8. MPChar sdkVersion; //SDK版本号
  9. MPChar fileVersion; //激活文件版本号
  10. }ASF_ActiveFileInfo, *LPASF_ActiveFileInfo;

1.1.3 ASF_SingleFaceInfo

结构体描述:
单人脸信息
定义:

  1. typedef struct {
  2. MRECT faceRect; // 人脸框
  3. MInt32 faceOrient; //人脸角度
  4. } ASF_SingleFaceInfo, *LPASF_SingleFaceInfo;

1.1.4 ASF_MultiFaceInfo

结构体描述:
多人脸信息
定义:

  1. typedef struct {
  2. MRECT* faceRect; // 人脸框数组
  3. MInt32* faceOrient; // 人脸角度数组
  4. MInt32 faceNum; // 检测到的人脸个数
  5. MInt32* faceID; //在VIDEO模式下有效,IMAGE模式下为空
  6. }ASF_MultiFaceInfo, *LPASF_MultiFaceInfo;

1.1.5 ASF_FaceFeature

结构体描述:
人脸特征
定义:

  1. typedef struct {
  2. MByte* feature; // 人脸特征
  3. MInt32 featureSize; // 人脸特征长度
  4. }ASF_FaceFeature, *LPASF_FaceFeature;

1.1.6 ASF_AgeInfo

结构体描述:
年龄信息
定义:

  1. typedef struct{
  2. MInt32* ageArray; // 0:未知; >0:年龄
  3. MInt32 num; // 检测的人脸个数
  4. }ASF_AgeInfo, *LPASF_AgeInfo;

1.1.7 ASF_GenderInfo

结构体描述:
性别信息
定义:

  1. typedef struct{
  2. MInt32* genderArray; // 0:男性; 1:女性; -1:未知
  3. MInt32 num; // 检测的人脸个数
  4. }ASF_GenderInfo, *LPASF_GenderInfo;

1.1.8 ASF_Face3DAngle

结构体描述:
3D角度信息
定义:

  1. typedef struct{
  2. MFloat* roll; //横滚角
  3. MFloat* yaw; //偏航角
  4. MFloat* pitch; //俯仰角
  5. MInt32* status; //0:正常; 非0:异常
  6. MInt32 num; //检测的人脸个数
  7. }ASF_Face3DAngle, *LPASF_Face3DAngle;

1.1.9 ASF_LivenessThreshold

结构体描述:
活体置信度
定义:

  1. typedef struct{
  2. MFloat thresholdmodel_BGR; //RGB活体置信度
  3. MFloat thresholdmodel_IR; //IR活体置信度
  4. }ASF_LivenessThreshold, *LPASF_LivenessThreshold;

1.1.10 ASF_LivenessInfo

结构体描述:
活体信息
定义:

  1. typedef struct{
  2. MInt32* isLive; //0:非真人; 1:真人; -1:不确定; -2:传入人脸数>1
  3. MInt32 num; //检测的人脸个数
  4. }ASF_LivenessInfo, *LPASF_LivenessInfo;

2 枚举

2.1 人脸检测方向

  1. 根据应用场景,推荐选择单一角度,检测效果更优;
  1. enum ArcSoftFace_OrientPriority {
  2. ASF_OP_0_ONLY = 0x1, // 仅检测0度
  3. ASF_OP_90_ONLY = 0x2, // 仅检测90度
  4. ASF_OP_270_ONLY = 0x3, // 仅检测270度
  5. ASF_OP_180_ONLY = 0x4, // 仅检测180度
  6. ASF_OP_0_HIGHER_EXT = 0x5, // 全角度检测
  7. };

注:IMAGE模式下为了提高检测识别率,不支持ASF_OP_0_HIGHER_EXT检测

2.2 检测到的人脸角度(按逆时针方向)

  1. enum ArcSoftFace_OrientCode {
  2. ASF_OC_0 = 0x1, // 0度
  3. ASF_OC_90 = 0x2, // 90度
  4. ASF_OC_270 = 0x3, // 270度
  5. ASF_OC_180 = 0x4, // 180度
  6. ASF_OC_30 = 0x5, // 30度
  7. ASF_OC_60 = 0x6, // 60度
  8. ASF_OC_120 = 0x7, // 120度
  9. ASF_OC_150 = 0x8, // 150度
  10. ASF_OC_210 = 0x9, // 210度
  11. ASF_OC_240 = 0xa, // 240度
  12. ASF_OC_300 = 0xb, // 300度
  13. ASF_OC_330 = 0xc // 330度
  14. };

3. 接口

3.1 接口说明

3.1.1 ASFGetActiveFileInfo

接口

  1. MRESULT ASFGetActiveFileInfo(
  2. LPASF_ActiveFileInfo activeFileInfo
  3. );

功能描述
获取激活文件信息
参数

名称 IN/OUT 说明
activeFileInfo [out] 激活文件信息

返回值
成功返回MOK,失败详见 3.2错误码列表

3.1.2 ASFOnlineActivation

接口

  1. MRESULT ASFOnlineActivation(
  2. MPChar AppId,
  3. MPChar SDKKey
  4. );

功能描述
用于在线激活SDK
注:
1) 初次使用SDK时需要对SDK先进行激活,激活后无需重复调用;
2) 调用此接口时必须为联网状态,激活成功后即可离线使用;

参数

名称 IN/OUT 说明
AppId [in] 官网获取的APPID
SDKKey [in] 官网获取的SDKKEY

返回值

成功返回MOK或MERR_ASF_ALREADY_ACTIVATED,失败详见 3.2错误码列表

3.1.3 ASFActivation

接口

  1. MRESULT ASFActivation(
  2. MPChar AppId,
  3. MPChar SDKKey
  4. );

功能描述

在线激活SDK,与ASFOnlineActivation接口功能相同,首次需要联网激活,生成激活文件之后即可进行本地校验。(ASFOnlineActivation接口做了激活方案的优化,推荐使用ASFOnlineActivation接口)
参数

名称 IN/OUT 说明
AppId [in] 官网获取的APPID
SDKKey [in] 官网获取的SDKKEY

返回值

成功返回MOK或MERR_ASF_ALREADY_ACTIVATED,失败详见 3.2错误码列表

3.1.4 ASFInitEngine

接口

  1. MRESULT ASFInitEngine(
  2. MUInt32 detectMode,
  3. ASF_OrientPriority detectFaceOrientPriority,
  4. MInt32 detectFaceScaleVal,
  5. MInt32 detectFaceMaxNum,
  6. MInt32 combinedMask,
  7. MHandle* hEngine
  8. );

功能描述

初始化引擎

参数

名称 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

接口

  1. MRESULT ASFDetectFaces(
  2. MHandle hEngine,
  3. MInt32 width,
  4. MInt32 height,
  5. MInt32 format,
  6. MUInt8* imgData,
  7. LPASF_MultiFaceInfo detectedFaces
  8. );

功能描述
人脸检测
参数

名称 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

接口

  1. MRESULT ASFFaceFeatureExtract(
  2. MHandle hEngine,
  3. MInt32 width,
  4. MInt32 height,
  5. MInt32 format,
  6. MUInt8* imgData,
  7. LPASF_SingleFaceInfo faceInfo,
  8. LPASF_FaceFeature feature
  9. );

功能描述
单人脸特征提取
参数

名称 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

接口

  1. MRESULT ASFFaceFeatureCompare(
  2. MHandle hEngine,
  3. LPASF_FaceFeature feature1,
  4. LPASF_FaceFeature feature2,
  5. MFloat* confidenceLevel
  6. );

功能描述
人脸特征比对
参数

名称 IN/OUT 说明
hEngine [in] 引擎句柄
feature1 [in] 人脸特征值
feature2 [in] 人脸特征值
confidenceLevel [out] 比对结果,相似度

返回值

成功返回MOK,失败详见 3.2错误码列表

3.1.8 ASFSetLivenessParam

接口

  1. MRESULT ASFSetLivenessParam(
  2. MHandle hEngine,
  3. LPASF_LivenessThreshold threshold
  4. );

功能描述
修改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

接口

  1. MRESULT ASFProcess(
  2. MHandle hEngine,
  3. MInt32 width,
  4. MInt32 height,
  5. MInt32 format,
  6. MUInt8* imgData,
  7. LPASF_MultiFaceInfo detectedFaces,
  8. MInt32 combinedMask
  9. );

功能描述

人脸信息检测(年龄/性别/人脸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

接口

  1. MRESULT ASFProcess_IR(
  2. MHandle hEngine,
  3. MInt32 width,
  4. MInt32 height,
  5. MInt32 format,
  6. MUInt8* imgData,
  7. LPASF_MultiFaceInfo detectedFaces,
  8. MInt32 combinedMask
  9. );

功能描述
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

接口

  1. MRESULT ASFGetAge(
  2. MHandle hEngine,
  3. LPASF_AgeInfo ageInfo
  4. );

功能描述
获取年龄信息
参数

名称 IN/OUT 说明
hEngine [in] 引擎句柄
ageInfo [out] 检测到的年龄信息

返回值
成功返回MOK,失败详见 3.2错误码列表

3.1.12 ASFGetGender

接口

  1. MRESULT ASFGetGender(
  2. MHandle hEngine,
  3. LPASF_GenderInfo genderInfo
  4. );

功能描述
获取性别信息
参数

名称 IN/OUT 说明
hEngine [in] 引擎句柄
genderInfo [out] 检测到的性别信息

返回值

成功返回MOK,失败详见 3.2错误码列表

3.1.13 ASFGetFace3DAngle

接口

  1. MRESULT ASFGetFace3DAngle(
  2. MHandle hEngine,
  3. LPASF_Face3DAngle p3DAngleInfo
  4. );

功能描述
获取3D角度信息
参数

名称 IN/OUT 说明
hEngine [in] 引擎句柄
p3DAngleInfo [out] 检测到脸部3D 角度信息

返回值
成功返回MOK,失败详见 3.2错误码列表

3.1.14 ASFGetLivenessScore

接口

  1. MRESULT ASFGetLivenessScore(
  2. MHandle hEngine,
  3. LPASF_LivenessInfo livenessInfo
  4. );

功能描述
获取RGB活体信息
参数

名称 IN/OUT 说明
hEngine [in] 引擎句柄
livenessInfo [out] RGB活体信息,详见 2.2.10 ASF_LivenessInfo

返回值

成功返回MOK,失败详见 3.2错误码列表

3.1.15 ASFGetLivenessScore_IR

接口

  1. MRESULT ASFGetLivenessScore_IR(
  2. MHandle hEngine,
  3. LPASF_LivenessInfo livenessInfo
  4. );

功能描述
获取IR活体信息
参数

名称 IN/OUT 说明
hEngine [in] 引擎句柄
livenessInfo [out] IR活体信息,详见 2.2.10 ASF_LivenessInfo

返回值

成功返回MOK,失败详见 3.2错误码列表

3.1.16 ASFGetVersion

接口

  1. const ASF_VERSION* ASFGetVersion(
  2. MHandle hEngine
  3. );

功能描述
获取版本信息
参数

名称 IN/OUT 说明
hEngine [in] 引擎句柄

返回值

  1. 成功返回版本信息,失败返回MNull

3.1.17 ASFUninitEngine

接口

  1. MRESULT ASFUninitEngine(
  2. MHandle hEngine
  3. );

功能描述
销毁引擎

参数

名称 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 示例代码

  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "arcsoft_face_sdk.h"
  5. #include "amcomdef.h"
  6. #include "asvloffscreen.h"
  7. #include "merror.h"
  8. #include <direct.h>
  9. #include <iostream>
  10. #include <stdarg.h>
  11. #include <string>
  12. #include <opencv2\opencv.hpp>
  13. using namespace std;
  14. #pragma comment(lib, "libarcsoft_face_engine.lib")
  15. #define APPID "官网获取APPID"
  16. #define SDKKey "官网获取ADKKey"
  17. #define SafeFree(p) { if ((p)) free(p); (p) = NULL; }
  18. #define SafeArrayDelete(p) { if ((p)) delete [] (p); (p) = NULL; }
  19. #define SafeDelete(p) { if ((p)) delete (p); (p) = NULL; }
  20. //裁剪图片,做四字节对齐
  21. void CutIplImage(IplImage* src, IplImage* dst, int x, int y)
  22. {
  23. CvSize size = cvSize(dst->width, dst->height);//区域大小
  24. cvSetImageROI(src, cvRect(x, y, size.width, size.height));//设置源图像ROI
  25. cvCopy(src, dst); //复制图像
  26. cvResetImageROI(src);//源图像用完后,清空ROI
  27. }
  28. int main()
  29. {
  30. //激活接口,首次需联网激活
  31. MRESULT res = ASFOnlineActivation(APPID, SDKKey);
  32. //MRESULT res = ASFActivation(APPID, SDKKey);
  33. if (MOK != res && MERR_ASF_ALREADY_ACTIVATED != res)
  34. printf("ASFActivation fail: %d\n", res);
  35. else
  36. printf("ASFActivation sucess: %d\n", res);
  37. //获取激活文件信息
  38. ASF_ActiveFileInfo activeFileInfo;
  39. res = ASFGetActiveFileInfo(&activeFileInfo);
  40. if (res != MOK)
  41. printf("ASFGetActiveFileInfo fail: %d\n", res);
  42. //初始化接口
  43. MHandle handle = NULL;
  44. MInt32 mask = ASF_FACE_DETECT | ASF_FACERECOGNITION | ASF_AGE | ASF_GENDER | ASF_FACE3DANGLE | ASF_LIVENESS | ASF_IR_LIVENESS;
  45. res = ASFInitEngine(ASF_DETECT_MODE_IMAGE, ASF_OP_0_ONLY, 30, 10, mask, &handle);
  46. if (res != MOK)
  47. printf("ASFInitEngine fail: %d\n", res);
  48. else
  49. printf("ASFInitEngine sucess: %d\n", res);
  50. // 人脸检测
  51. IplImage* img1 = cvLoadImage("RGB图像路径");
  52. IplImage* img2 = cvLoadImage("RGB图像路径");
  53. IplImage* img3 = cvLoadImage("IR图像路径");
  54. if (img1 && img2 && img3)
  55. {
  56. ASF_MultiFaceInfo detectedFaces1 = { 0 };
  57. ASF_SingleFaceInfo SingleDetectedFaces1 = { 0 };
  58. ASF_FaceFeature feature1 = { 0 };
  59. ASF_FaceFeature copyfeature1 = { 0 };
  60. IplImage* cutImg1 = cvCreateImage(cvSize(img1->width - img1->width % 4, img1->height), IPL_DEPTH_8U, img1->nChannels);
  61. CutIplImage(img1, cutImg1, 0, 0);
  62. res = ASFDetectFaces(handle, cutImg1->width, cutImg1->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)cutImg1->imageData, &detectedFaces1);
  63. if (MOK == res)
  64. {
  65. SingleDetectedFaces1.faceRect.left = detectedFaces1.faceRect[0].left;
  66. SingleDetectedFaces1.faceRect.top = detectedFaces1.faceRect[0].top;
  67. SingleDetectedFaces1.faceRect.right = detectedFaces1.faceRect[0].right;
  68. SingleDetectedFaces1.faceRect.bottom = detectedFaces1.faceRect[0].bottom;
  69. SingleDetectedFaces1.faceOrient = detectedFaces1.faceOrient[0];
  70. res = ASFFaceFeatureExtract(handle, cutImg1->width, cutImg1->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)cutImg1->imageData, &SingleDetectedFaces1, &feature1);
  71. if (res == MOK)
  72. {
  73. //拷贝feature
  74. copyfeature1.featureSize = feature1.featureSize;
  75. copyfeature1.feature = (MByte *)malloc(feature1.featureSize);
  76. memset(copyfeature1.feature, 0, feature1.featureSize);
  77. memcpy(copyfeature1.feature, feature1.feature, feature1.featureSize);
  78. }
  79. else
  80. printf("ASFFaceFeatureExtract 1 fail: %d\n", res);
  81. }
  82. else
  83. printf("ASFDetectFaces 1 fail: %d\n", res);
  84. //第二张人脸处理
  85. ASF_MultiFaceInfo detectedFaces2 = { 0 };
  86. ASF_SingleFaceInfo SingleDetectedFaces2 = { 0 };
  87. ASF_FaceFeature feature2 = { 0 };
  88. IplImage* cutImg2 = cvCreateImage(cvSize(img2->width - img2->width % 4, img2->height), IPL_DEPTH_8U, img2->nChannels);
  89. CutIplImage(img2, cutImg2, 0, 0);
  90. res = ASFDetectFaces(handle, cutImg2->width, cutImg2->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)cutImg2->imageData, &detectedFaces2);
  91. if (MOK == res)
  92. {
  93. SingleDetectedFaces2.faceRect.left = detectedFaces2.faceRect[0].left;
  94. SingleDetectedFaces2.faceRect.top = detectedFaces2.faceRect[0].top;
  95. SingleDetectedFaces2.faceRect.right = detectedFaces2.faceRect[0].right;
  96. SingleDetectedFaces2.faceRect.bottom = detectedFaces2.faceRect[0].bottom;
  97. SingleDetectedFaces2.faceOrient = detectedFaces2.faceOrient[0];
  98. res = ASFFaceFeatureExtract(handle, cutImg2->width, cutImg2->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)cutImg2->imageData, &SingleDetectedFaces2, &feature2);
  99. if (MOK != res)
  100. printf("ASFFaceFeatureExtract 2 fail: %d\n", res);
  101. }
  102. else
  103. printf("ASFDetectFaces 2 fail: %d\n", res);
  104. // 单人脸特征比对
  105. MFloat confidenceLevel;
  106. res = ASFFaceFeatureCompare(handle, ©feature1, &feature2, &confidenceLevel);
  107. if (res != MOK)
  108. printf("ASFFaceFeatureCompare fail: %d\n", res);
  109. else
  110. printf("ASFFaceFeatureCompare sucess: %lf\n", confidenceLevel);
  111. //设置活体置信度 SDK内部默认值为 IR:0.7 RGB:0.75(无特殊需要,可以不设置)
  112. ASF_LivenessThreshold threshold = { 0 };
  113. threshold.thresholdmodel_BGR = 0.75;
  114. threshold.thresholdmodel_IR = 0.7;
  115. res = ASFSetLivenessParam(handle, &threshold);
  116. if (res != MOK)
  117. printf("ASFSetLivenessParam fail: %d\n", res);
  118. else
  119. printf("RGB Threshold: %f IR Threshold: %f\n", threshold.thresholdmodel_BGR, threshold.thresholdmodel_IR);
  120. // RGB图像属性检测
  121. MInt32 processMask = ASF_AGE | ASF_GENDER | ASF_FACE3DANGLE | ASF_LIVENESS;
  122. res = ASFProcess(handle, cutImg2->width, cutImg2->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)cutImg2->imageData, &detectedFaces2, processMask);
  123. if (res != MOK)
  124. printf("ASFProcess fail: %d\n", res);
  125. else
  126. printf("ASFProcess sucess: %d\n", res);
  127. // 获取年龄
  128. ASF_AgeInfo ageInfo = { 0 };
  129. res = ASFGetAge(handle, &ageInfo);
  130. if (res != MOK)
  131. printf("ASFGetAge fail: %d\n", res);
  132. else
  133. printf("Age: %d\n", ageInfo.ageArray[0]);
  134. // 获取性别
  135. ASF_GenderInfo genderInfo = { 0 };
  136. res = ASFGetGender(handle, &genderInfo);
  137. if (res != MOK)
  138. printf("ASFGetGender fail: %d\n", res);
  139. else
  140. printf("Gender: %d\n", genderInfo.genderArray[0]);
  141. // 获取3D角度
  142. ASF_Face3DAngle angleInfo = { 0 };
  143. res = ASFGetFace3DAngle(handle, &angleInfo);
  144. if (res != MOK)
  145. printf("ASFGetFace3DAngle fail: %d\n", res);
  146. else
  147. printf("3DAngle roll: %f yaw: %f pitch: %f\n", angleInfo.roll[0], angleInfo.yaw[0], angleInfo.pitch[0]);
  148. //获取RGB活体信息
  149. ASF_LivenessInfo rgbLivenessInfo = { 0 };
  150. res = ASFGetLivenessScore(handle, &rgbLivenessInfo);
  151. if (res != MOK)
  152. printf("ASFGetLivenessScore fail: %d\n", res);
  153. else
  154. printf("RGB Liveness: %d\n", rgbLivenessInfo.isLive[0]);
  155. //**************进行IR活体检测********************
  156. printf("\n**********IR LIVENESS*************\n");
  157. ASF_MultiFaceInfo detectedFaces3 = { 0 };
  158. IplImage* cutImg3 = cvCreateImage(cvSize(img3->width - img3->width % 4, img3->height), IPL_DEPTH_8U, img3->nChannels);
  159. CutIplImage(img3, cutImg3, 0, 0);
  160. //opencv读图时会将灰度图读成RGB图,需要转换成GRAY图进行IR活体检测
  161. cv::Mat grayMat;
  162. cv::Mat copyCutImg3(cutImg3, false); //IplImage转Mat 设为ture为深拷贝
  163. cv::cvtColor(copyCutImg3, grayMat, CV_BGR2GRAY);
  164. res = ASFDetectFaces(handle, cutImg3->width, cutImg3->height, ASVL_PAF_RGB24_B8G8R8, (MUInt8*)cutImg3->imageData, &detectedFaces3);
  165. if (res != MOK)
  166. printf("ASFGetLivenessScore fail: %d\n", res);
  167. else
  168. printf("Face num: %d\n", detectedFaces3.faceNum);
  169. //IR图像活体检测
  170. MInt32 processIRMask = ASF_IR_LIVENESS;
  171. res = ASFProcess_IR(handle, grayMat.cols, grayMat.rows, ASVL_PAF_GRAY, (MUInt8*)grayMat.data, &detectedFaces3, processIRMask);
  172. if (res != MOK)
  173. printf("ASFProcess_IR fail: %d\n", res);
  174. else
  175. printf("ASFProcess_IR sucess: %d\n", res);
  176. //获取RGB活体信息
  177. ASF_LivenessInfo irLivenessInfo = { 0 };
  178. res = ASFGetLivenessScore_IR(handle, &irLivenessInfo);
  179. if (res != MOK)
  180. printf("ASFGetLivenessScore_IR fail: %d\n", res);
  181. else
  182. printf("IR Liveness: %d\n", irLivenessInfo.isLive[0]);
  183. SafeFree(copyfeature1.feature); //释放内存
  184. cvReleaseImage(&cutImg1);
  185. cvReleaseImage(&cutImg2);
  186. cvReleaseImage(&cutImg3);
  187. }
  188. cvReleaseImage(&img1);
  189. cvReleaseImage(&img2);
  190. cvReleaseImage(&img3);
  191. //获取版本信息
  192. const ASF_VERSION* pVersionInfo = ASFGetVersion(handle);
  193. //反初始化
  194. res = ASFUninitEngine(handle);
  195. if (res != MOK)
  196. printf("ALUninitEngine fail: %d\n", res);
  197. else
  198. printf("ALUninitEngine sucess: %d\n", res);
  199. getchar();
  200. return 0;