001package net.gdface.sdk; 002 003import java.util.Arrays; 004import java.util.Comparator; 005 006import net.gdface.utils.BufferUtils; 007import net.gdface.utils.BinaryUtils; 008 009/** 010 * FSE搜索结果对象<br> 011 * 该类实现了{@link Comparable}接口,可以根据相似度结果字段({@link FseResult#similarity})排序 012 * @author guyadong 013 * 014 */ 015public class FseResult implements Comparable<FseResult>{ 016 /** 017 * 特征码ID, 018 * 特征码的MD5校验值(使用MD5保证特征码ID的唯一性) 019 */ 020 private byte[] featureId=null; 021 /** 022 * 用于识别特征拥有者的Id 023 * 由应用应用层解释 024 */ 025 private String owner=null; 026 /** 027 * 相似度比较结果,代表当前特征码与输入搜索人脸特征的相似度比较值。 028 */ 029 private double similarity=0; 030 031 public FseResult() { 032 } 033 public FseResult(byte[] featureId, String owner, double similarity) { 034 this.featureId = featureId; 035 this.owner = owner; 036 this.similarity = similarity; 037 } 038 039 @Override 040 public int compareTo(FseResult o) { 041 double sub = similarity - o.similarity; 042 return sub > 0 ? 1 : (sub < 0 ? -1 : 0); 043 } 044 045 /** 046 * 将{@link #owner}转为应用id(Long),如果{@link #owner}为{@code null}则返回{@code null} 047 * @return 048 */ 049 public Long appLongId(){ 050 return asAppID(owner); 051 } 052 /** 053 * 将{@link #owner}转为应用id(Integer),如果{@link #owner}为{@code null}则返回{@code null} 054 * @return 055 */ 056 public Integer appIntId(){ 057 Long l = asAppID(owner); 058 return l == null ? null : l.intValue(); 059 } 060 /** 061 * 用于相似度排序的{@link Comparator}实例 062 */ 063 public static final Comparator<FseResult> COMPARATOR = new Comparator<FseResult>() { 064 @Override 065 public int compare(FseResult o1, FseResult o2) { 066 return o1.compareTo(o2); 067 } 068 }; 069 /** 070 * 从{@link #owner}字段返回Long类型整数, 071 * @param owner HEX格式(32字节长)的MD5 072 * @return owner为{@code null}则返回{@code null} 073 */ 074 public static Long asAppID(String owner){ 075 if(owner != null && owner.getBytes().length == 32){ 076 return BufferUtils.asLongArray(BinaryUtils.hex2Bytes(owner))[1]; 077 } 078 return null; 079 } 080 public byte[] getFeatureId() { 081 return featureId; 082 } 083 public void setFeatureId(byte[] featureId) { 084 this.featureId = featureId; 085 } 086 087 public String getOwner() { 088 return owner; 089 } 090 public void setOwner(String owner) { 091 this.owner = owner; 092 } 093 public double getSimilarity() { 094 return similarity; 095 } 096 public void setSimilarity(double similarity) { 097 this.similarity = similarity; 098 } 099 @Override 100 public int hashCode() { 101 final int prime = 31; 102 int result = 1; 103 result = prime * result + Arrays.hashCode(featureId); 104 result = prime * result + ((owner == null) ? 0 : owner.hashCode()); 105 return result; 106 } 107 @Override 108 public boolean equals(Object obj) { 109 if (this == obj) 110 return true; 111 if (obj == null) 112 return false; 113 if (!(obj instanceof FseResult)) 114 return false; 115 FseResult other = (FseResult) obj; 116 if (!Arrays.equals(featureId, other.featureId)) 117 return false; 118 if (owner == null) { 119 if (other.owner != null) 120 return false; 121 } else if (!owner.equals(other.owner)) 122 return false; 123 return true; 124 } 125 @Override 126 public String toString() { 127 String out=String.format("featureId=[%s],imgMD5=[%s],similarity=%f", BinaryUtils.toHex(featureId),owner,similarity); 128 return out; 129 } 130}