Merge remote-tracking branch 'origin/master'
This commit is contained in:
		
						commit
						5d5330dd33
					
				
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -192,7 +192,21 @@
 | 
			
		|||
            <scope>compile</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
<!--        <dependency>-->
 | 
			
		||||
<!--            <groupId>arcsoft</groupId>-->
 | 
			
		||||
<!--            <artifactId>arcsoft</artifactId>-->
 | 
			
		||||
<!--            <version>3.0</version>-->
 | 
			
		||||
<!--            <scope>system</scope>-->
 | 
			
		||||
<!--            <systemPath>${project.basedir}/lib/arcsoft-sdk-face-3.0.0.0-linux.jar</systemPath>-->
 | 
			
		||||
<!--        </dependency>-->
 | 
			
		||||
 | 
			
		||||
                <dependency>
 | 
			
		||||
                    <groupId>arcsoft</groupId>
 | 
			
		||||
                    <artifactId>arcsoft</artifactId>
 | 
			
		||||
                    <version>3.0</version>
 | 
			
		||||
                    <scope>system</scope>
 | 
			
		||||
                    <systemPath>${project.basedir}/lib/arcsoft-sdk-face-3.0.0.0-windows.jar</systemPath>
 | 
			
		||||
                </dependency>
 | 
			
		||||
    </dependencies>
 | 
			
		||||
 | 
			
		||||
    <build>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,7 +39,8 @@ public class FaceMetadataModel {
 | 
			
		|||
   private String ifUseMegviiFaceUrl;
 | 
			
		||||
   @ApiModelProperty("旷视算法版本,多个数据用,分隔")
 | 
			
		||||
   private String openMegviiFaceVersion;
 | 
			
		||||
 | 
			
		||||
   @ApiModelProperty("是否启用虹软算法 默认开启")
 | 
			
		||||
   private String ifRainbowSoftFaceUrl;
 | 
			
		||||
   public FaceMetadataModel() {
 | 
			
		||||
      this.setIfUseBitFaceBoxUrl("2");
 | 
			
		||||
      this.setIfUseGateMachineUrl("2");
 | 
			
		||||
| 
						 | 
				
			
			@ -49,6 +50,15 @@ public class FaceMetadataModel {
 | 
			
		|||
      this.setIfGetMegviiFeature3568Device("2");
 | 
			
		||||
      this.setIfUseMegvii1109FaceUrl("2");
 | 
			
		||||
      this.setIfNoneMegviiFeatureOnlyDevicePhoto("2");
 | 
			
		||||
      this.setIfRainbowSoftFaceUrl("1");
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   public String getIfRainbowSoftFaceUrl() {
 | 
			
		||||
      return ifRainbowSoftFaceUrl;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   public void setIfRainbowSoftFaceUrl(String ifRainbowSoftFaceUrl) {
 | 
			
		||||
      this.ifRainbowSoftFaceUrl = ifRainbowSoftFaceUrl;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   public String getMegvii3288FaceUrl() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,6 @@ import com.alibaba.fastjson.JSON;
 | 
			
		|||
import com.alibaba.fastjson.JSONObject;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import com.bonus.common.core.exception.ServiceException;
 | 
			
		||||
import com.bonus.canteen.core.common.utils.SysUtil;
 | 
			
		||||
import com.bonus.canteen.core.customer.dto.BitmainOtherInfoDTO;
 | 
			
		||||
import com.bonus.canteen.core.customer.dto.BitmainResultDTO;
 | 
			
		||||
| 
						 | 
				
			
			@ -21,12 +20,15 @@ import com.bonus.canteen.core.customer.metadata.service.FaceMetadataService;
 | 
			
		|||
import com.bonus.canteen.core.customer.model.CustInfo;
 | 
			
		||||
import com.bonus.canteen.core.customer.service.CustInfoService;
 | 
			
		||||
import com.bonus.canteen.core.customer.service.FaceRegisterService;
 | 
			
		||||
import com.bonus.canteen.core.customer.utils.ArcFaceHelper;
 | 
			
		||||
import com.bonus.canteen.core.customer.utils.BitmainUtil;
 | 
			
		||||
import com.bonus.canteen.core.customer.utils.FaceResult;
 | 
			
		||||
import com.bonus.canteen.core.customer.utils.UfaceUtil;
 | 
			
		||||
import com.bonus.canteen.core.customer.v4.dto.FaceRegisterDTO;
 | 
			
		||||
import com.bonus.canteen.core.customer.v4.megvii.MegviiUtilV4;
 | 
			
		||||
import com.bonus.canteen.core.customer.vo.MultiModelFaceVO;
 | 
			
		||||
import com.bonus.canteen.core.device.constants.FaceVerTypeEnum;
 | 
			
		||||
import com.bonus.common.core.exception.ServiceException;
 | 
			
		||||
import com.bonus.common.houqin.utils.LeBeanUtil;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
| 
						 | 
				
			
			@ -35,10 +37,7 @@ import org.springframework.web.util.UriComponents;
 | 
			
		|||
import org.springframework.web.util.UriComponentsBuilder;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Iterator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
@Service
 | 
			
		||||
| 
						 | 
				
			
			@ -161,7 +160,10 @@ public class FaceRegisterServiceImpl implements FaceRegisterService {
 | 
			
		|||
   public List<MultiModelFaceVO> multiModelRegisterHandler(UnifiedFaceRegisterParamDTO registerParamDTO, boolean isSaveErrorPicture) {
 | 
			
		||||
      List<MultiModelFaceVO> list = new ArrayList();
 | 
			
		||||
      FaceMetadataModel faceMetadataModel = this.faceMetadataService.queryMetadata();
 | 
			
		||||
      if (!ObjectUtil.isEmpty(faceMetadataModel) && (!"2".equals(faceMetadataModel.getIfUseBitFaceBoxUrl()) || !"2".equals(faceMetadataModel.getIfUseGateMachineUrl()) || !"2".equals(faceMetadataModel.getIfUseMegvii1109FaceUrl()) || !"2".equals(faceMetadataModel.getIfUseMegvii3288FaceUrl()) || !"2".equals(faceMetadataModel.getIfUseMegvii3568FaceUrl()))) {
 | 
			
		||||
      faceMetadataModel.setIfUseMegvii3288FaceUrl("2");
 | 
			
		||||
      if (!ObjectUtil.isEmpty(faceMetadataModel) && (!"2".equals(faceMetadataModel.getIfUseBitFaceBoxUrl()) || !"2".equals(faceMetadataModel.getIfUseGateMachineUrl())
 | 
			
		||||
              || !"2".equals(faceMetadataModel.getIfUseMegvii1109FaceUrl()) || !"2".equals(faceMetadataModel.getIfUseMegvii3288FaceUrl())
 | 
			
		||||
              || !"2".equals(faceMetadataModel.getIfUseMegvii3568FaceUrl()) || !"2".equals(faceMetadataModel.getIfRainbowSoftFaceUrl()))) {
 | 
			
		||||
         BitmainOtherInfoDTO bitmainOtherInfoDTO = (BitmainOtherInfoDTO)BeanUtil.copyProperties(registerParamDTO, BitmainOtherInfoDTO.class, new String[0]);
 | 
			
		||||
         Optional<BitmainResultDTO> bitmainResultDTO = this.registerBitmain(registerParamDTO.getImageBase64(), bitmainOtherInfoDTO);
 | 
			
		||||
         if (bitmainResultDTO.isPresent()) {
 | 
			
		||||
| 
						 | 
				
			
			@ -225,10 +227,32 @@ public class FaceRegisterServiceImpl implements FaceRegisterService {
 | 
			
		|||
                  SysUtil.removeOssObject(registerParamDTO.getMinioPicPath());
 | 
			
		||||
                  throw new ServiceException("[旷世1109算法]:失败");
 | 
			
		||||
               }
 | 
			
		||||
 | 
			
		||||
               list.add(faceFeature1109);
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
         //虹软人脸识别
 | 
			
		||||
         //TODO  待提取公共数据
 | 
			
		||||
         if ("1".equals(faceMetadataModel.getIfRainbowSoftFaceUrl())){
 | 
			
		||||
            System.out.println("开始采集虹软人脸");
 | 
			
		||||
            ArcFaceHelper arcFaceHelper = new ArcFaceHelper();
 | 
			
		||||
            System.out.println("开始采集" + registerParamDTO.getMinioPicPath());
 | 
			
		||||
            String finalUrl = String.format("%s%s", "http://192.168.0.14:9090", registerParamDTO.getMinioPicPath().trim());
 | 
			
		||||
            System.out.println("finalUrl:" + finalUrl);
 | 
			
		||||
            FaceResult faceResult = arcFaceHelper.getFaceFeatures(finalUrl);
 | 
			
		||||
            System.err.println("采集结束");
 | 
			
		||||
            if (faceResult != null){
 | 
			
		||||
               MultiModelFaceVO faceVO = new MultiModelFaceVO();
 | 
			
		||||
               faceVO.setMsg("[软件]成功");
 | 
			
		||||
               faceVO.setFaceVer(Integer.valueOf(FaceVerTypeEnum.FACE_VER_ARC.getKey()));
 | 
			
		||||
               faceVO.setFeature(Base64.getEncoder().encodeToString(faceResult.getFeatures()));
 | 
			
		||||
               faceVO.setSuccess(true);
 | 
			
		||||
               list.add(faceVO);
 | 
			
		||||
               System.out.println("faceResult.getFeatures():" + Base64.getEncoder().encodeToString(faceResult.getFeatures()));
 | 
			
		||||
               System.out.println("人脸采集成功");
 | 
			
		||||
            }else {
 | 
			
		||||
               throw new ServiceException("[虹软算法]:特征值提取失败");
 | 
			
		||||
            }
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
         return list;
 | 
			
		||||
      } else {
 | 
			
		||||
| 
						 | 
				
			
			@ -237,4 +261,11 @@ public class FaceRegisterServiceImpl implements FaceRegisterService {
 | 
			
		|||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   public static String customTrim(String input) {
 | 
			
		||||
      if (input == null || input.isEmpty()) return input;
 | 
			
		||||
      int start = 0, end = input.length() - 1;
 | 
			
		||||
      while (start <= end && Character.isWhitespace(input.charAt(start))) start++;
 | 
			
		||||
      while (end >= start && Character.isWhitespace(input.charAt(end))) end--;
 | 
			
		||||
      return input.substring(start, end + 1);
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,460 @@
 | 
			
		|||
package com.bonus.canteen.core.customer.utils;
 | 
			
		||||
 | 
			
		||||
import com.arcsoft.face.*;
 | 
			
		||||
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 org.apache.commons.lang3.StringUtils;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
 | 
			
		||||
import javax.imageio.ImageIO;
 | 
			
		||||
import java.awt.color.ColorSpace;
 | 
			
		||||
import java.awt.image.BufferedImage;
 | 
			
		||||
import java.awt.image.ColorConvertOp;
 | 
			
		||||
import java.awt.image.DataBufferByte;
 | 
			
		||||
import java.io.*;
 | 
			
		||||
import java.net.URL;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 人脸识别工具类
 | 
			
		||||
 * @author zys
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
public class ArcFaceHelper {
 | 
			
		||||
 | 
			
		||||
    private static final String APP_ID = "52XE2dQBtdmMsfDMvyKmPCD8wfSfJyBsQBsVa2HXS6pg";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * x64
 | 
			
		||||
     */
 | 
			
		||||
    private static final String WIN64_SDK_KEY = "3TMzo8nmWDka6NJDrbX7e2y1ew4QgSia4iGBniyWU4qq";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * linux_64
 | 
			
		||||
     */
 | 
			
		||||
    private static final String LINUX64_SDK_KEY = "3TMzo8nmWDka6NJDrbX7e2y1WpVESExKSnShHKmNAiML";
 | 
			
		||||
	
 | 
			
		||||
	private static FaceEngine faceEngine = null;
 | 
			
		||||
	
 | 
			
		||||
	public static final float STANDARD_SCORE = 0.85F;
 | 
			
		||||
 | 
			
		||||
	static {
 | 
			
		||||
        int errorCode = 0;
 | 
			
		||||
		try{
 | 
			
		||||
            String os = System.getProperty("os.name");
 | 
			
		||||
            if(StringUtils.startsWith(os.toLowerCase(), "win")){
 | 
			
		||||
                faceEngine = new FaceEngine("D:\\arcsoft_lib_64");
 | 
			
		||||
                //激活引擎
 | 
			
		||||
                faceEngine.activeOnline(APP_ID, WIN64_SDK_KEY);
 | 
			
		||||
            } else {
 | 
			
		||||
                faceEngine = new FaceEngine("/data/arcsoft_lib_64");
 | 
			
		||||
                //激活引擎
 | 
			
		||||
                errorCode = faceEngine.activeOnline(APP_ID, LINUX64_SDK_KEY);
 | 
			
		||||
            }
 | 
			
		||||
            System.out.println("引擎激活code:" + errorCode);
 | 
			
		||||
        }catch (Throwable e){
 | 
			
		||||
            System.out.println("加载人脸识别引擎异常:" + e.getMessage());
 | 
			
		||||
        }
 | 
			
		||||
        if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
 | 
			
		||||
            System.out.println("引擎激活失败");
 | 
			
		||||
        }
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static FaceEngine getFaceEngine() {
 | 
			
		||||
		return faceEngine;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public FaceResult getFaceFeatures(String imgSrc) {
 | 
			
		||||
        System.out.println("-----getFaceFeatures");
 | 
			
		||||
        if(imgSrc.contains("http")){
 | 
			
		||||
            System.out.println("-----imgSrc.contains(http)");
 | 
			
		||||
            return getFaceFeatures(getNetUrlHttp(imgSrc));
 | 
			
		||||
        }else{
 | 
			
		||||
            return getFaceFeatures(new File(imgSrc));
 | 
			
		||||
        }
 | 
			
		||||
	}
 | 
			
		||||
    public FaceResult getFaceFeatures2(String imgSrc) {
 | 
			
		||||
        if(imgSrc.contains("http")){
 | 
			
		||||
            return getFaceFeatures(getNetUrlHttp(imgSrc));
 | 
			
		||||
        }else{
 | 
			
		||||
            return getFaceFeatures(new File(imgSrc));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
	public static FaceResult getFaceFeatures(File file) {
 | 
			
		||||
        System.out.println("-----开始识别");
 | 
			
		||||
 | 
			
		||||
        int errorCode = 0;
 | 
			
		||||
        try{
 | 
			
		||||
            String os = System.getProperty("os.name");
 | 
			
		||||
            if(StringUtils.startsWith(os.toLowerCase(), "win")){
 | 
			
		||||
                faceEngine = new FaceEngine("D:\\arcsoft_lib_64");
 | 
			
		||||
                //激活引擎
 | 
			
		||||
                faceEngine.activeOnline(APP_ID, WIN64_SDK_KEY);
 | 
			
		||||
            } else {
 | 
			
		||||
                faceEngine = new FaceEngine("/data/lzhdata/arcsoft_lib_64");
 | 
			
		||||
                //激活引擎
 | 
			
		||||
                errorCode = faceEngine.activeOnline(APP_ID, LINUX64_SDK_KEY);
 | 
			
		||||
            }
 | 
			
		||||
            System.out.println("引擎激活code:" + errorCode);
 | 
			
		||||
        }catch (Throwable e){
 | 
			
		||||
            System.out.println("加载人脸识别引擎异常:" + e.getMessage());
 | 
			
		||||
        }
 | 
			
		||||
        if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
 | 
			
		||||
            System.out.println("引擎激活失败");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        ImageInfoTwo imageInfo = getRGBDataTwo(file);
 | 
			
		||||
		if (imageInfo == null){
 | 
			
		||||
            faceEngine.unInit();
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
		EngineConfiguration engineConfiguration = EngineConfiguration.builder().functionConfiguration(
 | 
			
		||||
                FunctionConfiguration.builder()
 | 
			
		||||
                		.supportFaceDetect(true)
 | 
			
		||||
                        .supportAge(true)
 | 
			
		||||
                        .supportFace3dAngle(true)
 | 
			
		||||
                        .supportFaceDetect(true)
 | 
			
		||||
                        .supportFaceRecognition(true)
 | 
			
		||||
                        .supportGender(true)
 | 
			
		||||
                        .build()).build();
 | 
			
		||||
        //初始化引擎
 | 
			
		||||
        int faceEngineInitCode = faceEngine.init(engineConfiguration);
 | 
			
		||||
        if (faceEngineInitCode != ErrorInfo.MOK.getValue()){
 | 
			
		||||
            System.out.println("初始化引擎失败" + faceEngineInitCode);
 | 
			
		||||
        }
 | 
			
		||||
        //人脸检测
 | 
			
		||||
        List<FaceInfo> lstFaceInfo = new ArrayList<FaceInfo>();
 | 
			
		||||
        faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
 | 
			
		||||
        		ImageFormat.CP_PAF_BGR24, lstFaceInfo);
 | 
			
		||||
        if (lstFaceInfo.size() == 0) {
 | 
			
		||||
            faceEngine.unInit();
 | 
			
		||||
            return null;
 | 
			
		||||
//            throw new NullPointerException("未检测到人脸");
 | 
			
		||||
		}
 | 
			
		||||
        FaceResult result = new FaceResult();
 | 
			
		||||
        //提取人脸特征
 | 
			
		||||
        FaceFeature faceFeature = new FaceFeature();
 | 
			
		||||
        int code = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
 | 
			
		||||
        		ImageFormat.CP_PAF_BGR24, lstFaceInfo.get(0), faceFeature);
 | 
			
		||||
        result.setFeatures(faceFeature.getFeatureData());
 | 
			
		||||
        //人脸信息检测
 | 
			
		||||
        int processCode = faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
 | 
			
		||||
        		ImageFormat.CP_PAF_BGR24, lstFaceInfo,
 | 
			
		||||
        		FunctionConfiguration.builder().supportAge(true).supportFace3dAngle(true).supportGender(true).build());
 | 
			
		||||
        if(code != 0 || processCode != 0){
 | 
			
		||||
            faceEngine.unInit();
 | 
			
		||||
            return null;
 | 
			
		||||
//            throw new IllegalArgumentException("提取特征失败");
 | 
			
		||||
        }
 | 
			
		||||
        //性别提取
 | 
			
		||||
        List<GenderInfo> genderInfoList = new ArrayList<GenderInfo>();
 | 
			
		||||
        int genderCode = faceEngine.getGender(genderInfoList);
 | 
			
		||||
        //0:MALE;1:FEMALE;-1:UNKNOWN
 | 
			
		||||
        result.setSex(genderInfoList.get(0).getGender());
 | 
			
		||||
        //年龄提取
 | 
			
		||||
        List<AgeInfo> ageInfoList = new ArrayList<AgeInfo>();
 | 
			
		||||
        int ageCode = faceEngine.getAge(ageInfoList);
 | 
			
		||||
        result.setAge(ageInfoList.get(0).getAge());
 | 
			
		||||
        //3D信息提取
 | 
			
		||||
        List<Face3DAngle> face3DAngleList = new ArrayList<Face3DAngle>();
 | 
			
		||||
        int face3dCode = faceEngine.getFace3DAngle(face3DAngleList);
 | 
			
		||||
        faceEngine.unInit();
 | 
			
		||||
        return result;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static void unInintEngine() {
 | 
			
		||||
		int code = faceEngine.unInit();
 | 
			
		||||
		System.out.println("销毁引擎:" + code);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static ImageInfo getRGBData(File file) {
 | 
			
		||||
        if (file == null){
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        ImageInfo imageInfo;
 | 
			
		||||
        try {
 | 
			
		||||
            //将图片文件加载到内存缓冲区
 | 
			
		||||
            BufferedImage image = ImageIO.read(file);
 | 
			
		||||
            imageInfo = bufferedImage2ImageInfo(image);
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        return imageInfo;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static ImageInfo bufferedImage2ImageInfo(BufferedImage image) {
 | 
			
		||||
        ImageInfo imageInfo = new ImageInfo();
 | 
			
		||||
        int width = image.getWidth();
 | 
			
		||||
        int height = image.getHeight();
 | 
			
		||||
        // 使图片居中
 | 
			
		||||
        width = width & (~3);
 | 
			
		||||
        height = height & (~3);
 | 
			
		||||
        imageInfo.setWidth(width);
 | 
			
		||||
        imageInfo.setHeight(height);
 | 
			
		||||
        //根据原图片信息新建一个图片缓冲区
 | 
			
		||||
        BufferedImage resultImage = new BufferedImage(width, height, image.getType());
 | 
			
		||||
        //得到原图的rgb像素矩阵
 | 
			
		||||
        int[] rgb = image.getRGB(0, 0, width, height, null, 0, width);
 | 
			
		||||
        //将像素矩阵 绘制到新的图片缓冲区中
 | 
			
		||||
        resultImage.setRGB(0, 0, width, height, rgb, 0, width);
 | 
			
		||||
        //进行数据格式化为可用数据
 | 
			
		||||
        BufferedImage dstImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
 | 
			
		||||
        try {
 | 
			
		||||
        	 if (resultImage.getType() != BufferedImage.TYPE_3BYTE_BGR) {
 | 
			
		||||
                 ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB);
 | 
			
		||||
                 ColorConvertOp colorConvertOp = new ColorConvertOp(cs, dstImage.createGraphics().getRenderingHints());
 | 
			
		||||
                 colorConvertOp.filter(resultImage, dstImage);
 | 
			
		||||
             } else {
 | 
			
		||||
                 dstImage = resultImage;
 | 
			
		||||
             }
 | 
			
		||||
		} catch (Exception e) {
 | 
			
		||||
			// TODO: handle exception
 | 
			
		||||
			System.err.println(e.toString());
 | 
			
		||||
		}
 | 
			
		||||
       
 | 
			
		||||
        //获取rgb数据
 | 
			
		||||
        imageInfo.setRgbData(((DataBufferByte) (dstImage.getRaster().getDataBuffer())).getData());
 | 
			
		||||
        return imageInfo;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static File getNetUrlHttp(String path){
 | 
			
		||||
        //对本地文件命名,path是http的完整路径,主要得到资源的名字
 | 
			
		||||
        String newUrl = path;
 | 
			
		||||
        newUrl = newUrl.split("[?]")[0];
 | 
			
		||||
        String[] bb = newUrl.split("/");
 | 
			
		||||
        //得到最后一个分隔符后的名字
 | 
			
		||||
        String fileName = bb[bb.length - 1];
 | 
			
		||||
 | 
			
		||||
        //保存到本地的路径
 | 
			
		||||
        String filePath;
 | 
			
		||||
        String os = System.getProperty("os.name");
 | 
			
		||||
        if(StringUtils.startsWith(os.toLowerCase(), "win")){
 | 
			
		||||
            filePath = "D:\\images\\"+fileName;
 | 
			
		||||
        } else {
 | 
			
		||||
            filePath = "/data/real_name/faceDetection/"+fileName;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        File file = null;
 | 
			
		||||
 | 
			
		||||
        URL urlfile;
 | 
			
		||||
        InputStream inputStream = null;
 | 
			
		||||
        OutputStream outputStream = null;
 | 
			
		||||
        try{
 | 
			
		||||
            //判断文件的父级目录是否存在,不存在则创建
 | 
			
		||||
            file = new File(filePath);
 | 
			
		||||
            if(!file.getParentFile().exists()){
 | 
			
		||||
                file.getParentFile().mkdirs();
 | 
			
		||||
            }
 | 
			
		||||
            try{
 | 
			
		||||
                //创建文件
 | 
			
		||||
                file.createNewFile();
 | 
			
		||||
            }catch (Exception e){
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
            }
 | 
			
		||||
            //下载
 | 
			
		||||
            urlfile = new URL(newUrl);
 | 
			
		||||
            inputStream = urlfile.openStream();
 | 
			
		||||
            outputStream = new FileOutputStream(file);
 | 
			
		||||
 | 
			
		||||
            int bytesRead = 0;
 | 
			
		||||
            byte[] buffer = new byte[8192];
 | 
			
		||||
            while ((bytesRead=inputStream.read(buffer,0,8192))!=-1) {
 | 
			
		||||
                outputStream.write(buffer, 0, bytesRead);
 | 
			
		||||
            }
 | 
			
		||||
        }catch (Exception e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }finally {
 | 
			
		||||
            try {
 | 
			
		||||
                if (null != outputStream) {
 | 
			
		||||
                    outputStream.close();
 | 
			
		||||
                }
 | 
			
		||||
                if (null != inputStream) {
 | 
			
		||||
                    inputStream.close();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return file;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void main(String[] args) {
 | 
			
		||||
        ArcFaceHelper arcFaceHelper = new ArcFaceHelper();
 | 
			
		||||
        arcFaceHelper.compareFaceFeatures(null,null);
 | 
			
		||||
    }
 | 
			
		||||
    public String  compareFaceFeatures(String file,String  targetUrl) {
 | 
			
		||||
//        FaceEngine faceEngine = new FaceEngine("D:\\arcsoft_lib_64");
 | 
			
		||||
//        FaceEngine faceEngine = new FaceEngine("/opt/jar/gsks/arcsoft_lib_64");
 | 
			
		||||
        //激活引擎
 | 
			
		||||
        FaceEngine faceEngine = null;
 | 
			
		||||
        int errorCode = 0;
 | 
			
		||||
        try{
 | 
			
		||||
            String os = System.getProperty("os.name");
 | 
			
		||||
            if(StringUtils.startsWith(os.toLowerCase(), "win")){
 | 
			
		||||
                faceEngine = new FaceEngine("D:\\arcsoft_lib_64");
 | 
			
		||||
                //激活引擎
 | 
			
		||||
                faceEngine.activeOnline(APP_ID, WIN64_SDK_KEY);
 | 
			
		||||
            } else {
 | 
			
		||||
                faceEngine = new FaceEngine("/data/lzhdata/arcsoft_lib_64");
 | 
			
		||||
                //激活引擎
 | 
			
		||||
                faceEngine.activeOnline(APP_ID, LINUX64_SDK_KEY);
 | 
			
		||||
            }
 | 
			
		||||
        }catch (Throwable e){
 | 
			
		||||
            System.out.println("加载人脸识别引擎异常:" + e.getMessage());
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
//        int errorCode = faceEngine.activeOnline(APP_ID, WIN64_SDK_KEY);
 | 
			
		||||
 | 
			
		||||
        if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
 | 
			
		||||
            System.out.println("引擎激活失败");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        ActiveFileInfo activeFileInfo=new ActiveFileInfo();
 | 
			
		||||
        errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
 | 
			
		||||
        if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
 | 
			
		||||
            System.out.println("获取激活文件信息失败");
 | 
			
		||||
        }
 | 
			
		||||
        //引擎配置
 | 
			
		||||
        EngineConfiguration engineConfiguration = new EngineConfiguration();
 | 
			
		||||
        engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
 | 
			
		||||
        engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
 | 
			
		||||
        engineConfiguration.setDetectFaceMaxNum(10);
 | 
			
		||||
        engineConfiguration.setDetectFaceScaleVal(16);
 | 
			
		||||
        //功能配置
 | 
			
		||||
        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);
 | 
			
		||||
        //初始化引擎
 | 
			
		||||
        errorCode = faceEngine.init(engineConfiguration);
 | 
			
		||||
 | 
			
		||||
        if (errorCode != ErrorInfo.MOK.getValue()) {
 | 
			
		||||
            System.out.println("初始化引擎失败");
 | 
			
		||||
        }
 | 
			
		||||
        ImageInfoTwo imageInfo = getRGBDataTwo(new File(targetUrl));
 | 
			
		||||
        List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
 | 
			
		||||
        errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
 | 
			
		||||
                imageInfo.getImageFormat(), faceInfoList);
 | 
			
		||||
        System.out.println(faceInfoList);
 | 
			
		||||
        if (faceInfoList.isEmpty()){
 | 
			
		||||
            faceEngine.unInit();
 | 
			
		||||
            return "不符合特征值";
 | 
			
		||||
        }
 | 
			
		||||
        //特征提取2
 | 
			
		||||
        FaceFeature faceFeature = new FaceFeature();
 | 
			
		||||
        errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
 | 
			
		||||
                imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
 | 
			
		||||
        System.out.println("特征值大小:" + faceFeature.getFeatureData().length);
 | 
			
		||||
        //人脸检测2
 | 
			
		||||
        ImageInfoTwo imageInfo2 = getRGBDataTwo(new File(file));
 | 
			
		||||
        List<FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>();
 | 
			
		||||
        errorCode = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),
 | 
			
		||||
                imageInfo2.getImageFormat(), faceInfoList2);
 | 
			
		||||
        System.out.println(faceInfoList2);
 | 
			
		||||
        if (faceInfoList2.isEmpty()) {
 | 
			
		||||
            faceEngine.unInit();
 | 
			
		||||
            return "不符合特征值";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //特征提取2
 | 
			
		||||
        FaceFeature faceFeature2 = new FaceFeature();
 | 
			
		||||
        errorCode = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),
 | 
			
		||||
                imageInfo2.getImageFormat(), faceInfoList2.get(0), faceFeature2);
 | 
			
		||||
        System.out.println("特征值大小:" + faceFeature2.getFeatureData().length);
 | 
			
		||||
 | 
			
		||||
        //特征比对
 | 
			
		||||
        FaceFeature targetFaceFeature = new FaceFeature();
 | 
			
		||||
        targetFaceFeature.setFeatureData(faceFeature.getFeatureData());
 | 
			
		||||
        FaceFeature sourceFaceFeature = new FaceFeature();
 | 
			
		||||
        sourceFaceFeature.setFeatureData(faceFeature2.getFeatureData());
 | 
			
		||||
        FaceSimilar faceSimilar = new FaceSimilar();
 | 
			
		||||
 | 
			
		||||
        errorCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
 | 
			
		||||
 | 
			
		||||
        System.out.println("相似度:" + faceSimilar.getScore());
 | 
			
		||||
 | 
			
		||||
        //设置活体测试
 | 
			
		||||
        errorCode = faceEngine.setLivenessParam(0.5f, 0.7f);
 | 
			
		||||
        //人脸属性检测
 | 
			
		||||
        FunctionConfiguration configuration = new FunctionConfiguration();
 | 
			
		||||
        configuration.setSupportAge(true);
 | 
			
		||||
        configuration.setSupportFace3dAngle(true);
 | 
			
		||||
        configuration.setSupportGender(true);
 | 
			
		||||
        configuration.setSupportLiveness(true);
 | 
			
		||||
        errorCode = faceEngine.process(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),
 | 
			
		||||
                imageInfo2.getImageFormat(), faceInfoList2, configuration);
 | 
			
		||||
 | 
			
		||||
        //活体检测
 | 
			
		||||
        List<LivenessInfo> livenessInfoList = new ArrayList<LivenessInfo>();
 | 
			
		||||
        errorCode = faceEngine.getLiveness(livenessInfoList);
 | 
			
		||||
        System.out.println("活体:" + livenessInfoList.get(0).getLiveness());
 | 
			
		||||
 | 
			
		||||
        if (livenessInfoList.get(0).getLiveness() > 0){
 | 
			
		||||
            if (faceSimilar.getScore() > 0.8){
 | 
			
		||||
                faceEngine.unInit();
 | 
			
		||||
                return "符合特征值";
 | 
			
		||||
            }else{
 | 
			
		||||
                faceEngine.unInit();
 | 
			
		||||
                return "不符合特征值";
 | 
			
		||||
            }
 | 
			
		||||
        }else {
 | 
			
		||||
            faceEngine.unInit();
 | 
			
		||||
            return "不符合特征值";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public static ImageInfoTwo getRGBDataTwo(File file) {
 | 
			
		||||
        if (file == null){
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        ImageInfoTwo imageInfo = new ImageInfoTwo();
 | 
			
		||||
        try {
 | 
			
		||||
            //将图片文件加载到内存缓冲区
 | 
			
		||||
            BufferedImage image = ImageIO.read(file);
 | 
			
		||||
            imageInfo = bufferedImage2ImageInfoTwo(image);
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        return imageInfo;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ImageInfoTwo bufferedImage2ImageInfoTwo(BufferedImage image) {
 | 
			
		||||
        ImageInfoTwo imageInfo = new ImageInfoTwo();
 | 
			
		||||
        int width = image.getWidth();
 | 
			
		||||
        int height = image.getHeight();
 | 
			
		||||
        width &= -4;
 | 
			
		||||
        height &= -4;
 | 
			
		||||
        imageInfo.setWidth(width);
 | 
			
		||||
        imageInfo.setHeight(height);
 | 
			
		||||
        BufferedImage resultImage = new BufferedImage(width, height, image.getType());
 | 
			
		||||
        int[] rgb = image.getRGB(0, 0, width, height, (int[])null, 0, width);
 | 
			
		||||
        resultImage.setRGB(0, 0, width, height, rgb, 0, width);
 | 
			
		||||
        BufferedImage dstImage = new BufferedImage(width, height, 5);
 | 
			
		||||
        if (resultImage.getType() != 5) {
 | 
			
		||||
            ColorSpace cs = ColorSpace.getInstance(1004);
 | 
			
		||||
            ColorConvertOp colorConvertOp = new ColorConvertOp(cs, dstImage.createGraphics().getRenderingHints());
 | 
			
		||||
            colorConvertOp.filter(resultImage, dstImage);
 | 
			
		||||
        } else {
 | 
			
		||||
            dstImage = resultImage;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        imageInfo.setImageFormat(ImageFormat.CP_PAF_BGR24);
 | 
			
		||||
        imageInfo.setImageData(((DataBufferByte)((DataBufferByte)dstImage.getRaster().getDataBuffer())).getData());
 | 
			
		||||
        return imageInfo;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
package com.bonus.canteen.core.customer.utils;
 | 
			
		||||
 | 
			
		||||
public class FaceResult {
 | 
			
		||||
 | 
			
		||||
	private Integer age;
 | 
			
		||||
	private Integer sex;
 | 
			
		||||
	private byte[] features;
 | 
			
		||||
 | 
			
		||||
	public Integer getAge() {
 | 
			
		||||
		return age;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setAge(Integer age) {
 | 
			
		||||
		this.age = age;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Integer getSex() {
 | 
			
		||||
		return sex;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setSex(Integer sex) {
 | 
			
		||||
		this.sex = sex;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public byte[] getFeatures() {
 | 
			
		||||
		return features;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setFeatures(byte[] features) {
 | 
			
		||||
		this.features = features;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
package com.bonus.canteen.core.customer.utils;
 | 
			
		||||
 | 
			
		||||
public class ImageInfo {
 | 
			
		||||
 | 
			
		||||
	private byte[] rgbData;
 | 
			
		||||
	private int width;
 | 
			
		||||
	private int height;
 | 
			
		||||
 | 
			
		||||
    public byte[] getRgbData() {
 | 
			
		||||
        return rgbData;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRgbData(byte[] rgbData) {
 | 
			
		||||
        this.rgbData = rgbData;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getWidth() {
 | 
			
		||||
        return width;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setWidth(int width) {
 | 
			
		||||
        this.width = width;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getHeight() {
 | 
			
		||||
        return height;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setHeight(int height) {
 | 
			
		||||
        this.height = height;
 | 
			
		||||
    }
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,56 @@
 | 
			
		|||
package com.bonus.canteen.core.customer.utils;
 | 
			
		||||
 | 
			
		||||
import com.arcsoft.face.enums.ImageFormat;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * FileName: ImageInfoTwo
 | 
			
		||||
 *
 | 
			
		||||
 * @author tqzhang
 | 
			
		||||
 * Date: 2024/5/21 13:10
 | 
			
		||||
 * Description:
 | 
			
		||||
 */
 | 
			
		||||
public class ImageInfoTwo {
 | 
			
		||||
    private byte[] imageData;
 | 
			
		||||
    private Integer width;
 | 
			
		||||
    private Integer height;
 | 
			
		||||
    private ImageFormat imageFormat;
 | 
			
		||||
 | 
			
		||||
    public ImageInfoTwo() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public byte[] getImageData() {
 | 
			
		||||
        if (this.imageData == null) {
 | 
			
		||||
            this.imageData = new byte[0];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this.imageData;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setImageData(byte[] imageData) {
 | 
			
		||||
        this.imageData = imageData;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Integer getWidth() {
 | 
			
		||||
        return this.width;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setWidth(Integer width) {
 | 
			
		||||
        this.width = width;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Integer getHeight() {
 | 
			
		||||
        return this.height;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setHeight(Integer height) {
 | 
			
		||||
        this.height = height;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ImageFormat getImageFormat() {
 | 
			
		||||
        return this.imageFormat;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setImageFormat(ImageFormat imageFormat) {
 | 
			
		||||
        this.imageFormat = imageFormat;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -8,7 +8,8 @@ public enum FaceVerTypeEnum {
 | 
			
		|||
   FACE_VER_UF("30", "宇泛闸机"),
 | 
			
		||||
   FACE_VER_3288("3288", "旷视3288"),
 | 
			
		||||
   FACE_VER_3568("3568", "旷视3568"),
 | 
			
		||||
   FACE_VER_1109("1109", "旷视1109");
 | 
			
		||||
   FACE_VER_1109("1109", "旷视1109"),
 | 
			
		||||
   FACE_VER_ARC("5", "虹软识别");
 | 
			
		||||
 | 
			
		||||
   private final String key;
 | 
			
		||||
   private final String desc;
 | 
			
		||||
| 
						 | 
				
			
			@ -46,6 +47,6 @@ public enum FaceVerTypeEnum {
 | 
			
		|||
 | 
			
		||||
   // $FF: synthetic method
 | 
			
		||||
   private static FaceVerTypeEnum[] $values() {
 | 
			
		||||
      return new FaceVerTypeEnum[]{FACE_VER_BIT, FACE_VER_UF, FACE_VER_3288, FACE_VER_3568, FACE_VER_1109};
 | 
			
		||||
      return new FaceVerTypeEnum[]{FACE_VER_BIT, FACE_VER_UF, FACE_VER_3288, FACE_VER_3568, FACE_VER_1109,FACE_VER_ARC};
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue