コード例 #1
0
        private LocateResult Detect(ImageData offInput, IntPtr pImageData, out ErrorCode ret)
        {
            var retCode =
                TrackingWrapper.AFT_FSDK_FaceFeatureDetect(Engine, ref offInput, out var pDetectResult);

            ret = (ErrorCode)retCode;
            if (ret == ErrorCode.Ok)
            {
                var nativeResult  = pDetectResult.ToStruct <AFT_FSDK_FACERES>();
                var resolveResult = new LocateResult
                {
                    FaceCount   = nativeResult.nFace,
                    FacesOrient = Enumerable.Repeat((OrientCode)nativeResult.lfaceOrient, nativeResult.nFace)
                                  .ToArray()
                };

                resolveResult.Faces        = nativeResult.rcFace.ToStructArray <FaceRect>(resolveResult.FaceCount);
                resolveResult.OffInput     = offInput;
                resolveResult.ImageDataPtr = pImageData;

                return(resolveResult);
            }

            return(default(LocateResult));
        }
コード例 #2
0
        /// <summary>
        ///     根据人脸识别结果返回特征数据数组
        /// </summary>
        /// <param name="faces">人脸识别结果</param>
        /// <param name="autoDispose">是否自动释放人脸识别结果</param>
        /// <exception cref="FaceNotFoundException">如果识别结果中未包含人脸,则抛出此异常</exception>
        /// <returns>脸部特征数据数组</returns>
        public Feature[] ExtractFeatures(LocateResult faces, bool autoDispose = true)
        {
            if (faces.HasFace)
            {
                var features = new List <Feature>();
                for (var faceIndex = 0; faceIndex < faces.FaceCount; faceIndex++)
                {
                    var faceLocation = faces.Faces[faceIndex];
                    var orient       = faces.FacesOrient[faceIndex];

                    var feature = ExtractFeature(faces.OffInput, faceLocation, orient);
                    if (feature != null)
                    {
                        features.Add(feature);
                    }
                }

                if (autoDispose)
                {
                    faces.Dispose();
                }

                return(features.ToArray());
            }

            if (autoDispose)
            {
                faces.Dispose();
            }

            throw new FaceNotFoundException();
        }
