Beispiel #1
0
        /// <summary>
        /// 人脸比对
        /// </summary>
        /// <param name="bitmap">输入图片</param>
        public static void FaceMatch(Bitmap bitmap)
        {
            var bmpData   = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            var imageData = new ImageData
            {
                PixelArrayFormat = 513,//Rgb24,
                Width            = bitmap.Width,
                Height           = bitmap.Height,
                Pitch            = new int[4] {
                    bmpData.Stride, 0, 0, 0
                },
                ppu8Plane = new IntPtr[4] {
                    bmpData.Scan0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero
                }
            };



            var ret = (ErrorCode)ArcWrapper.Detection(_DEnginer, ref imageData, out pDetectResult);

            if (ret != ErrorCode.Ok)
            {
                bitmap.UnlockBits(bmpData);
                return;
            }

            var detectResult = Marshal.PtrToStructure <DetectResult>(pDetectResult);

            CacheFaceResults.FaceNumber = detectResult.FaceCout;
            for (int i = detectResult.FaceCout; i < _MaxFaceNumber; i++)
            {
                CacheFaceResults[i].ID = "";
            }
            if (detectResult.FaceCout == 0)
            {
                bitmap.UnlockBits(bmpData);
                return;
            }

            if (detectResult.FaceCout == 1)
            {
                CacheFaceResults[0].FFI.FaceRect = Marshal.PtrToStructure <FaceRect>(detectResult.PFaceRect);
                if (ArcWrapper.ExtractFeature(_REngine[0], ref imageData, ref CacheFaceResults[0].FFI, out fm) == (int)ErrorCode.Ok)
                {
                    ArcWrapper.CopyMemory(CacheFaceResults.Items[0].FaceModel.PFeature, fm.PFeature, FeatureSize);
                }
            }
            else
            {
                Task[] ts         = new Task[TaskNum < detectResult.FaceCout ? TaskNum : detectResult.FaceCout];
                int    faceOffset = -1;
                for (int i = 0; i < ts.Length; i++)
                {
                    var rEngine = _REngine[i];
                    ts[i] = Task.Factory.StartNew(() =>
                    {
                        int faceIndex = 0;
                        while ((faceIndex = Interlocked.Increment(ref faceOffset)) < detectResult.FaceCout)
                        {
                            CacheFaceResults[faceIndex].FFI.FaceRect = Marshal.PtrToStructure <FaceRect>(IntPtr.Add(detectResult.PFaceRect, faceIndex * Marshal.SizeOf <FaceRect>()));
                            if (ArcWrapper.ExtractFeature(rEngine, ref imageData, ref CacheFaceResults[faceIndex].FFI, out fm) == (int)ErrorCode.Ok)
                            {
                                ArcWrapper.CopyMemory(CacheFaceResults.Items[faceIndex].FaceModel.PFeature, fm.PFeature, FeatureSize);
                            }
                        }
                    });
                }
                Task.WaitAll(ts);
            }

            bitmap.UnlockBits(bmpData);

            var        tsr          = new Task[TaskNum];
            List <int> noMatchFaces = Enumerable.Range(0, detectResult.FaceCout).ToList();

            for (int i = 0; i < TaskNum; i++)
            {
                var taskIndex = i;
                tsr[i] = Task.Factory.StartNew(() =>
                {
                    var rEngine = _REngine[taskIndex];

                    foreach (var item in _FaceLib[taskIndex].Items.OrderByDescending(ii => ii.OrderId))
                    {
                        _RWL.EnterReadLock();
                        if (noMatchFaces.Count == 0)
                        {
                            _RWL.ExitReadLock();
                            break;
                        }
                        var faceIndexs = noMatchFaces.ToList();
                        _RWL.ExitReadLock();

                        foreach (var faceIndex in faceIndexs)
                        {
                            ArcWrapper.Match(rEngine, ref CacheFaceResults.Items[faceIndex].FaceModel, ref item.FaceModel, out score);

                            if (score > 0.55)
                            {
                                _RWL.EnterWriteLock();
                                noMatchFaces.Remove(faceIndex);
                                _RWL.ExitWriteLock();

                                CacheFaceResults[faceIndex].ID    = item.ID;
                                CacheFaceResults[faceIndex].Score = score;
                                item.OrderId = DateTime.Now.Ticks;
                            }
                        }
                    }
                });
            }

            Task.WaitAll(tsr);
            foreach (var faceIndex in noMatchFaces)
            {
                CacheFaceResults[faceIndex].ID    = "";
                CacheFaceResults[faceIndex].Score = 0;
            }
        }
