Пример #1
0
        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();
                }
            }
        }