/// <summary> /// 返回所有相似度 0.5 以上的人脸,并按相似度倒排序 /// </summary> /// <param name="feature"></param> /// <returns></returns> public List <FindPersonFaceResult> FindPersonFaceByFeature(Feature feature) { var _cache = _personFaceRepository.GetAllPersonFaces(); if (_cache.Count == 0) { return(null); } List <FindPersonFaceResult> resultList = new List <FindPersonFaceResult>(); foreach (var single in _cache) { var sim = _processor.Match(feature.FeatureData, single.FaceFeature); if (sim > 0.5) { FindPersonFaceResult result = new FindPersonFaceResult(); result.PersonFace = single; result.Similar = sim; resultList.Add(result); } } return(resultList .OrderByDescending(r => r.Similar) .ToList()); }
private static void TestMatching() { using (var proccesor = new FaceProcessor("appId", "ftKey", "frKey", true)) { var image1 = Image.FromFile("test2.jpg"); var image2 = Image.FromFile("test.jpg"); var result1 = proccesor.LocateExtract(new Bitmap(image1)); var result2 = proccesor.LocateExtract(new Bitmap(image2)); if ((result1 != null) & (result2 != null)) { Console.WriteLine(proccesor.Match(result1[0].FeatureData, result2[0].FeatureData, true)); } } }
private string[] MatchAll(Feature[] features) { var result = Enumerable.Repeat("陌生人", features.Length).ToArray(); if (_cache.Count == 0) { return(result); } //依次处理找到的人脸 var max = new float[features.Length]; try { _cacheLock.EnterReadLock(); foreach (var single in _cache) { for (var i = 0; i < features.Length; i++) { var sim = _processor.Match(features[i].FeatureData, single.Value); //此方法默认保留采集到的特征(非托管内存),并自动释放被比较(特征库)的特征数据,所以无需担心内存泄露 if (sim > 0.5) { if (sim > max[i]) { max[i] = sim; result[i] = single.Key; } } } } } finally { _cacheLock.ExitReadLock(); } return(result); }