Beispiel #2
0
        /// <summary>
        /// 人脸比对
        /// </summary>
        /// <param name="bitmap">输入图片</param>
        /// <param name="featureDataIndex">需要转换人脸特征的序号</param>
        public static void FaceMatch(Bitmap bitmap, int featureDataIndex = -1)
        {
            var bmpData   = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            var imageData = new ImageData
            {
                u32PixelArrayFormat = 513,//Rgb24,
                i32Width            = bitmap.Width,
                i32Height           = bitmap.Height,
                pi32Pitch           = new int[4],
                ppu8Plane           = new IntPtr[4]
            };

            imageData.pi32Pitch[0] = bmpData.Stride;
            imageData.ppu8Plane[0] = bmpData.Scan0;



            try
            {
                var ret = (ErrorCode)ArcWrapper.Detection(_DEnginer, ref imageData, out var pDetectResult);
                if (ret != ErrorCode.Ok)
                {
                    return;
                }

                var detectResult = Marshal.PtrToStructure <DetectResult>(pDetectResult);

                FaceResults.FaceNumber = detectResult.nFace;
                if (detectResult.nFace == 0)
                {
                    return;
                }


                for (int i = 0; i < detectResult.nFace; i++)
                {
                    IntPtr p        = new IntPtr(detectResult.rcFace.ToInt32() + i * Marshal.SizeOf <FaceRect>());
                    var    faceRect = Marshal.PtrToStructure <FaceRect>(p);
                    FaceResults[i].Rectangle = new Rectangle(faceRect.left, faceRect.top, faceRect.right - faceRect.left, faceRect.bottom - faceRect.top);

                    p = new IntPtr(detectResult.lfaceOrient.ToInt32() + i * Marshal.SizeOf <int>());
                    var faceOrient = Marshal.PtrToStructure <int>(p);

                    var faceFeatureInput = new FaceFeatureInput
                    {
                        rcFace  = faceRect,
                        lOrient = faceOrient
                    };
                    if ((ErrorCode)ArcWrapper.ExtractFeature(_REngine, ref imageData, ref faceFeatureInput, out var faceModel) != ErrorCode.Ok)
                    {
                        continue;
                    }


                    if (featureDataIndex == i)
                    {
                        if (FaceResults[i].FeatureData == null)
                        {
                            FaceResults[i].FeatureData = new byte[faceModel.lFeatureSize];
                        }
                        Marshal.Copy(faceModel.pbFeature, FaceResults[i].FeatureData, 0, faceModel.lFeatureSize);
                    }
                    bool matched = false;
                    foreach (var item in _FaceLib.Items.OrderByDescending(ii => ii.OrderId))
                    {
                        var fm = item.FaceModel;
                        ArcWrapper.Match(_REngine, ref fm, ref faceModel, out float score);
                        if (score > 0.5)
                        {
                            matched              = true;
                            item.OrderId         = DateTime.Now.Ticks;
                            FaceResults[i].ID    = item.ID;
                            FaceResults[i].Score = score;
                            break;
                        }
                    }
                    if (!matched)
                    {
                        FaceResults[i].ID    = "不认识";
                        FaceResults[i].Score = 0;
                    }
                }
            }
            finally
            {
                bitmap.UnlockBits(bmpData);
            }
        }