unsafe void SearchFace() { while (true) { Frame[] frames = null; lock (locker) { if (framesQueue.Count > 0) { frames = framesQueue.Dequeue(); } } if (frames != null) { for (int i = 0; i < frames.Length; ++i) { DateTime dt = DateTime.FromBinary(frames[i].timeStamp); NativeIconExtractor.AddInFrame(frames[i]); } IntPtr target = IntPtr.Zero; int count = NativeIconExtractor.SearchFaces(ref target); if (count > 0) { Target *pTarget = (Target *)target; IList <Target> targets = new List <Target>(); int upLimit = count; if (frames.Length > 1 && Properties.Settings.Default.DetectMotion && Properties.Settings.Default.removeDuplicatedFace) { upLimit = Math.Min(count, Properties.Settings.Default.MaxDupFaces); } for (int i = 0; i < upLimit; i++) { Target face = pTarget[i]; Frame frm = face.BaseFrame; int idx = Array.FindIndex(frames, fm => fm.cameraID == frm.cameraID && fm.image == frm.image && fm.timeStamp == frm.timeStamp); Debug.Assert(idx != -1); targets.Add(face); } Target[] tgArr = new Target[targets.Count]; targets.CopyTo(tgArr, 0); ImageDetail[] imgs = this.SaveImage(tgArr); this.screen.ShowImages(imgs); } NativeIconExtractor.ReleaseMem(); Array.ForEach(frames, f => Cv.Release(ref f.image)); } else { goSearch.WaitOne(); } } }