コード例 #3
0
        private void AnalyseFinish(IAsyncResult ar)
        {
            var func = ar.AsyncState as Func <LocateResult>;

            try
            {
                LocateResult result = func.EndInvoke(ar);

                this.UpdateStatusFormat("Successfully located {0} of {1} file(s). Matched {2} of {3} file(s) on disk.",
                                        result.LocatedCount,
                                        result.LocatedCount + result.UnlocatedCount,
                                        result.TorrentFileLinks.Where(c => c.State == LinkState.Located)
                                        .Where(c => c.LinkedFsFileInfo != null)
                                        .Select(c => c.LinkedFsFileInfo.FilePath)
                                        .Distinct()
                                        .Count(), this._fileSystemFileInfos.Count);
                this._locateResult   = result;
                this._unlocatedCount = result.UnlocatedCount;

                EntityModel.Update(this._fileSystemEntityModel[0],
                                   result.TorrentFileLinks.Where(c => c.State == LinkState.Located).Select(c => c.LinkedFsFileInfo));
                this.RaisePropertyChanged(() => this.FileSystemEntityModel);

                this.Set(() => this.TorrentEntityModel, ref this._torrentEntityModel,
                         new[] { EntityModel.Load(this._torrent.Name, result) });
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        /// <summary>
        ///     通用的评估函数
        /// </summary>
        /// <param name="locate"></param>
        /// <param name="estimation"></param>
        /// <param name="autoDispose"></param>
        /// <returns>包含额外信息的位置</returns>
        internal LocateResult Estimation(LocateResult locate, Action <ExtraFaceInput> estimation, bool autoDispose = true)
        {
            if (!locate.HasFace)
            {
                return(locate);
            }

            var faceInput = new ExtraFaceInput
            {
                lFaceNumber      = locate.FaceCount,
                pFaceRectArray   = IntPtrExtensions.StructArrayToPtr(locate.Faces),
                pFaceOrientArray =
                    IntPtrExtensions.StructArrayToPtr(locate.FacesOrient.Select(code => (int)code).ToArray())
            };

            try
            {
                estimation(faceInput);

                return(locate);
            }
            finally
            {
                if (autoDispose)
                {
                    locate.Dispose();
                }

                Marshal.FreeHGlobal(faceInput.pFaceRectArray);
                Marshal.FreeHGlobal(faceInput.pFaceOrientArray);
            }
        }
コード例 #5
0
        /// <summary>
        ///     进行检测
        /// </summary>
        /// <param name="imageData">图像数据</param>
        /// <param name="width">图像宽度</param>
        /// <param name="height">图像高度</param>
        /// <param name="result">识别结果</param>
        /// <returns>成功返回 MOK,否则返回失败 code</returns>
        public override ErrorCode Detect(byte[] imageData, int width, int height, out LocateResult result)
        {
            var ret = ErrorCode.Ok;

            result = CommonOperation.OffInputOperation(imageData, width, height,
                                                       (offInput, pImageData) => Detect(offInput, pImageData, out ret));

            return(ret);
        }
コード例 #6
0
        /// <summary>
        ///     进行检测
        /// </summary>
        /// <param name="image">待检测的图像数据</param>
        /// <param name="result">检测结果</param>
        /// <returns>成功返回 MOK,否则返回失败 code</returns>
        public override ErrorCode Detect(Bitmap image, out LocateResult result, LocateOperation operation = LocateOperation.None)
        {
            var ret = ErrorCode.Ok;

            result = CommonOperation.OffInputOperation(image,
                                                       (offInput, pImageData) => Detect(offInput, pImageData, out ret, operation));

            return(ret);
        }
コード例 #7
0
        /// <summary>
        ///     进行检测
        /// </summary>
        /// <param name="imageData">图像数据</param>
        /// <param name="width">图像宽度</param>
        /// <param name="height">图像高度</param>
        /// <param name="result">识别结果</param>
        /// <param name="pixelSize">像素大小</param>
        /// <param name="operation">人脸检测额外操作</param>
        /// <returns>成功返回 MOK,否则返回失败 code</returns>
        public override ErrorCode Detect(byte[] imageData, int width, int height, out LocateResult result,
                                         int pixelSize = 3, LocateOperation operation = LocateOperation.None)
        {
            var ret = ErrorCode.Ok;

            result = CommonOperation.OffInputOperation(imageData, width, height,
                                                       (offInput, pImageData) => Detect(offInput, pImageData, out ret, operation), pixelSize);

            return(ret);
        }
コード例 #8
0
        private LocateResult Locate()
        {
            this._fileSystemFileInfos = FileSystemFileSearcher.SearchFolder(this._sourceFolder);
            var locater = new TorrentFileLocater(this._torrent, this._fileSystemFileInfos,
                                                 () => this.Set(() => this.CurPorcess, ref this._curProcess, this._curProcess + 1));

            this.Set(() => this.MaxProcess, ref this._maxProcess, this._torrent.Files.Length);
            this.Set(() => this.CurPorcess, ref this._curProcess, 0);
            LocateResult result = locater.Locate();

            return(result);
        }
コード例 #9
0
        public static EntityModel Load(string title, LocateResult result)
        {
            var root = new FolderModel(title);

            foreach (TorrentFileLink file in result.TorrentFileLinks)
            {
                var folder    = FindOrCreateFolder(root, file.TorrentFile.Path);
                var fileModel = new FileModel(file.TorrentFile);
                fileModel.Located = file.State == LinkState.Located;
                folder.Entities.Add(fileModel);
            }
            return(root);
        }
コード例 #10
0
        /// <summary>
        ///     静态图片的性别评估
        /// </summary>
        /// <param name="locate">已经识别的人脸位置信息(图片数据未释放,如果释放,将出现异常)</param>
        /// <param name="autoDispose">是否自动释放检测的人脸资源</param>
        /// <returns>包含性别的位置信息</returns>
        public override LocateResult StaticEstimation(LocateResult locate, bool autoDispose = true)
        {
            return(Estimation(locate, input =>
            {
                var code = (ErrorCode)GenderWrapper.ASGE_FSDK_GenderEstimation_StaticImage(Engine, ref locate.OffInput,
                                                                                           ref input,
                                                                                           out var result);
                if (code != ErrorCode.Ok)
                {
                    throw new FaceException(code);
                }

                locate.Genders = result.pResult.ToStructArray <int>(result.lFaceNumber);
            }, autoDispose));
        }
コード例 #11
0
        /// <summary>
        ///     序列帧图片的年龄评估
        /// </summary>
        /// <param name="locate">已经识别的人脸位置信息(图片数据未释放,如果释放,将出现异常)</param>
        /// <param name="autoDispose">是否自动释放检测的人脸资源</param>
        /// <returns>包含年龄的位置信息</returns>
        public override LocateResult PreviewEstimation(LocateResult locate, bool autoDispose = true)
        {
            return(Estimation(locate, input =>
            {
                var code = (ErrorCode)AgeWrapper.ASAE_FSDK_AgeEstimation_Preview(Engine, ref locate.OffInput,
                                                                                 ref input,
                                                                                 out var result);

                if (code != ErrorCode.Ok)
                {
                    throw new FaceException(code);
                }

                locate.Ages = result.pResult.ToStructArray <int>(result.lFaceNumber);
            }, autoDispose));
        }
コード例 #12
0
        /// <summary>
        /// 根据locate数据,从图片中提供人脸特征,先执行 FaceLocateResult() 获得图片的人脸特征
        /// </summary>
        /// <param name="bitmap">图片</param>
        /// <param name="locate">图片中的人脸数据</param>
        /// <returns>返回一个人脸特征,适用于图片中只有一个人脸的情况</returns>
        public Feature GetFaceFeature(Bitmap bitmap, LocateResult locate)
        {
            Feature feature = null;

            var result = _detection.Detect(bitmap, out var locateResult);

            if (result == Stepon.FaceRecognization.Common.ErrorCode.Ok && locateResult.HasFace)
            {
                using (_recognize = new FaceRecognize(AppConfigurations.AppId, AppConfigurations.FrKey))
                {
                    feature = _recognize.ExtractFeature(locate.OffInput, locate.Faces[0], locate.FacesOrient[0]);
                }
            }

            return(feature);
        }
コード例 #13
0
        private LocateResult Detect(ImageData offInput, IntPtr pImageData, out ErrorCode ret, LocateOperation operation = LocateOperation.None)
        {
            System.IntPtr pDetectResult;
            var           retCode =
                TrackingWrapper.AFT_FSDK_FaceFeatureDetect(Engine, ref offInput, out pDetectResult);

            ret = (ErrorCode)retCode;
            if (ret == ErrorCode.Ok)
            {
                var nativeResult  = pDetectResult.ToStruct <AFT_FSDK_FACERES>();
                var resolveResult = new LocateResult
                {
                    FaceCount   = nativeResult.nFace,
                    FacesOrient = Enumerable.Repeat((OrientCode)nativeResult.lfaceOrient, nativeResult.nFace)
                                  .ToArray()
                };

                resolveResult.Faces        = nativeResult.rcFace.ToStructArray <FaceRect>(resolveResult.FaceCount);
                resolveResult.OffInput     = offInput;
                resolveResult.ImageDataPtr = pImageData;

                if (operation.HasFlag(LocateOperation.IncludeAge))
                {
                    //检测年龄
                    if (ageEstimate == null)
                    {
                        throw new InvalidOperationException("请采用年龄识别模块初始化检测器");
                    }
                    resolveResult = ageEstimate.StaticEstimation(resolveResult, false);
                }

                if (operation.HasFlag(LocateOperation.IncludeGender))
                {
                    //性别
                    if (genderEstimate == null)
                    {
                        throw new InvalidOperationException("请采用性别识别模块初始化检测器");
                    }
                    resolveResult = genderEstimate.StaticEstimation(resolveResult, false);
                }

                return(resolveResult);
            }

            return(default(LocateResult));
        }
コード例 #14
0
        private LocateResult Detect(ImageData offInput, IntPtr pImageData, out ErrorCode ret, LocateOperation operation = LocateOperation.None)
        {
            var retCode =
                DetectionWrapper.AFD_FSDK_StillImageFaceDetection(Engine, ref offInput, out var pDetectResult);

            ret = (ErrorCode)retCode;
            if (ret == ErrorCode.Ok)
            {
                var nativeResult  = pDetectResult.ToStruct <AFD_FSDK_FACERES>();
                var resolveResult = new LocateResult {
                    FaceCount = nativeResult.nFace
                };
                var facesOrient = nativeResult.lfaceOrient.ToStructArray <int>(resolveResult.FaceCount);

                resolveResult.FacesOrient  = facesOrient.Select(e => (OrientCode)e).ToArray();
                resolveResult.Faces        = nativeResult.rcFace.ToStructArray <FaceRect>(resolveResult.FaceCount);
                resolveResult.OffInput     = offInput;
                resolveResult.ImageDataPtr = pImageData;

                if (operation.HasFlag(LocateOperation.IncludeAge))
                {
                    //检测年龄
                    if (ageEstimate == null)
                    {
                        throw new InvalidOperationException("请采用年龄识别模块初始化检测器");
                    }
                    resolveResult = ageEstimate.StaticEstimation(resolveResult, false);
                }

                if (operation.HasFlag(LocateOperation.IncludeGender))
                {
                    //性别
                    if (genderEstimate == null)
                    {
                        throw new InvalidOperationException("请采用性别识别模块初始化检测器");
                    }
                    resolveResult = genderEstimate.StaticEstimation(resolveResult, false);
                }

                return(resolveResult);
            }

            return(default(LocateResult));
        }
コード例 #15
0
        /// <summary>
        /// 返回图片人脸数据
        /// </summary>
        /// <param name="bitmap"></param>
        /// <returns></returns>
        public LocateResult FaceLocateResult(Bitmap bitmap)
        {
            LocateResult _locateResult = null;

            var code = _detection.Detect(bitmap, out var locateResult);

            try
            {
                if (code == Stepon.FaceRecognization.Common.ErrorCode.Ok)
                {
                    _locateResult = locateResult;
                }
            }
            catch (Exception error)
            {
                throw new Exception(error.Message);
            }

            return(_locateResult);
        }
コード例 #16
0
        /**
         * Locate a SIGMA on the pyramid.
         */
        public void locate(double sigma, LocateResult result)
        {
            // octave = floor(log2(s))
            int octave = (int)Math.Floor(Math.Log(sigma) / Math.Log(2));
            // scale = logk(s/2^octave)
            // Here we ROUND the scale to an integer value
            double fscale = Math.Log(sigma / (double)(1 << octave))
                            * this.mOneOverLogK;
            int scale = (int)Math.Floor((fscale + 0.5));

            // The last scale in an octave has the same sigma as the first scale
            // of the next octave. We prefer coarser octaves for efficiency.
            if (scale == this.mNumScalesPerOctave - 1)
            {
                // If this octave is out of range, then it will be clipped to
                // be in range on the next step below.
                octave = octave + 1;
                scale  = 0;
            }

            // Clip the octave/scale to be in range of the pyramid
            if (octave < 0)
            {
                result.octave = 0;
                result.scale  = 0;
            }
            else if (octave >= this.mNumOctaves)
            {
                result.octave = this.mNumOctaves - 1;
                result.scale  = this.mNumScalesPerOctave - 1;
            }
            else
            {
                result.octave = octave;
                result.scale  = scale;
            }
            Debug.Assert(result.octave >= 0);                      // , "Octave must be positive");
            Debug.Assert(result.octave < this.mNumOctaves);        //  "Octave must be less than number of octaves");
            Debug.Assert(result.scale >= 0);                       // , "Scale must be positive");
            Debug.Assert(result.scale < this.mNumScalesPerOctave); // "Scale must be less than number of scale per octave");
        }
コード例 #17
0
        private LocateResult Detect(ImageData offInput, IntPtr pImageData, out ErrorCode ret)
        {
            var retCode =
                DetectionWrapper.AFD_FSDK_StillImageFaceDetection(Engine, ref offInput, out var pDetectResult);

            ret = (ErrorCode)retCode;
            if (ret == ErrorCode.Ok)
            {
                var nativeResult  = pDetectResult.ToStruct <AFD_FSDK_FACERES>();
                var resolveResult = new LocateResult {
                    FaceCount = nativeResult.nFace
                };
                var facesOrient = nativeResult.lfaceOrient.ToStructArray <int>(resolveResult.FaceCount);

                resolveResult.FacesOrient  = facesOrient.Select(e => (OrientCode)e).ToArray();
                resolveResult.Faces        = nativeResult.rcFace.ToStructArray <FaceRect>(resolveResult.FaceCount);
                resolveResult.OffInput     = offInput;
                resolveResult.ImageDataPtr = pImageData;

                return(resolveResult);
            }

            return(default(LocateResult));
        }
コード例 #18
0
 public abstract ErrorCode Detect(byte[] imageData, int width, int height, out LocateResult result, int pixelSize = 3, LocateOperation operation = LocateOperation.None);
コード例 #19
0
 public abstract ErrorCode Detect(Bitmap image, out LocateResult result, LocateOperation operation = LocateOperation.None);
コード例 #20
0
 public abstract ErrorCode Detect(Bitmap image, out LocateResult result);
コード例 #21
0
 /// <summary>
 ///     序列帧图片的评估
 /// </summary>
 /// <param name="locate">已经识别的人脸位置信息(图片数据未释放,如果释放,将出现异常)</param>
 /// <param name="autoDispose">是否自动释放检测的人脸资源</param>
 /// <returns>包含额外信息的位置</returns>
 public abstract LocateResult PreviewEstimation(LocateResult locate, bool autoDispose = true);
コード例 #22
0
 public abstract ErrorCode Detect(byte[] imageData, int width, int height, out LocateResult result);
コード例 #23
0
 /// <summary>
 ///     静态图片的评估
 /// </summary>
 /// <param name="locate">已经识别的人脸位置信息(图片数据未释放,如果释放,将出现异常)</param>
 /// <param name="autoDispose">是否自动释放检测的人脸资源</param>
 /// <returns>包含年龄的位置信息</returns>
 public abstract LocateResult StaticEstimation(LocateResult locate, bool autoDispose = true);