All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.gdface.sdk.BaseFaceApi Maven / Gradle / Ivy

There is a newer version: 4.2.1
Show newest version
package net.gdface.sdk;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import net.gdface.image.BaseLazyImage;
import net.gdface.image.ImageErrorException;
import net.gdface.image.MatType;
import net.gdface.image.NotImageException;
import net.gdface.image.UnsupportedFormatException;
import net.gdface.sdk.fse.FeatureSe;
import net.gdface.utils.Assert;

/**
 * {@link FaceApi}抽象实现,SDK接口类必须从此类派生
* @author guyadong * */ public abstract class BaseFaceApi implements FaceApi{ protected BaseFaceApi() { } @Override public double compare2Face(byte[] imgData1, CodeInfo facePos1, byte[] imgData2, CodeInfo facePos2) throws NotFaceDetectedException { if(0==imgData1.length){ imgData1=null; } if(0==imgData2.length){ imgData2=null; } byte[] code1, code2; Assert.notNull(facePos1, "facePos1"); Assert.notNull(facePos2, "facePos2"); if (imgData1 == imgData2||null==imgData2) { CodeInfo[] codes = getCodeInfo(imgData1, 2, new CodeInfo[] { facePos1, facePos2 }); code1 = codes[0].getCode(); code2 = codes[1].getCode(); } else { code1 = getCodeInfo(imgData1, 1, new CodeInfo[] { facePos1 })[0].getCode(); code2 = getCodeInfo(imgData2, 1, new CodeInfo[] { facePos2 })[0].getCode(); } return compareCode(code1, code2); } @Override public CompareResult compareFaces(byte[] code, byte[] imgData, int faceNum) throws NotFaceDetectedException, ImageErrorException { CodeInfo[] codes = detectAndGetCodeInfo(imgData,faceNum); double[] similartys = compareCodes(code,codes); return new CompareResult(codes,similartys); } @Override public double detectAndCompare2Face(byte[] imgData1, FRect detectRect1, byte[] imgData2, FRect detectRect2) throws ImageErrorException, NotFaceDetectedException { if(null != imgData1 && 0==imgData1.length){ imgData1=null; } if(null != imgData2 && 0==imgData2.length){ imgData2=null; } byte[] code1, code2; if (imgData1 == imgData2||null==imgData2) { if (detectRect1 == null || null == detectRect2){ throw new IllegalArgumentException("detectRect1,detectRect2 must not be null"); } CodeInfo[] codes = detectAndGetCodeInfo(imgData1, 2); if((detectRect1.contains(codes[0].getPos()) && detectRect2.contains(codes[1].getPos())) || (detectRect2.contains(codes[0].getPos()) && detectRect1.contains(codes[1].getPos()))){ code1 = codes[0].getCode(); code2 = codes[1].getCode(); }else{ // 如果任何检测区域一个没有检测到人脸,则抛出异常 throw new NotFaceDetectedException("not found face in detect rectangle"); } } else { code1 = detectAndGetCodeInfo(imgData1, 1)[0].getCode(); code2 = detectAndGetCodeInfo(imgData2, 1)[0].getCode(); } return compareCode(code1, code2); } @Override public List compareFeatures(byte[] code1,List codes){ if(null == code1 || null == codes){ throw new NullPointerException("code1 or codes is null"); } ArrayList result = new ArrayList(codes.size()); for(byte[] code2:codes){ result.add(compareCode(code1,code2)); } return result; } @Override public double[] compareCodes(byte[] code1,CodeInfo[] codes){ if(null == code1 || null == codes){ throw new NullPointerException("code1 or codes is null"); } double[] result = new double[codes.length]; for(int i = 0;i * 调用{@link BaseLazyImage#setAutoClose(boolean)}设置 autClose为{@code false}
* 如果有特殊要求,子类可以重写此方法 * @param imgData * @return * @throws UnsupportedFormatException * @throws NotImageException * @see BaseLazyImage#open() * @see BaseLazyImage#setAutoClose(boolean) */ protected BaseLazyImage makeOpenedLazyImage(byte[] imgData) throws UnsupportedFormatException, NotImageException { return BaseLazyImage.getLazyImageFactory().create(imgData).setAutoClose(false).open(); } @Override public CodeInfo detectCenterFace(byte[] imgData) throws NotFaceDetectedException, ImageErrorException { BaseLazyImage lazyImg = BaseLazyImage.getLazyImageFactory().create(imgData); CodeInfo centerFace; CodeInfo[] codes = detectFace(imgData); if(codes.length == 0){ throw new NotFaceDetectedException(); } FInt2 center=new FInt2(lazyImg.getWidth()>>1,lazyImg.getHeight()>>1); centerFace=codes[0]; double minDistance = RectUtils.distance(centerFace.getPos(), center); for(int i=1;i faces) throws NotFaceDetectedException { throw new UnsupportedOperationException(); } @Override public FseResult[] searchFaces(byte[] imgData, CodeInfo facePos, double similarty, int rows) throws NotFaceDetectedException, ImageErrorException { if(null == facePos ){ facePos = detectAndGetCodeInfo(imgData, 1)[0]; }else if(null == facePos.getCode()){ facePos = getCodeInfo(imgData, 1, new CodeInfo[] {facePos})[0]; } return this.searchFeatures(facePos.getCode(), similarty, rows); } @Override public FseResult[] matSearchFaces(MatType matType, byte[] matData, int width, int height, CodeInfo facePos, double similarty, int rows) throws NotFaceDetectedException, ImageErrorException { if(null == facePos ){ facePos = matDetectAndGetCodeInfo(matType,matData,width,height, 1)[0]; }else if(null == facePos.getCode()){ facePos = matGetCodeInfo(matType,matData,width,height, facePos); } return this.searchFeatures(facePos.getCode(), similarty, rows); } /** * 返回用于图像检测和建模的图像矩阵的(色彩空间)类型
* 不可返回{@code null} * @return 矩阵类型 */ protected abstract MatType getNativeMatrixType(); /** * 将指定的图像矩阵转为图像检测和建模的图像矩阵的(色彩空间)类型(参见 {@link #getNativeMatrixType()}) * @param matType 输入矩阵类型 * @param matData 矩阵数据 * @param width 矩阵宽度 * @param height 矩阵高度 * @return 转换后的矩阵数据 */ protected abstract byte[] toNativeMatrix(MatType matType, byte[] matData, int width, int height); /** * 从{@link FaceApi}实例获取内存搜索引擎接口实例
* 如果{@link FaceApi}不是{@link BaseFaceApiLocal}实例返回{@code null} * @param faceapi * @return */ public static final FeatureSe getFeatureSeInstance(FaceApi faceapi){ if(faceapi instanceof BaseFaceApiLocal){ return ((BaseFaceApiLocal)faceapi).getFeatureSe(); } return null; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy