public Match <TTemplate> GetBestMatch(IFaceTemplate <TTemplate> template) { var matches = from f in _storedFaces.AsParallel() let faceInfo = f.Value let ageRatio = !EnableAgeFiltering || template.Age == 0 || faceInfo.Age == 0 ? 1 : faceInfo.Age / template.Age where !EnableAgeFiltering || (ageRatio > 0.66f && ageRatio < 1.5f) where !EnableGenderFiltering || (faceInfo.Gender == template.Gender || faceInfo.Gender == Gender.Unknown) let match = faceInfo.GetSimilarity(template) select new Match <TTemplate>(f.Key, match.similarity, match.snapshot, faceInfo); return(matches.Max()); }
public void AddOrUpdate(int id, IFaceTemplate <TTemplate> template) { if (_storedFaces.TryGetValue(id, out var faceInfo)) { faceInfo.AddTemplate(template); } else { var newInfo = _baseFaceInfo.NewInstance(); newInfo.AddTemplate(template); if (newInfo.IsValid(template.Template)) { _storedFaces[id] = newInfo; UpdateNextId(id); } else { throw new ArgumentException($"{nameof(template)} invalid!"); } } }