完善个人信息

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

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

无标题文档

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-32video模式下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, &copyfeature1, &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;
}