完善个人信息

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

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

ArcSoft Liveness SDK
开发说明文档
概述
1.1. 产品概述
活体检测离线 SDK,包含单目 RGB 静默活体检测能力,初次使用时需联网激活,激活后 即可本地无网络环境下工作,可根据业务需求结合人脸识别等 SDK 灵活的进行应用层开发。
1.2. 运行环境
Android armeabi-v7a
1.3. 系统要求
Android 5.0 及以上
1.4. 所需权限系统要求
1) //网络权限,当禁用后,无法进行有效激活
<uses-permission android:name="android.permission.INTERNET"/>
2) 设备验证权限,//读取获取设备硬件验证信息,当禁用后,无法进行有效激活
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
1.5. 支持颜色空间格式
支持图像的颜色空间格式: NV21, BGR24
接入说明
SDK包获取
1) 进入http://ai.arcsoft.com.cn/ai/arcface.html开发者中心,注册账号并登录;
2) 创建应用,并选择需要下载的SDK以及对应的平台和版本;版本填写下载申请,并提交

3) 获取下载SDK对应的APP_ID和SDK_KEY;

4) 点击【下载SDK】下载SDK压缩包;
5) 下载完成后,解压压缩包,将所需要的引擎拷贝到对应的工程进行二次开发;
调用流程
SDK包获取
1)激活,调用activeEngine
2)初始化,调用initEngine
3)图像数据/人脸数据处理
4)调用startLivenessDetect接口进行活体检测
5)调用unInitEngine销毁引擎
Step 1:激活,调用activeEngine
接口所需appId和sdkKey在申请SDK时获取,只需在第一次使用时调用激活成功即可;
Step 2:初始化,调用initEngine初始化引擎
Step 3: 图像数据/人脸数据处理
1. 图像数据可以从摄像头获取, 支持24位BGR或者NV21数据,也可以从保存的图片中获取;
Bitmap转换成BGR数据示例:
public static byte[] getPixelsBGR(Bitmap bitmap) {
//	calculate how many bytes our image consists of int bytes = bitmap.getByteCount();
//	Create a new buffer
//	Move the byte data to the buffer
bitmap.copyPixelsToBuffer(buffer);
//	Get the underlying array containing the data. byte[] temp = buffer.array();
//	Allocate for BGR
byte[] pixels = new byte[(temp.length / 4) * 3];
// Copy pixels into place
for (int i = 0; i < temp.length / 4; i++) {
//B
pixels[i * 3] = temp[i * 4 + 2];
//G
pixels[i * 3 + 1] = temp[i * 4 + 1];
//R
pixels[i * 3 + 2] = temp[i * 4];
}
return pixels;
}

                                
Bitmap转换NV21数据示例:


public static byte[] getNV21(int inputWidth, int inputHeight, Bitmap bitmap){ int[] argb = new int[inputWidth * inputHeight]; bitmap.getPixels(argb, 0, inputWidth, 0, 0, inputWidth, inputHeight); byte[] yuv = new byte[inputWidth * inputHeight * 3 / 2]; encodeYUV420SP(yuv, argb, inputWidth, inputHeight);
bitmap.recycle();
return yuv;
}
private static void encodeYUV420SP(byte[] yuv420sp, int[] argb, int width, int height)
{
final int frameSize = width * height;
int yIndex = 0;
int uvIndex = frameSize;
int a, R, G, B, Y, U, V;
int index = 0;
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
// a is not used obviously
a = (argb[index] & 0xff000000) >> 24;
R = (argb[index] & 0xff0000) >> 16;
G = (argb[index] & 0xff00) >> 8;
B = (argb[index] & 0xff) >> 0;
Y = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16;
U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128;
V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128;
yuv420sp[yIndex++] = (byte) ((Y < 0) ? 0: ((Y > 255) ? 255 : Y)); if (j % 2 == 0 && index % 2 == 0) {
yuv420sp[uvIndex++] = (byte) ((V < 0) ? 0 : ((V > 255) ? 255 : V));
yuv420sp[uvIndex++] = (byte) ((U < 0) ? 0 : ((U > 255) ? 255 : U));
}
index++;
}
}
}
                                
