package com.cdkj.framework.task; import com.arcsoft.face.FaceEngine; import com.arcsoft.face.FaceFeature; import com.arcsoft.face.FaceInfo; import com.arcsoft.face.enums.ErrorInfo; import com.arcsoft.face.toolkit.ImageInfo; import com.chuangdun.arcface.autoconfigure.FaceEnginePool; import com.google.common.base.Preconditions; import com.google.common.base.Verify; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import static com.arcsoft.face.toolkit.ImageFactory.getRGBData; public class BytesFeatureCollectingTask implements Callable{ public static final Logger logger = LoggerFactory.getLogger(BytesFeatureCollectingTask.class); private final byte[] imageData; private final FaceEnginePool faceEnginePool; public BytesFeatureCollectingTask(byte[] imageBytes, FaceEnginePool faceEnginePool){ Preconditions.checkNotNull(imageBytes, "图像数据不能为空."); Preconditions.checkArgument(imageBytes.length > 0, "图像数据长度不能为0."); Preconditions.checkNotNull(faceEnginePool, "FaceEnginePool不能为空."); this.imageData = imageBytes; this.faceEnginePool = faceEnginePool; } @Override public byte[] call() throws Exception { FaceEngine engine = null; try { long readRgbDataStart = System.currentTimeMillis(); ImageInfo imageInfo = getRGBData(imageData); long readRgbDataStop = System.currentTimeMillis(); logger.info("线程:{} 读取图片RGB数据耗时:{}毫秒", Thread.currentThread().getName(), (readRgbDataStop - readRgbDataStart)); engine = faceEnginePool.borrowObject(); List faceInfoList = new ArrayList<>(5); int errorCode = ErrorInfo.MERR_UNKNOWN.getValue(); for (int counter = 0; counter < 3; counter ++){ long detectTimeStart = System.currentTimeMillis(); faceInfoList.clear(); errorCode = engine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList); long detectTimeStop = System.currentTimeMillis(); logger.info("线程:{} 第:{}次尝试人脸检测, 耗时:{}毫秒, 结果码:{}", Thread.currentThread().getName(), counter + 1, (detectTimeStop - detectTimeStart), errorCode); if(errorCode == ErrorInfo.MOK.getValue()){ break; } } Verify.verify(errorCode == ErrorInfo.MOK.getValue(), "人脸检测失败,错误码: %s", errorCode); Verify.verify(faceInfoList.size() <= 1, "检测到%s张人脸.", faceInfoList.size()); Verify.verify(faceInfoList.size() != 0, "照片中没有人脸信息,请重试"); FaceFeature faceFeature = new FaceFeature(); for (int counter = 0; counter < 3; counter ++){ long extractTimeStart = System.currentTimeMillis(); errorCode = engine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature); long extractTimeStop = System.currentTimeMillis(); logger.info("线程:{} 第:{}次尝试提取人脸特征, 耗时:{}毫秒, 结果码:{}", Thread.currentThread().getName(), counter + 1, (extractTimeStop - extractTimeStart), errorCode); if(errorCode == ErrorInfo.MOK.getValue()){ break; } } Verify.verify(errorCode == ErrorInfo.MOK.getValue(), "人脸特征提取失败,错误码:%s", errorCode); return faceFeature.getFeatureData(); } finally { faceEnginePool.returnObject(engine); } } }



