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

匿名 (未验证) 提交于 2019-12-02 21:52:03

   公司项目需要人脸识别登录,需要支持离线识别,所以无法使用在线的人脸识别的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/

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!