2.人脸数据所需的人脸框和人脸角度通过人脸检测(FD)或人脸跟踪(FT)得到,转换成活体所需结构即可;
Step 4:调用startLivenessDetect接口进行活体检测
视频模式,:处理连续帧的图像数据,并返回检测结果,需要将所有图像帧的数据都传入接口进行处理;
图像模式:,处理单帧的图像数据,并返回检测结果;
活体检测结果可从LivenessInfo对象中获取;
Step 5:调用unInitEngine销毁引擎
代码实现参考文末示例代码
SDK包结构
|---doc
| |---ARCSOFT_LIVENESS_DEVELOPER'S_GUIDE.pdf 开发说明文档
|---libs | |---armeabi-v7a | | |---libarcsoft_face.so 引擎库
| | |---libarcsoft_liveness.so 引擎库
| |---arcsoft_liveness.jar 引擎库
|---samplecode | |---LivenessDemo 示例工程
|---releasenotes.txt 更新说明
类描述
2.1. Class FaceInfo
2.1.1. 功能描述
人脸信息类,用于存储人脸框及人脸角度,提供人脸框及人脸角度设置与获取的方法
2.1.2. 构造函数
2.1.2.1. FaceInfo (Rect rect, int degree)
通过输入的人脸框及角度值构造一个人脸信息对象
参数:
Rect rect
人脸框(Rect(left, top, right, bottom))
int degree
人脸角度(AL_OC_0, AL_OC_90等,具体参考2.1.4.1)
2.1.2.2. FaceInfo (FaceInfo self)
通过输入的人脸信息对象构造一个新的人脸信息对象
参数:
FaceInfo self
类对象,创建的对象和传入的对象数据一致
2.1.2.3. FaceInfo ()
构造一个人脸信息对象,人脸框和人脸角度为空
2.1.3. 成员函数
2.1.3.1. void setRect(Rect rect )
设置人脸框
参数:
Rect rect
人脸框(Rect(left, top, right, bottom)), 一般通过调用人脸检测(FD)或者人脸跟踪(FT)获得取
2.1.3.2. Rect getRect()
从人脸信息对象中藜取获取人脸框
返回值:
人脸框(Rect(left, top, right, bottom))
2.1.3.3. void setDegree(int degree)
设置人脸角度
参数:
int degree
人脸框(Rect(left, top, right, bottom)),人脸角度(AL_OC_0, AL_OC_90等 ,具体参考2.1.4), 一般通过调用人脸检测(FD)或者人脸跟踪(FT)获得取
2.1.3.4. int getDegree()
获取人脸角度
返回值:
人脸角度(AL_OC_0, AL_OC_90等,具体参考2.1.4)
2.1.3.5. String toString()
将人脸信息对象格式化为字符串
返回值:
人脸信息的字符串(String(”“Rect(left, top – right, bottom), Degree”))
2.1.3.6. FaceInfo clone()
创建一个人脸信息对象的拷贝
返回值:
本对象的拷贝
2.1.4. 类常量
(角度信息旋转方向为逆时针人脸在垂直方向按逆时针旋转的角度)
常量名
常量值
常量说明
AL_OC_0
1
0度
AL_OC_90
2
90度
AL_OC_270
3
270度
AL_OC_180
4
180度
AL_OC_30
5
30度
AL_OC_60
6
60度
AL_OC_120
7
120度
AL_OC_150
8
150度
AL_OC_210
9
210度
AL_OC_240
10
240度
AL_OC_300
11
300度
AL_OC_330
12
330度
2.2. Class ErrorInfo
2.2.1. 功能描述
错误信息类,用于保存接口调用是否成功的结果错误信息
2.2.2. 构造函数
2.2.2.1. ErrorInfo()
构造一个空的ErrorInfo对象
2.2.3. 成员函数
2.2.3.1. long getCode()
获取接口调用返回的错误码
返回值:
错误码(MOK, MERR_INVALID_PARAM 等,具体参考2.2.4)
2.2.4. 类常量
引擎返回的错误码定义
常量名
常量值
常量说明
MOK
0
成功
MERR_UNKNOWN
1
错误原因不明
MERR_INVALID_PARAM
2
无效的参数
MERR_UNSUPPORTED
3
引擎不支持
MERR_NO_MEMORY
4
内存不足
MERR_BAD_STATE
5
状态错误
MERR_USER_CANCEL
6
用户取消相关操作
MERR_EXPIRED
7
操作时间过期
MERR_USER_PAUSE
8
用户暂停操作
MERR_BUFFER_OVERFLOW
9
缓冲上溢
MERR_BUFFER_UNDERFLOW
10
缓冲下溢
MERR_NO_DISKSPACE
11
存贮空间不足
MERR_COMPONENT_NOT_EXIST
12
组件不存在
MERR_GLOBAL_DATA_NOT_EXIST
13
全局数据不存在
MERR_FSDK_INVALID_APP_ID
28673
无效的App Id
MERR_FSDK_INVALID_SDK_ID
28674
无效的SDK key
MERR_FSDK_INVALID_ID_PAIR
28675
AppId和SDKKey不匹配
MERR_FSDK_MISMATCH_ID_AND_SDK
28676
SDKKey 和使用的SDK 不匹配
MERR_FSDK_SYSTEM_VERSION_UNSUPPORTED
28677
系统版本不被当前SDK所支持
MERR_FSDK_LICENCE_EXPIRED
28678
SDK有效期过期,需要重新下载更新
MERR_FSDK_FACEFEATURE_ERROR_BASE
81920
人脸特征检测错误类型
MERR_FSDK_FACEFEATURE_UNKNOWN
81921
人脸特征检测错误未知
MERR_FSDK_FACEFEATURE_MEMORY
81922
人脸特征检测内存错误
MERR_FSDK_FACEFEATURE_INVALID_FORMAT
81923
人脸特征检测格式错误
MERR_FSDK_FACEFEATURE_INVALID_PARAM
81924
人脸特征检测参数错误
MERR_FSDK_FACEFEATURE_LOW_CONFIDENCE_LEVEL
81925
人脸特征检测结果置信度低
MERR_AF_EX_BASE_FEATURE_UNSUPPORTED_ON_INIT
86017
Engine不支持的检测属性
MERR_AF_EX_BASE_FEATURE_UNINITED
86018
需要检测是属性未初始化
MERR_AF_EX_BASE_FEATURE_UNPROCESSED
86019
待获取的属性未在PROCESS中处理过
MERR_AF_EX_BASE_FEATURE_UNSUPPORTED_ON_PROCESS
86020
PROCESS不支持的检测属性
MERR_AF_EX_BASE_INVALID_IMAGE_INFO
86021
无效的输入图像
MERR_AF_EX_BASE_INVALID_FACE_INFO
86022
无效的脸部信息
MERR_AL_BASE_ACTIVATION_FAIL
90113
Liveness SDK激活失败
MERR_AL_BASE_ALREADY_ACTIVATED
90114
Liveness SDK已激活
MERR_AL_BASE_NOT_ACTIVATED
90115
Liveness SDK未激活
MERR_AL_BASE_APPID_MISMATCH
90116
APPID不匹配
MERR_AL_BASE_VERION_MISMATCH
90117
SDK版本不匹配
MERR_AL_BASE_DEVICE_MISMATCH
90118
设备不匹配
MERR_AL_BASE_UNIQUE_IDENTIFIER_MISMATCH
90119
唯一标识不匹配
MERR_AL_BASE_PARAM_NULL
90120
参数为空
MERR_AL_BASE_SDK_EXPIRED
90121
SDK已过期
MERR_AL_BASE_VERSION_NOT_SUPPORT
90122
版本不支持
MERR_AL_BASE_SIGN_ERROR
90123
签名错误
MERR_AL_BASE_DATABASE_ERROR
90124
验证信息存储异常
MERR_AL_BASE_UNIQUE_CHECKOUT_FAIL
90125
唯一标识检查失败
MERR_AL_BASE_COLOR_SPACE_NOT_SUPPORT
90126
颜色空间不支持
MERR_AL_BASE_IMAGE_WIDTH_HEIGHT_NOT_SUPPORT
90127
图片宽度或高度不支持
MERR_ASF_BASE_READ_PHONE_STATE_DENIED
90128
READ_PHONE_STATE 权限被拒绝
MERR_AL_NETWORK_BASE_COULDNT_RESOLVE_HOST
94209
无法解析主机地址
MERR_AL_NETWORK_BASE_COULDNT_CONNECT_SERVER
94210
无法连接服务器
MERR_AL_NETWORK_BASE_CONNECT_TIMEOUT
94211
网络连接超时
MERR_AL_NETWORK_BASE_UNKNOWN_ERROR
94212
未知错误
2.3. Class VersionInfo
2.3.1. 功能描述
版本信息类,用于保存 SDK 版本信息
2.3.2. 构造函数
2.3.2.1. VersionInfo()
构造一个空的 VersionInfo 对象
2.3.3. 成员函数
2.3.3.1. String toString()
将VersionInfo格式化为字符串进行输出
返回值:
版本信息字符串
2.4. Class LivenessInfo
2.4.1. 功能描述
活体信息类,用于保存活体信息
2.4.2. 构造函数
2.4.2.1. LivenessInfo ()
构造一个空的 LivenessInfo 对象
2.4.2.2. LivenessInfo (LivenessInfo self)
根据输入的 LivenessInfo 对象构造一个新的 LivenessInfo 对象
参数
LivenessInfo self
类对象,创建的对象和传入的对象数据一致
2.4.3. 成员函数
2.4.3.1. int getLiveness()
获取活体检测结果
返回值:
活体检测结果(NOT_LIVE、LIVE等,具体参考2.4.4)
2.4.3.2. LivenessInfo clone()
创建一个对象的拷贝
返回值:
本对象的拷贝
2.4.4. 类常量
2.4.4.1. 活体检测结果返回值
常量名
常量值
常量说明
NOT_LIVE
0
非活体
LIVE
1
活体
UNKNOWN
-1
未知
MORE_THAN_ONE_FACE
-2
多于一张人脸
2.5. Class LivenessEngine
2.5.1. 功能描述
活体检测引擎类,实现活体检测功能
2.5.2. 构造函数
2.5.2.1. LivenessEngine ()
创建一个新的活体引擎
2.5.3. 成员函数
2.5.3.1. ErrorInfo activeEngine(Context context, String appId, String sdkKey)
激活引擎,只需第一次使用时调用,如未激活,调用其他成员方法将返回设备未激活的错误
需要权限:
android.permission.INTERNET
android.permission.READ_PHONE_STATE
参数
Context context
应用上下文
String appId
申请 SDK 时获取的 App Id
String sdkKey
申请 SDK 时获取的 SDK Key
返回值:
返回ErrorInfo对象,具体错误信息参考2.2 Class ErrorInfo
2.5.3.2. ErrorInfo initEngine(Context context,int detectMode)
根据检测模式初始化引擎,必须先于除激活外的其他方法调用,否则调用其他方法会不成功
<需要>权限:
android.permission.READ_PHONE_STATE
参数
Context context
应用上下文
detectMode
AL_DETECT_MODE_IMAGE 对单帧的图像数据进行活体检测
AL_DETECT_MODE_VIDEO 对连续帧的图像数据进行活体检测
返回值:
返回ErrorInfo对象,具体错误信息参考2.2 Class ErrorInfo
2.5.3.3. ErrorInfo startLivenessDetect (byte[] data, int width, int height, int format, List<FaceInfo> faceInfos, List<LivenessInfo> livenessInfos)
根据输入的图像及人脸信息进行活体检测并获取活体检测结果,检测结果存储在 livenessInfos 中
参数
byte[] data
输入的图像数据待检测的图像数据
int width
图像宽度,应为 4 的倍数
int height
图像高度
int format
颜色空间格式(只支持BGR24或者NV21格式)
List<FaceInfo> faceInfos
FaceDetect或FaceTrack人脸检测或者人脸跟踪检测得到的人脸信息(当目前版本只支持传入单个人脸)
List<LivenessInfo> livenessInfos
活体结果存在这个List中列表,List列表的size与传入startLiveness函数的人脸数一致
返回值:
返回ErrorInfo对象,具体错误信息参考2.2 Class ErrorInfo
2.5.3.4. ErrorInfo unInitEngine ()
销毁引擎,释放资源
返回值:
返回ErrorInfo对象,具体错误信息参考2.2 Class ErrorInfo
2.5.3.5. ErrorInfo getVersion(VersionInfo version)
获取 SDK 版本信息
参数
VersionInfo version
版本信息对象 参考2.3 Class VersionInfo
返回值:
返回ErrorInfo对象,具体错误信息参考 2.2 Class ErrorInfobr
2.5.4. 类常量
2.5.4.1. 颜色空间格式
引擎支持的颜色空间格式
CP_PAF_NV21
2050
8-bit Y层,之后是8-bit的2x2 采样的U,V交织层
CP_PAF_BGR24
513
第一个字节为R,第二个字节为G,第三个字节为B
常量名
常量值
常量说明
2.5.4.2. 检测模式
检测模式
常量名
常量值
常量说明
AL_DETECT_MODE_VIDEO
0
视频模式,对连续帧数据进行活体检测,多用于摄像头获取的图像或者视频文件
AL_DETECT_MODE_IMAGE
-1
图片模式,对单帧数据进行活体检测,多用于单张图片
示例代码
                public void Test() {
LivenessEngine engine = new LivenessEngine();
//激活引擎
ErrorInfo error = engine.activeEngine(
MainActivity.this, //应用上下文
"appId", //appid 用户申请 SDK 时获取的 AppID "sdkKey" //sdkkey 用户申请 SDK 时获取的 SDKKey );
Log.d("LivenessSdk", "active result " + error.getCode());
//初始化引擎
error = engine.initEngine(
MainActivity.this, //应用上下文
LivenessEngine.AL_DETECT_MODE_IMAGE //detectMode 检测模式,选择 Image 或Video,Image 模式为单张图检测,Video 适用于连续视频帧数据的检测
);

Log.d("LivenessSdk", "init result " + error.getCode());
Bitmap pic = BitmapFactory.decodeFile("/sdcard/xxx.jpg");
int width = pic.getWidth();
int height = pic.getHeight();
byte[] data = CommonDef.getNV21(width, height, pic);// Bitmap 转 NV21 处理 ArrayList<FaceInfo> faceinfo = new ArrayList<>(); FaceInfo face = new FaceInfo();
face.setRect(
CommonDef.rect //通过 FaceDetect 或 FaceTrack 引擎检测到的人脸框信息
);
face.setDegree(
CommonDef.orient //通过 FaceDetect 或 FaceTrack 引擎检测到的人脸角度信息
);
faceinfo.add(face);
List<LivenessInfo> info = new ArrayList<>(();
//进行活体检测

error = engine.startLivenessDetect(
data,	//data 输入的图像数据
width, //width  图像宽度,应为 4 的倍数
height, //height 图像高度
LivenessEngine.CP_PAF_NV21, //format 图像格式(CP_PAF_NV21, CP_PAF_BGR24) faceinfo, //faceInfos 需要检测的人脸信息
info //	livenessInfos 检测得到的活体结果

);

Log.d("LivenessSdk", "detect result " + error.getCode()); if (error.getCode() == 0) {

if (info.size() > 0) {

Log.d("LivenessSdk", "live info is " + info.get(0).getLiveness());

} else {

Log.d("LivenessSdk", "no face");

}

}
//销毁引擎
engine.unInitEngine();
}