1. SDK初始化
public boolean initFaceSdkInstance(Context context, String licencePath) {
//初始化配置文件
int ret = SunmiFaceSDK.init(confPath);
if (licencePath == null) {
Log.d(TAG, "Please input licence");
return false;
}
File f = new File(licencePath);
if (!f.exists()) {
Log.d(TAG, "licence is not exist");
return false;
}
String licence = readToString(licencePath);
//验证Licence
ret = SunmiFaceSDK.verifyLicence(context, licence);
if (ret != 0) {
Log.d(TAG, "Licence is not OK ErrorCode " + ret);
return false;
}
//设置配置参数
SunmiFaceConfigParam param = new SunmiFaceConfigParam();
SunmiFaceSDK.getConfig(param);
param.setDistance_threshold_(1.3f);
param.setYaw_threshold_(50.0f);
param.setPitch_threshold_(50.0f);
param.setRoll_threshold_(50.0f);
param.setMin_face_size(60);
param.setImage_quality_threshold_(10);
param.setMin_luminance_(10);
param.setMax_luminance_(180);
param.setLiveness_on_(false);
param.setThread_num_(1);
//设置配置参数
ret = SunmiFaceSDK.setConfig(param);
if (ret != 0) {
Log.d(TAG, "param is not init");
return false;
}
return true;
}
public void init(Context context) {
//设置licence_valid.txt为sd卡路径,也可以换成app运行工作目录。
String licencePath = Environment.getExternalStorageDirectory() + File.separator + "licence_valid.txt";
initFaceSdkInstance(context, licence_path);
// 调用IPCameraManager静态类getInstance初始化IPCManger对象
mIPCManager = IPCameraManager.getInstance(context);
}
2. 获取摄像头预览信息
//摄像头数据回调接口
CameraDataCallback cameraDataCallback = new CameraDataCallback() {
@Override
public void onImageDataArrival(Bitmap bitmap, int width, int height) {
if (mBackgroundHandler != null) {
if (mClickAction == 1 && !faceDetectState.get()) {
mBackgroundHandler.post(new MotionDetector(bitmap, width, height));
} else {
bitmap.recycle();
}
}
}
};
//开启摄像头预览
FaceCameraManager.getInstance().startPreview(getApplicationContext(), this, FaceCameraManager.getInstance().getCurCamera(), cameraView, PREVIEW_WIDTH, PREVIEW_HEIGHT, cameraDataCallback);
3. 获取摄像头拍照数据
{
//根据摄像头是USB还是系统摄像头,调用不同的方法,获取bitmap数据
if (FaceCameraManager.getInstance().getCurCamera() == FaceCameraManager.CAMERA_USB)
bitmap = mUVCCameraView.captureStillImage();
else
bitmap = mTextureView.getBitmap();
}
4. 获取特征值
说明:通过bitmap获取特征值
public ArrayList‹SunmiFaceFeature› getFeatures(Bitmap bitmap, int maxFace) {
int ret = 0;
//bitmap的RGB数据转化成BGR数据
byte[] srcData = ImageUtils.getPixelsBGR(bitmap);
//通过BGR数据构造SunmifaceImage对象
SunmiFaceImage image = new SunmiFaceImage(srcData, bitmap.getHeight(), bitmap.getWidth(), maxFace);
SunmiFaceImageFeatures features = new SunmiFaceImageFeatures();
//从SunmifaceImage数据中提取人脸特征
ret = SunmiFaceSDK.getImageFeatures(image, features);
//返回人脸特征数组
SunmiFaceFeature feature_ary = features.getFeatures_();
ArrayList‹SunmiFaceFeature› arrayList = new ArrayList‹›();
if (features.getFeatures_count_() == 0) {
SunmiFaceSDK.releaseImageFeatures(features);
return arrayList;
}
for (int i = 0; i ‹ features.getFeatures_count_(); i++) {
SunmiFaceFeature sunmiFaceFeature = SunmiFaceLib.SunmiFaceFeatureArray_getitem(feature_ary, i);
arrayList.add(sunmiFaceFeature);
}
SunmiFaceSDK.releaseImageFeatures(features);
return arrayList;
// return getFeature(srcData, bitmap.getWidth(),bitmap.getHeight(), 1);
}
5. 人脸特征值比较
public SunmiFaceCompareResult compareFeature1V1(float similar, float[] feature1, float[] feature2) {
//构造SunmiFaceFeature对象
SunmiFaceFeature feat1 = new SunmiFaceFeature();
SunmiFaceFeature feat2 = new SunmiFaceFeature();
feat1.setFeature_(feature1);
feat2.setFeature_(feature2);
SunmiFaceCompareResult result = new SunmiFaceCompareResult();
//调用compare1v1进行比较
int ret = SunmiFaceSDK.compare1v1(feat1, feat2, result);
return result;
}
6. 人脸会员库添加
说明: 添加人脸时,同时要向IPC注册人脸信息。向IPC传递信息包括:人脸会员库(GVIP),人脸照片、人脸会员唯一识别ID。
{
//使用faceFeature构建record
SunmiFaceDBRecord record = SunmiFaceSDK.faceFeature2FaceDBRecord(faceFeature);
record.setId_(user.getUserId());
record.setName_(user.getUserName());
//把record添加到人脸库
int ret = SunmiFaceSDK.addDBRecord(record);
//把人脸照片传递给IPC,向IPC添加人脸记录
if (mIPCManager != null) {
mIPCManager.addFaceRecord("GVIP", picPath, uid, new RPCCallback‹RPCResponse›() {
//IPC人脸添加记录完成后回调接口
@Override
public void onComplete(RPCResponse result) {
Log.i(TAG, "addFaceRecord, code:" + result.code());
}
//IPC人脸添加记录失败时回调接口
@Override
public void onAbort(int httpStatus) {
Log.i(TAG, "addFaceRecord, httpStatus:" + httpStatus);
}
//IPC人脸添加记录异常时回调接口
@Override
public void onException(Throwable t) {
Log.i(TAG, "addFaceRecord, Exception:" + t.getMessage());
}
});
}
}
7. 删除特征记录
说明: 删除会员信息时,需要把删除的人脸会员信息同步到IPC。向IPC传递用户的唯一识别ID
{
//删除人脸库记录
int result = SunmiFaceSDK.deleteDBRecord(user.getImageName());
//同步删除IPC人脸记录
if (mIPCManager != null) {
mIPCManager.deleteFaceRecord("GVIP", userId, new RPCCallback‹RPCResponse‹RPCResponse.FaceDeleteSubResult››() {
//IPC人脸删除记录完成后回调接口
@Override
public void onComplete(RPCResponse‹RPCResponse.FaceDeleteSubResult› result) {
Log.i(TAG, "deleteFaceRecord, code:" + result.code());
}
});
}
}
8 会员注册
/*
*向系统注册会员信息
*@groupname, 会员组
*@userNanem, 会员名
*@picPath, 会员照片存放路劲
*@userInfo, 会员详情
*@faceFeature, 会员照片提取的特征值
*/
public boolean registerUserIntoDBmanager(String groupName, String userName, String picPath, String userInfo, SunmiFaceFeature faceFeature) {
boolean isSuccess = false;
Group group = new Group();
group.setGroupId(groupName);
//创建会员
User user = new User();
user.setGroupId(groupName);
//final String uid = UUID.randomUUID().toString();
String uid = String.valueOf(System.currentTimeMillis());
user.setUserId(uid);
user.setUserName(userName);
user.setFeature(faceFeature.getFeature_());
//创建人脸库记录信息
SunmiFaceDBRecord record = SunmiFaceSDK.faceFeature2FaceDBRecord(faceFeature);
record.setId_(user.getUserId());
record.setName_(user.getUserName());
//像人脸库添加记录
int ret = SunmiFaceSDK.addDBRecord(record);
if (ret != 0) {
Log.d(TAG, "addDBRecord failed " + SunmiFaceSDK.getErrorString(ret));
return false;
}
//在会员数据库中记录,特征值对应的图片在人脸数据中的ID
user.setImageName(record.getImg_id_());
if (userInfo != null) {
user.setUserInfo(userInfo);
}
// 添加用户信息到数据库
boolean importUserSuccess = FaceManager.getInstance().userAdd(user);
if (importUserSuccess) {
// 如果添加到数据库成功,则添加用户组信息到数据库
// 如果当前图片组名和上一张图片组名相同,则不添加数据库到组表
if (FaceManager.getInstance().groupAdd(group)) {
isSuccess = true;
if (mIPCManager != null) {
Log.i(TAG, "picPath: " + picPath);
Log.i(TAG, "uid: " + uid);
//把会员照片同步发送到IPC,同步会员信息到IPC
mIPCManager.addFaceRecord("GVIP", picPath, uid, new RPCCallback‹RPCResponse›() {
@Override
public void onComplete(RPCResponse result) {
Log.i(TAG, "addFaceRecord, code:" + result.code());
}
@Override
public void onAbort(int httpStatus) {
Log.i(TAG, "addFaceRecord, httpStatus:" + httpStatus);
}
@Override
public void onException(Throwable t) {
Log.i(TAG, "addFaceRecord, Exception:" + t.getMessage());
}
});
}
} else {
isSuccess = false;
}
} else {
isSuccess = false;
}
return isSuccess;
}
9. IPC 回调接口
说明:用户获取IPC的状态、返回信息等。
{
//获取IPC信息
IPCameraManager manager = IPCameraManager.getInstance(getApplicationContext());
//IPC初始化
manager.init("test", "123456", "123456");
//注册IPC回调
manager.registerListener(new IPCameraListener() {
//IPC设备在线时回调接口
@Override
public void onDeviceOnline(IPCameraInfo device) {
showToast("[ " + device.getDeviceid() + " ]上线");
}
//IPC设备离线时回调接口
@Override
public void onDeviceOffline(IPCameraInfo device) {
showToast("[ " + device.getDeviceid() + " ]离线");
}
//IPC设备获取到进店信息后回调接口
@Override
public void onFaceDetect(String userId) {
String userName = null;
List‹User› users = DBManager.getInstance().queryUserByUserId(userId);
if (users != null && users.size() › 0) {
userName = users.get(0).getUserName();
}
if (userName == null) {
showToast("未注册的用户进店");
} else {
User user = users.get(0);
UserEvent userEvent = new UserEvent();
userEvent.setUserId(user.getUserId());
userEvent.setEnterTime(System.currentTimeMillis());
userEvent.setDesc("Enter Store");
DBManager.getInstance().addUserEvent(userEvent);
showToast("用户[ " + userName + " ]进店");
}
}
}
}