Merge remote-tracking branch 'origin/master'

This commit is contained in:
sxu 2025-03-26 16:58:35 +08:00
commit 5d5330dd33
10 changed files with 648 additions and 10 deletions

View File

@ -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>

View File

@ -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() {

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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};
}
}