使用虹软ArcFac,java 离线SDK 进行人脸识别

   公司项目需要人脸识别登录,需要支持离线识别,所以无法使用在线的人脸识别的API,于是使用到了离线SDK来对比识别人脸相识度.

   获取人脸抓拍的图片需要对接设备,这里不做记录,假设我们已经获取到了人脸图片,只调用SDK将抓拍的人脸图片与已有的进行人脸库图片对比,具体步骤如下:

  

1.  注册账号,实名认证

     https://ai.arcsoft.com.cn/ucenter/user/userlogin

 

2. 创建应用,在我的应用里面添加SDK,下载sdk到本地

  

 

 

3. 解压SDK,将SDK下的libs文件夹的库文件放到jdk下的lib文件夹下

 

 

 

 

4. 将SDK  libs文件夹下的jar文件导入项目,然后buildpath

 

 

 

 

5. 编写测试代码,进行人脸比对

package net.nblh.faceRecognition.util.faceCompare;
 
import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
import java.io.File;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import com.arcsoft.face.EngineConfiguration;
import com.arcsoft.face.FaceEngine;
import com.arcsoft.face.FaceFeature;
import com.arcsoft.face.FaceInfo;
import com.arcsoft.face.FaceSimilar;
import com.arcsoft.face.FunctionConfiguration;
import com.arcsoft.face.enums.DetectMode;
import com.arcsoft.face.enums.DetectOrient;
import com.arcsoft.face.enums.ErrorInfo;
import com.arcsoft.face.enums.ImageFormat;
import com.arcsoft.face.toolkit.ImageInfo;

 
/**

 * 使用虹软SDK 进行人脸比对

 * @author qxl

 */

public class ArcFaceCompare {

/**

* 初始化引擎

* @param appId

* @param sdkKey

* @return

*/

public static FaceEngine initFaceEngine(String appId,String sdkKey) {

FaceEngine faceEngine = new FaceEngine();

// 激活引擎

int activeCode = faceEngine.activeOnline(appId, sdkKey);

if (activeCode != ErrorInfo.MOK.getValue() && activeCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {

System.out.println("引擎激活失败");

return null;

}

// 引擎配置

EngineConfiguration engineConfiguration = new EngineConfiguration();

engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);

engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);

// 功能配置

FunctionConfiguration functionConfiguration = new FunctionConfiguration();

functionConfiguration.setSupportAge(true);

functionConfiguration.setSupportFace3dAngle(true);

functionConfiguration.setSupportFaceDetect(true);

functionConfiguration.setSupportFaceRecognition(true);

functionConfiguration.setSupportGender(true);

functionConfiguration.setSupportLiveness(true);

functionConfiguration.setSupportIRLiveness(true);

engineConfiguration.setFunctionConfiguration(functionConfiguration);

// 初始化引擎

int initCode = faceEngine.init(engineConfiguration);

if (initCode != ErrorInfo.MOK.getValue()) {

System.out.println("初始化引擎失败");

return null;

}

return faceEngine;

}


/**

* 人脸图片比对

* @param faceEngine 人脸识别引擎对象

* @param picPath1    人脸图片1路径

* @param picPath2    人脸图片2路径

* @return

*/

public static float faceCompare(FaceEngine faceEngine,String picPath1,String picPath2) {

// 人脸检测

ImageInfo imageInfo = getRGBData(new File(picPath1));

List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();

int detectCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),

ImageFormat.CP_PAF_BGR24, faceInfoList);

//System.out.println(faceInfoList);

 

// 特征提取

FaceFeature faceFeature = new FaceFeature();

int extractCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(),

imageInfo.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList.get(0), faceFeature);

//System.out.println("特征值大小:" + faceFeature.getFeatureData().length);

 

// 人脸检测2

ImageInfo imageInfo2 = getRGBData(new File(picPath2));

List<FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>();

int detectCode2 = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(),

imageInfo2.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList2);

//System.out.println(faceInfoList);

 

// 特征提取2

FaceFeature faceFeature2 = new FaceFeature();

int extractCode2 = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(),

imageInfo2.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList2.get(0), faceFeature2);

//System.out.println("特征值大小:" + faceFeature.getFeatureData().length);

 

// 特征比对

FaceFeature targetFaceFeature = new FaceFeature();

targetFaceFeature.setFeatureData(faceFeature.getFeatureData());

FaceFeature sourceFaceFeature = new FaceFeature();

sourceFaceFeature.setFeatureData(faceFeature2.getFeatureData());

FaceSimilar faceSimilar = new FaceSimilar();

int compareCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);

float score = faceSimilar.getScore();

BigDecimal b = new BigDecimal(score); 

//四舍五入,保留四位小数

float similarity =b.setScale(4,BigDecimal.ROUND_HALF_UP).floatValue(); 

System.out.println("相似度:" + similarity);

return similarity;

}

 

 

/**

* 卸载引擎

* @param faceEngine

*/

public static void uninstall(FaceEngine faceEngine) {

faceEngine.unInit();

}

 

 

public static void main(String[] args) {

String appId = "图2创建应用的APP ID";

String sdkKey = "图2创建应用的SDK Key";

//初始化引擎

FaceEngine faceEngine = initFaceEngine(appId,sdkKey);

//进行人脸比对

String picPath1 = "F:\\qxlTest\\1.jpg";

String picPath2 = "F:\\qxlTest\\9.jpg";

float similarity = faceCompare(faceEngine, picPath1, picPath2);

//卸载引擎

uninstall(faceEngine);

}

}

 

6.运行main方法测试

 

注意事项:

A: 虹软人脸识别离线 SDK 每台机器对应一个SDK,第一次激活SDK会与机器绑定,不同的机器需要下载新的SDK
B: 离线 SDK自下载之日起,有效期一年,一年使用时间过后,需要重新下载最新版,同时更新对应的 dll文件, appid 和sdkkey,更新之后请更新以上的APP ID 和 SDK KEY
C: 具体详见官网 https://ai.arcsoft.com.cn/

posted @ 2019-10-08 10:46  fy_qxl  阅读(2586)  评论(0编辑  收藏  举报