Example #1
0
        /// <summary>
        /// https://github.com/Thxzzzzz/ArcFaceSharp
        /// </summary>
        /// <param name="videoPath"></param>
        /// <param name="videoTitle"></param>
        static void RunOnArcFace(string videoPath, string videoTitle)
        {
            // 视频地址
            VideoCapture capture = new VideoCapture();//@"D:\ca1af880d3653be69ed6d9ce55058c21.mp4"

            capture.Open(videoPath);
            Window      win         = new Window(videoTitle);
            ArcFaceCore arcFaceCore = new ArcFaceCore(APP_ID, SDK_KEY, ArcFaceDetectMode.VIDEO,
                                                      ArcFaceFunction.FACE_DETECT | ArcFaceFunction.FACE_RECOGNITION | ArcFaceFunction.AGE | ArcFaceFunction.FACE_3DANGLE | ArcFaceFunction.GENDER,
                                                      DetectionOrientPriority.ASF_OP_0_ONLY, 50, 32);

            while (true)
            {
                Mat image = new Mat();
                capture.Read(image);
                if (image.Empty())
                {
                    continue;
                }

                Bitmap    bitmap    = image.ToBitmap();
                ImageData imageData = ImageDataConverter.ConvertToImageData(bitmap);
                //人脸检测
                MultiFaceModel multiFaceModel = arcFaceCore.FaceDetection(imageData, false);

                // 人脸信息检测 先调用这个接口才能获取以下三个信息
                arcFaceCore.FaceProcess(imageData, multiFaceModel);
                //获取年龄信息
                List <int> ageList = arcFaceCore.GetAge();
                foreach (var item in ageList)
                {
                    Console.WriteLine("Age:" + item);
                }
                // 获取性别信息
                List <int> genderList = arcFaceCore.GetGender();
                foreach (var item in genderList)
                {
                    Console.WriteLine("Sex:" + item);
                }
                // 获取人脸角度信息
                List <Face3DAngleModel> face3DAngleList = arcFaceCore.GetFace3DAngle();
                //foreach (var item in face3DAngleList)
                //{
                //    Console.WriteLine("Face3D:" + item.);
                //}
                //asfSingleFaceInfo 为人脸检测接口返回的人脸信息中的其中一个人脸信息
                AsfSingleFaceInfo asfSingleFaceInfo = new AsfSingleFaceInfo();
                try
                {
                    AsfFaceFeature asfFaceFeature = arcFaceCore.FaceFeatureExtract(imageData, ref asfSingleFaceInfo);
                }
                catch (ResultCodeException e)
                {
                    Console.WriteLine(e.ResultCode);
                    //throw;
                }

                win.Image = bitmap.ToMat();

                // 释放销毁引擎
                arcFaceCore.Dispose();
                // ImageData使用完之后记得要 Dispose 否则会导致内存溢出
                imageData.Dispose();
                //faceData2.Dispose();
                // BItmap也要记得 Dispose
                //face1.Dispose();
                bitmap.Dispose();
            }
        }
Example #2
0
        public void TestMethod1()
        {
            // SDK对应的 APP_ID SDK_KEY
            string APP_ID = @"7NK7KSpfgxdqb74r8nvy36kDwH3wVGstr2LHGHBxQ8LY";

            string SDK_KEY = @"3fD8vKYMNfPzKHMoqppjA9chGh2aGkWzUQNFiAj7Yq63";

            // 加载图片
            Bitmap heying = new Bitmap(@"heying.jpg");

            Bitmap face1 = new Bitmap(@"ldh0.jpg");
            Bitmap face2 = new Bitmap(@"ldh1.jpg");

            Bitmap face3 = new Bitmap(@"zxy0.jpg");

            // 创建 ArcFaceCore 对象,向构造函数传入相关参数进行 ArcFace 引擎的初始化
            ArcFaceCore arcFace = new ArcFaceCore(APP_ID, SDK_KEY, ArcFaceDetectMode.IMAGE,
                                                  ArcFaceFunction.FACE_DETECT | ArcFaceFunction.FACE_RECOGNITION | ArcFaceFunction.AGE | ArcFaceFunction.FACE_3DANGLE | ArcFaceFunction.GENDER, DetectionOrientPriority.ASF_OP_0_ONLY, 50, 32);

            // 将 Bitmap 转换成 ImageData
            ImageData heyingImgData = ImageDataConverter.ConvertToImageData(heying);

            // 人脸检测
            // 也可直接传入 Bitmap 来调用相关接口 会自动转换成 ImageData,但这里推荐用 ImageData
            MultiFaceModel multiFaceB = arcFace.FaceDetection(heying);
            // 传入 ImageData ,推荐使用这个接口
            MultiFaceModel multiFace = arcFace.FaceDetection(heyingImgData);

            // 人脸信息检测(年龄/性别/人脸3D角度)最多支持4张人脸信息检测,超过部分返回未知 这是官方文档的说明
            arcFace.FaceProcess(heyingImgData, multiFace);

            // 获取年龄信息
            List <int> ageList = arcFace.GetAge();
            // 获取性别信息
            List <int> genderList = arcFace.GetGender();
            // 获取人脸角度信息
            List <Face3DAngleModel> face3DAngleList = arcFace.GetFace3DAngle();


            // 将第一张图片的 Bitmap 转换成 ImageData
            ImageData faceData1 = ImageDataConverter.ConvertToImageData(face1);

            // 检测第一张图片中的人脸
            MultiFaceModel multiFace1 = arcFace.FaceDetection(faceData1);

            // 取第一张图片中返回的第一个人脸信息
            AsfSingleFaceInfo faceInfo1 = multiFace1.FaceInfoList.First();

            // 提第一张图片中返回的第一个人脸的特征
            AsfFaceFeature faceFeature1 = arcFace.FaceFeatureExtract(faceData1, ref faceInfo1);



            ImageData faceData2 = ImageDataConverter.ConvertToImageData(face2);

            // 检测第二张图片中的人脸
            MultiFaceModel multiFace2 = arcFace.FaceDetection(faceData2);

            // 取第二张图片中返回的第一个人脸信息
            AsfSingleFaceInfo faceInfo2 = multiFace2.FaceInfoList.First();

            // 提第二张图片中返回的第一个人脸的特征
            AsfFaceFeature faceFeature2 = arcFace.FaceFeatureExtract(faceData2, ref faceInfo2);



            // face1 face2 人脸对比,将会返回一个 0-1 之间的浮点数值
            float result = arcFace.FaceCompare(faceFeature1, faceFeature2);



            ImageData faceData3 = ImageDataConverter.ConvertToImageData(face3);

            // 检测第二张图片中的人脸
            MultiFaceModel multiFace3 = arcFace.FaceDetection(faceData3);

            // 取第二张图片中返回的第一个人脸信息
            AsfSingleFaceInfo faceInfo3 = multiFace3.FaceInfoList.First();

            // 提第二张图片中返回的第一个人脸的特征
            AsfFaceFeature faceFeature3 = arcFace.FaceFeatureExtract(faceData3, ref faceInfo3);

            // face1 face3 人脸对比,将会返回一个 0-1 之间的浮点数值
            float result2 = arcFace.FaceCompare(faceFeature1, faceFeature3);


            // 释放销毁引擎
            arcFace.Dispose();
            // ImageData使用完之后记得要 Dispose 否则会导致内存溢出
            faceData1.Dispose();
            faceData2.Dispose();
            // BItmap也要记得 Dispose
            face1.Dispose();
            face2.Dispose();
        }