/// <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);
        }
        /// <summary>
        ///     进行检测
        /// </summary>
        /// <param name="imageData">图像数据</param>
        /// <param name="width">图像宽度</param>
        /// <param name="height">图像高度</param>
        /// <param name="result">识别结果</param>
        /// <param name="pixelSize">像素大小</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));

            return(ret);
        }
        /// <summary>
        ///     定位并抽取特征数据
        /// </summary>
        /// <param name="image">待处理的图像</param>
        /// <param name="operation">抽取操作</param>
        /// <returns>特征数据数组</returns>
        public Feature[] LocateExtract(Bitmap image, LocateOperation operation = LocateOperation.None)
        {
            var code = _locator.Detect(image, out var location, operation);

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

            if (!location.HasFace)
            {
                //释放资源
                location.Dispose();
                return(null);
            }
            ;

            var features = _recognize.ExtractFeatures(location);

            return(features);
        }
 public abstract ErrorCode Detect(byte[] imageData, int width, int height, out LocateResult result, int pixelSize = 3, LocateOperation operation = LocateOperation.None);
 public abstract ErrorCode Detect(Bitmap image, out LocateResult result, LocateOperation operation = LocateOperation.None);
        private LocateResult Detect(ImageData offInput, IntPtr pImageData, out ErrorCode ret, LocateOperation operation = LocateOperation.None)
        {
            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;

                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));
        }
        /// <summary>
        ///     定位并抽取特征数据
        /// </summary>
        /// <param name="imageData">待处理的图像数据</param>
        /// <param name="width">图像宽度</param>
        /// <param name="height">图像高度</param>
        /// <param name="pixelSize">像素大小</param>
        /// <param name="operation">抽取操作</param>
        /// <returns>特征数据数组</returns>
        public Feature[] LocateExtract(byte[] imageData, int width, int height, int pixelSize = 3, LocateOperation operation = LocateOperation.None)
        {
            var code = _locator.Detect(imageData, width, height, out var location, pixelSize, operation);

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

            if (!location.HasFace)
            {
                //释放资源
                location.Dispose();
                return(null);
            }
            ;

            var features = _recognize.ExtractFeatures(location);

            return(features);
        }
Example #8
0
        private LocateResult Detect(ImageData offInput, IntPtr pImageData, out ErrorCode ret, LocateOperation operation = LocateOperation.None)
        {
            System.IntPtr pDetectResult;
            var           retCode =
                DetectionWrapper.AFD_FSDK_StillImageFaceDetection(Engine, ref offInput, out 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));
        }