Exemplo n.º 1
0
        /// <summary>
        /// 人脸3D角度检测
        /// </summary>
        /// <param name="pEngine">引擎Handle</param>
        /// <param name="imageInfo">图像数据</param>
        /// <param name="multiFaceInfo">检测的人脸信息</param>
        /// <returns>人脸3D角度检测结果结构体</returns>
        public static Face3DAngle Face3DAngleDetection(FaceEngine faceEngine, Image image, MultiFaceInfo multiFaceInfo, out int retCode)
        {
            retCode = -1;
            Face3DAngle face3DAngle = new Face3DAngle();

            try
            {
                if (multiFaceInfo.faceNum <= 0)
                {
                    return(face3DAngle);
                }

                //人脸信息检测
                retCode = faceEngine.ASFProcessEx(image, multiFaceInfo, FaceEngineMask.ASF_FACE3DANGLE);
                if (retCode == 0)
                {
                    //获取人脸3D角度
                    retCode = faceEngine.ASFGetFace3DAngle(out face3DAngle);
                }
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(typeof(FaceUtil), ex);
            }
            return(face3DAngle);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 性别检测
        /// </summary>
        /// <param name="pEngine">引擎Handle</param>
        /// <param name="imageInfo">图像数据</param>
        /// <param name="multiFaceInfo">检测的人脸信息</param>
        /// <returns>性别检测结果结构体</returns>
        public static GenderInfo GenderEstimation(FaceEngine faceEngine, Image image, MultiFaceInfo multiFaceInfo, out int retCode)
        {
            retCode = -1;
            GenderInfo genderInfo = new GenderInfo();

            try
            {
                if (multiFaceInfo.faceNum <= 0)
                {
                    return(genderInfo);
                }

                //人脸信息检测
                retCode = faceEngine.ASFProcessEx(image, multiFaceInfo, FaceEngineMask.ASF_GENDER);
                if (retCode == 0)
                {
                    //获取性别信息
                    retCode = faceEngine.ASFGetGender(out genderInfo);
                }
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(typeof(FaceUtil), ex);
            }
            return(genderInfo);
        }
Exemplo n.º 3
0
        /// <summary>
        /// 年龄检测
        /// </summary>
        /// <param name="pEngine">引擎Handle</param>
        /// <param name="imageInfo">图像数据</param>
        /// <param name="multiFaceInfo">人脸检测结果</param>
        /// <returns>年龄检测结构体</returns>
        public static AgeInfo AgeEstimation(FaceEngine faceEngine, Image image, MultiFaceInfo multiFaceInfo, out int retCode)
        {
            retCode = -1;
            AgeInfo ageInfo = new AgeInfo();

            try
            {
                if (multiFaceInfo.faceNum <= 0)
                {
                    return(ageInfo);
                }
                //人脸信息检测
                retCode = faceEngine.ASFProcessEx(image, multiFaceInfo, FaceEngineMask.ASF_AGE);
                if (retCode == 0)
                {
                    //获取年龄信息
                    retCode = faceEngine.ASFGetAge(out ageInfo);
                }
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(typeof(FaceUtil), ex);
            }
            return(ageInfo);
        }
Exemplo n.º 4
0
        /// <summary>
        /// 提取人脸特征,多人脸默认取第一个人脸特征
        /// </summary>
        /// <param name="pEngine">引擎Handle</param>
        /// <param name="image">图像</param>
        /// <returns>保存人脸特征结构体指针</returns>
        public static FaceFeature ExtractFeature(FaceEngine faceEngine, Image image, out SingleFaceInfo singleFaceInfo, ref int retCode, int faceIndex = 0)
        {
            FaceFeature faceFeature = new FaceFeature();

            singleFaceInfo = new SingleFaceInfo();
            try
            {
                if (image == null)
                {
                    return(faceFeature);
                }
                MultiFaceInfo multiFaceInfo = new MultiFaceInfo();
                //人脸检测
                retCode = faceEngine.ASFDetectFacesEx(image, out multiFaceInfo);
                if (retCode != 0)
                {
                    return(faceFeature);
                }
                singleFaceInfo.faceOrient = multiFaceInfo.faceOrients[faceIndex];
                singleFaceInfo.faceRect   = multiFaceInfo.faceRects[faceIndex];
                retCode = faceEngine.ASFFaceFeatureExtractEx(image, multiFaceInfo, out faceFeature, faceIndex);
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(typeof(FaceUtil), ex);
            }
            return(faceFeature);
        }
Exemplo n.º 5
0
        /// <summary>
        /// 红外活体检测
        /// </summary>
        /// <param name="pEngine">引擎Handle</param>
        /// <param name="imageInfo">图像数据</param>
        /// <param name="singleFaceInfo">单人脸信息</param>
        /// <returns>活体检测结果</returns>
        public static LivenessInfo LivenessInfo_IR(FaceEngine faceEngine, Image image, SingleFaceInfo singleFaceInfo, out int retCode)
        {
            LivenessInfo livenessInfo = new LivenessInfo();

            retCode = -1;
            try
            {
                MultiFaceInfo multiFaceInfo = new MultiFaceInfo();
                multiFaceInfo.faceNum        = 1;
                multiFaceInfo.faceOrients    = new int[1];
                multiFaceInfo.faceOrients[0] = singleFaceInfo.faceOrient;
                multiFaceInfo.faceRects      = new MRECT[1];
                multiFaceInfo.faceRects[0]   = singleFaceInfo.faceRect;
                //人脸信息处理
                retCode = faceEngine.ASFProcessEx_IR(image, multiFaceInfo, FaceEngineMask.ASF_IR_LIVENESS);
                if (retCode == 0)
                {
                    //获取IR活体检测结果
                    retCode = faceEngine.ASFGetLivenessScore_IR(out livenessInfo);
                }
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(typeof(FaceUtil), ex);
            }
            return(livenessInfo);
        }
Exemplo n.º 6
0
        /// <summary>
        /// 提取人脸特征,多人脸默认取第一个人脸特征
        /// </summary>
        /// <param name="pEngine">引擎Handle</param>
        /// <param name="image">图像</param>
        /// <param name="thresold">图像质量检测阈值</param>
        /// <returns>保存人脸特征结构体指针</returns>
        public static FaceFeature ExtractFeature(FaceEngine faceEngine, Image image, float thresoldImg, float thresoleImgMask, ASF_RegisterOrNot registerOrNot, out SingleFaceInfo singleFaceInfo, out bool isMask, ref string featureResult, out int retCode, int faceIndex = 0)
        {
            FaceFeature faceFeature = new FaceFeature();

            singleFaceInfo = new SingleFaceInfo();
            isMask         = false;
            retCode        = -1;
            try
            {
                if (image == null)
                {
                    return(faceFeature);
                }
                MultiFaceInfo multiFaceInfo;
                //人脸检测
                retCode = faceEngine.ASFDetectFacesEx(image, out multiFaceInfo);
                if (retCode != 0 || multiFaceInfo.faceNum <= 0)
                {
                    featureResult = string.Format("{1},接口返回值:{0}", retCode, retCode != 0 ? "人脸检测失败" : "检测到的人脸数为0");
                    return(faceFeature);
                }

                singleFaceInfo.faceOrient   = multiFaceInfo.faceOrients[faceIndex];
                singleFaceInfo.faceRect     = multiFaceInfo.faceRects[faceIndex];
                singleFaceInfo.faceDataInfo = multiFaceInfo.faceDataInfoList[faceIndex];

                //口罩检测
                MaskInfo maskInfo = MaskEstimation(faceEngine, image, singleFaceInfo, out retCode);
                if (retCode != 0 || maskInfo.maskArray == null || maskInfo.maskArray.Length <= 0)
                {
                    featureResult = string.Format("{1},接口返回值:{0}", retCode, retCode != 0 ? "口罩检测失败" : "检测到的口罩结果为空");
                    return(faceFeature);
                }
                isMask = maskInfo.maskArray[0].Equals(1);
                //图像质量检测
                float confidenceLevel = 0.0f;
                retCode = faceEngine.ASFImageQualityDetectEx(image, multiFaceInfo, out confidenceLevel, faceIndex, isMask);
                if (retCode != 0 || confidenceLevel < (isMask ? thresoleImgMask : thresoldImg))
                {
                    featureResult = string.Format("{1},接口返回值:{0}", retCode, retCode != 0 ? "图像质量检测失败" : "图像质量过低");
                    return(faceFeature);
                }
                //特征提取
                retCode = faceEngine.ASFFaceFeatureExtractEx(image, multiFaceInfo, registerOrNot, out faceFeature, faceIndex, isMask);
                if (retCode != 0)
                {
                    featureResult = string.Format("特征提取失败,接口返回值:{0}", retCode);
                }
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(typeof(FaceUtil), ex);
            }
            return(faceFeature);
        }
Exemplo n.º 7
0
        /// <summary>
        /// IR图片人脸检测
        /// </summary>
        /// <param name="pEngine"></param>
        /// <param name="image"></param>
        /// <returns></returns>
        public static MultiFaceInfo DetectFaceIR(FaceEngine faceEngine, Bitmap image)
        {
            MultiFaceInfo multiFaceInfo = null;

            try
            {
                faceEngine.ASFDetectFacesEx(image, out multiFaceInfo, ASF_ImagePixelFormat.ASVL_PAF_GRAY);
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(typeof(FaceUtil), ex);
            }
            return(multiFaceInfo);
        }
Exemplo n.º 8
0
        /// <summary>
        /// 人脸检测
        /// </summary>
        /// <param name="pEngine">引擎Handle</param>
        /// <param name="image">图像</param>
        /// <returns></returns>
        public static MultiFaceInfo DetectFace(FaceEngine faceEngine, Image image)
        {
            MultiFaceInfo multiFaceInfo = new MultiFaceInfo();

            try
            {
                faceEngine.ASFDetectFacesEx(image, out multiFaceInfo);
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(typeof(FaceUtil), ex);
            }
            return(multiFaceInfo);
        }
Exemplo n.º 9
0
        /// <summary>
        /// 提取单人脸特征
        /// </summary>
        /// <param name="pEngine">人脸识别引擎</param>
        /// <param name="image">图片</param>
        /// <param name="singleFaceInfo">单人脸信息</param>
        /// <returns>单人脸特征</returns>
        public static FaceFeature ExtractFeature(FaceEngine faceEngine, Image image, SingleFaceInfo singleFaceInfo)
        {
            FaceFeature faceFeature = new FaceFeature();

            try
            {
                MultiFaceInfo multiFaceInfo = new MultiFaceInfo();
                multiFaceInfo.faceNum        = 1;
                multiFaceInfo.faceOrients    = new int[1];
                multiFaceInfo.faceOrients[0] = singleFaceInfo.faceOrient;
                multiFaceInfo.faceRects      = new MRECT[1];
                multiFaceInfo.faceRects[0]   = singleFaceInfo.faceRect;
                //图片质量检测完成,进行特征提取
                faceEngine.ASFFaceFeatureExtractEx(image, multiFaceInfo, out faceFeature);
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(typeof(FaceUtil), ex);
            }
            return(faceFeature);
        }
Exemplo n.º 10
0
        /// <summary>
        /// 人脸检测
        /// </summary>
        /// <param name="pEngine">引擎Handle</param>
        /// <param name="image">图像</param>
        /// <returns></returns>
        public static MultiFaceInfo DetectFaceAndLandMark(FaceEngine faceEngine, Image image)
        {
            MultiFaceInfo multiFaceInfo = null;

            try
            {
                int retCode = faceEngine.ASFDetectFacesEx(image, out multiFaceInfo);
                if (retCode == 0)
                {
                    LandMarkInfo landmarkInfo = LandMarkEstimation(faceEngine, image, multiFaceInfo, out retCode);
                    if (retCode == 0)
                    {
                        multiFaceInfo.pointAyy = landmarkInfo.pointAyy;
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(typeof(FaceUtil), ex);
            }
            return(multiFaceInfo);
        }
Exemplo n.º 11
0
        static void Main(string[] args)
        {
            var faceengine = new FaceEngine(ASF_RegisterOrNot.ASF_REGISTER, 2);

            //faceengine.OnlineActivation("", "", "");
            FaceEngine.OnlineActivationFree("", "");
            //faceengine.OfflineActivation();


            faceengine.InitEngine(ASF_DetectMode.ASF_DETECT_MODE_IMAGE, ArcSoftFace_OrientPriority.ASF_OP_0_ONLY, 1, ASF_Mask.ASF_FACE_DETECT | ASF_Mask.ASF_FACERECOGNITION | ASF_Mask.ASF_AGE | ASF_Mask.ASF_LIVENESS);
            Console.WriteLine(faceengine.Version.BuildDate);
            Console.WriteLine(faceengine.Version.CopyRight);
            Console.WriteLine(faceengine.Version.Version);
            OpenCvSharp.VideoCapture videoCapture = new OpenCvSharp.VideoCapture();
            videoCapture.Open(0);

            var activeFile = FaceEngine.GetActiveFileInfo();


            ////Console.WriteLine(FaceEngine.GetActiveDeviceInfo());
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Restart();
            //faceengine.InitEngine(ASF_DetectMode.ASF_DETECT_MODE_IMAGE, ArcSoftFace_OrientPriority.ASF_OP_ALL_OUT, 9,
            //    ASF_Mask.ASF_AGE | ASF_Mask.ASF_FACE3DANGLE | ASF_Mask.ASF_FACELANDMARK | ASF_Mask.ASF_FACERECOGNITION | ASF_Mask.ASF_FACESHELTER | ASF_Mask.ASF_FACE_DETECT |
            //     ASF_Mask.ASF_GENDER | ASF_Mask.ASF_IMAGEQUALITY | ASF_Mask.ASF_IR_LIVENESS | ASF_Mask.ASF_LIVENESS | ASF_Mask.ASF_MASKDETECT | ASF_Mask.ASF_UPDATE_FACEDATA);
            //Console.WriteLine($"引擎初始化: {stopwatch.ElapsedMilliseconds}ms");
            Mat mat = new Mat();

            //Mat mat = new Mat(@"C:\Users\Jch\Desktop\2.jpg");
            while (true)
            {
                stopwatch.Restart();

                if (videoCapture.Read(mat))
                {
                    using (var img = mat.ToBitmap())
                        using (var imgInfo = ImageInfo.ReadBMP(img))
                        {
                            Console.WriteLine($"图片处理:{stopwatch.ElapsedMilliseconds}ms");
                            stopwatch.Restart();
                            var detectResult = faceengine.DetectFacesEx(imgInfo);
                            Console.WriteLine($"人脸定位:{stopwatch.ElapsedMilliseconds}ms");
                            if (detectResult != null)
                            {
                                foreach (var item in detectResult.FaceInfos)
                                {
                                    Console.WriteLine($"Age: {item.Age}");
                                    Console.WriteLine($"FaceID: {item.FaceID}");
                                    Console.WriteLine($"FaceOrient: {item.FaceOrient}");
                                    Console.WriteLine($"FaceShelter: {item.FaceShelter}");
                                    Console.WriteLine($"Gender: {item.Gender}");
                                    Console.WriteLine($"LeftEyeClosed: {item.LeftEyeClosed}");
                                    Console.WriteLine($"Liveness: {item.Liveness}");
                                    Console.WriteLine($"Mask: {item.Mask}");
                                    Console.WriteLine($"RightEyeClosed: {item.RightEyeClosed}");
                                    Console.WriteLine($"WearGlasses: {item.WearGlasses}");
                                    Console.WriteLine($"FaceRect: bottom->{item.FaceRect.bottom} left->{item.FaceRect.left} right->{item.FaceRect.right} top->{item.FaceRect.top}");
                                    Console.WriteLine($"FaceLandmark: x->{item.FaceLandmark.x} y->{item.FaceLandmark.x}");
                                    Console.WriteLine($"Face3DAngle: {item.Face3DAngle.roll} {item.Face3DAngle.yaw} {item.Face3DAngle.pitch} {item.Face3DAngle.status}");
                                    stopwatch.Restart();
                                    var feature = faceengine.FaceFeatureExtractEx(imgInfo, item);
                                    Console.WriteLine($"提取特征值: {stopwatch.ElapsedMilliseconds}ms");
                                    if (feature != null)
                                    {
                                        Console.WriteLine($"feature: {feature.Size}");
                                    }
                                    Console.WriteLine(faceengine.FaceFeatureCompare(feature.ASFFaceFeature, feature.ASFFaceFeature));
                                    var score = faceengine.ImageQualityDetectEx(imgInfo, item);
                                    Console.WriteLine($"人脸质量: {score}");
                                    Console.WriteLine("--------------------------------------------");
                                }
                            }
                        }
                }
            }

            Console.ReadLine();
        }
    public BodyEngine AttchHandleEngineToObject(GameObject gb, GameObject viewer, GraphicsEngine ge, Projector proj, RenderEngine re, FaceEngine fe, BodyEngine be,
                                                Image <Gray, byte> img, List <Vector2> axis, bool iscurve)
    {
        BodyEngine he       = gb.AddComponent <BodyEngine>() as BodyEngine;
        bool       isHandle = true;

        he.CreateHandleEngine(viewer, ge, proj, re, fe, be, axis, img, iscurve, isHandle);
        return(he);
    }
    public BodyEngine AttchBodyEngineToObject(GameObject gb, GameObject viewer, GraphicsEngine ge, Projector proj, RenderEngine re, FaceEngine fe,
                                              List <Vector2> axis, bool iscurve)
    {
        BodyEngine be = gb.AddComponent <BodyEngine>() as BodyEngine;

        be.CreateBodyEngine(viewer, ge, proj, re, fe, axis, iscurve);
        return(be);
    }
    public void ReconstructAllGeometries()
    {
        UpdateEngine();

        int i_inst = 0;

        // Fix null detection result
        if (geometries.Count == 0 && exper_isCubeExper)
        {
            SaveInstanceSeg();
        }
        foreach (var geo in geometries)
        {
            i_inst++;
            // Creat GameObject
            GameObject inst = new GameObject("Instance" + i_inst);
            inst.transform.parent = this.gameObject.transform;
            this.m_Inst_list.Add(inst);

            // Creat FaceEngine
            FaceEngine faceEngine = AttchFaceEngineToObject(inst, m_projector, m_renderEngine);
            List <Image <Rgb, byte> > face_imgs   = geo.GetFaceImage();
            List <Image <Rgb, byte> > handle_imgs = geo.GetHandleImage();
            this.m_faceEngine_list.Add(faceEngine);

            // Creat MeshViwer
            GameObject meshViewer = GameObject.Instantiate(m_meshViewer);
            meshViewer.name = m_ImgName + '_' + i_inst;
            this.m_meshViewer_list.Add(meshViewer);

            if (geo.label == Label.Cube)
            {
                Image <Rgb, byte> body_img = geo.GetBodyImage(true);

                // skeleton extractor
                SkeletonExtractor se   = new SkeletonExtractor(geo.GetBodyImage(), face_imgs[0], i_inst);
                bool           iscurve = false;
                List <Vector2> axis    = se.ExtractCubeSkeleton(out iscurve);
                faceEngine.axis     = axis;
                faceEngine.body_img = body_img.Convert <Gray, byte>();
                this.FitTopRect(faceEngine, face_imgs[0].Convert <Gray, byte>());
                BodyEngine bodyEngine = AttchBodyEngineToObject(inst, meshViewer, this, m_projector, m_renderEngine, faceEngine, axis, iscurve);
                this.m_bodyEngine_list.Add(bodyEngine);
                //---------------------------------------------------
                //this.FitBody(bodyEngine);
                //---------------------------------------------------

                // Handle
                List <BodyEngine> m_handleEngine_list = new List <BodyEngine>();
                List <GameObject> m_handleViewer_list = new List <GameObject>();
                int handle_i_inst = 0;
                foreach (Image <Rgb, byte> hi in handle_imgs)
                {
                    GameObject handleViewer = GameObject.Instantiate(m_meshViewer);
                    handleViewer.name = m_ImgName + '_' + i_inst + "_handle" + handle_i_inst;
                    m_handleViewer_list.Add(handleViewer);

                    SkeletonExtractor seh = new SkeletonExtractor(handle_i_inst);
                    seh.SkeletonExtractorHandle(geo.GetBodyImage(), hi);
                    bool           ishcurve = false;
                    List <Vector2> axis_h   = seh.ExtractSkeleton(out ishcurve);

                    BodyEngine handleEngine = AttchHandleEngineToObject(inst, handleViewer, this,
                                                                        m_projector, m_renderEngine, faceEngine, bodyEngine,
                                                                        hi.Convert <Gray, byte>(), axis_h, ishcurve);
                    m_handleEngine_list.Add(handleEngine);
                    handle_i_inst++;
                }
                this.m_handleViewer_lists.Add(m_handleViewer_list);
                this.m_handleEngine_lists.Add(m_handleEngine_list);
            }
            else if (geo.label == Label.Cylinder)
            {
                List <List <Vector2> > face_points = geo.Faces();
                double minerror      = double.MaxValue;
                int    best_face_idx = 0;
                for (int i = 0; i < face_points.Count; i++)
                {
                    double error = faceEngine.LikeAEllipse(face_points[i]);
                    if (error < minerror)
                    {
                        minerror      = error;
                        best_face_idx = i;
                    }
                }
                Image <Rgb, byte> body_img = geo.GetBodyImage(true);
                //body_img = MaskParser.FillBodyWithHandle(body_img, handle_imgs);

                // skeleton extractor
                bool iscurve           = false;
                SkeletonExtractor se   = new SkeletonExtractor(geo.GetBodyImage(), face_imgs, best_face_idx, i_inst);
                List <Vector2>    axis = se.ExtractSkeleton(out iscurve);
                faceEngine.axis     = axis;
                faceEngine.body_img = body_img.Convert <Gray, byte>();

                this.FitTopCircle(faceEngine, face_imgs[best_face_idx].Convert <Gray, byte>());
                BodyEngine bodyEngine = AttchBodyEngineToObject(inst, meshViewer, this, m_projector, m_renderEngine, faceEngine, axis, iscurve);

                this.m_bodyEngine_list.Add(bodyEngine);
                //---------------------------------------------------
                //this.FitBody(bodyEngine);
                //---------------------------------------------------

                // Handle
                List <BodyEngine> m_handleEngine_list = new List <BodyEngine>();
                List <GameObject> m_handleViewer_list = new List <GameObject>();
                int handle_i_inst = 0;
                foreach (Image <Rgb, byte> hi in handle_imgs)
                {
                    GameObject handleViewer = GameObject.Instantiate(m_meshViewer);
                    handleViewer.name = m_ImgName + '_' + i_inst + "_handle" + handle_i_inst;
                    m_handleViewer_list.Add(handleViewer);

                    SkeletonExtractor seh = new SkeletonExtractor(handle_i_inst);
                    seh.SkeletonExtractorHandle(geo.GetBodyImage(), hi);
                    bool           ishcurve = false;
                    List <Vector2> axis_h   = seh.ExtractSkeleton(out ishcurve);

                    BodyEngine handleEngine = AttchHandleEngineToObject(inst, handleViewer, this,
                                                                        m_projector, m_renderEngine, faceEngine, bodyEngine,
                                                                        hi.Convert <Gray, byte>(), axis_h, ishcurve);
                    m_handleEngine_list.Add(handleEngine);
                    handle_i_inst++;
                }
                this.m_handleViewer_lists.Add(m_handleViewer_list);
                this.m_handleEngine_lists.Add(m_handleEngine_list);
            }
        }
////        if(m_bodyEngine_list.Count>1)
//        {
//            FaceEngineMulti m_FEM = new FaceEngineMulti(this, m_projector, m_renderEngine, m_faceEngine_list);
//            m_FEM.Optimize_allRects();
//        }

        foreach (var be in m_bodyEngine_list)
        {
            this.FitBody(be);
        }
    }
 public void FitTopRect(FaceEngine faceEngine, Image <Gray, byte> img)
 {
     faceEngine.SolveRect(img);
 }
 public void FitTopCircle(FaceEngine faceEngine, Image <Gray, byte> img)
 {
     faceEngine.SolveCircle(img);
 }