示例#1
0
 /// <summary>
 /// 人脸信息检测(年龄/性别/人脸3D角度)最多支持4张人脸信息检测,超过部分返回未知
 /// </summary>
 /// <param name="bitmap"></param>
 /// <param name="detectedFaces">检测到的人脸信息</param>
 /// <param name="combinedMask">初始化中参数combinedMask与ASF_AGE| ASF_GENDER| ASF_FACE3DANGLE的交集的子集</param>
 public void FaceProcess(Bitmap bitmap, MultiFaceModel detectedFaces, uint combinedMask = ArcFaceFunction.AGE | ArcFaceFunction.FACE_3DANGLE | ArcFaceFunction.GENDER)
 {
     using (ImageData imgData = ImageDataConverter.ConvertToImageData(bitmap))
     {
         FaceProcess(imgData.Width, imgData.Height, imgData.Format, imgData.PImageData, detectedFaces, combinedMask);
     }
 }
示例#2
0
        /// <summary>
        /// 播放摄像头线程
        /// </summary>
        private void Play_Camera()
        {
            while (bPlayflag)
            {
                Mat cFrame = new Mat();
                try
                {
                    m_vCapture.Read(cFrame);
                    int sleepTime = (int)Math.Round(1000 / m_vCapture.Fps);
                    Cv2.WaitKey(sleepTime);
                    if (cFrame.Empty())
                    {
                        continue;
                    }
                    Cv2.Flip(cFrame, cFrame, OpenCvSharp.FlipMode.Y);

                    #region 人脸追踪
                    //检测人脸,得到Rect框
                    MultiFaceModel multiFaceInfo = arcFace.FaceDetection(cFrame.ToBitmap());
                    if (multiFaceInfo.FaceInfoList.Count > 0)
                    {
                        Mrect mrect = multiFaceInfo.FaceInfoList[0].faceRect;
                        Rect cMaxrect = new Rect(mrect.left, mrect.top, mrect.right - mrect.left, mrect.bottom - mrect.top);
                        //绘制指定区域(人脸框)
                        Scalar color = new Scalar(0, 0, 255);
                        Cv2.Rectangle(cFrame, cMaxrect, color, 1);

                        if (bTakePicture)//拍照,截取指定区域
                        {
                            Mat cHead = new Mat(cFrame, cMaxrect);
                            Cv2.ImWrite(PicSavePath, cHead);
                            SetPictureBoxImage(pic_head, cHead.ToBitmap());
                            cHead.Release();
                            bTakePicture = false;
                        }
                    }
                    multiFaceInfo.Dispose();
                    #endregion
                    SetPictureBoxImage(pic_cam, cFrame.ToBitmap());
                    cFrame.Release();//释放   
                    //GC.Collect();
                }
                catch(Exception ex)
                {
                    cFrame.Release();//释放 
                    bTakePicture = false;
                    //GC.Collect();
                }finally
                {
                    //GC.Collect();
                }
            }
        }
示例#3
0
        /// <summary>
        /// 获取人脸信息列表
        /// </summary>
        /// <param name="pEngine"></param>
        /// <param name="bitmap"></param>
        /// <returns></returns>
        public static List <FaceInfoModel> GetFaceInfos(IntPtr pEngine, Image bitmap)
        {
            List <FaceInfoModel> listRet = new List <FaceInfoModel>();

            try
            {
                List <int> AgeList    = new List <int>();
                List <int> GenderList = new List <int>();
                //检测人脸,得到Rect框
                ASF_MultiFaceInfo multiFaceInfo  = FaceUtil.DetectFace(pEngine, bitmap);
                MultiFaceModel    multiFaceModel = new MultiFaceModel(multiFaceInfo);
                //人脸信息处理
                ImageInfo imageInfo = ImageUtil.ReadBMP(bitmap);
                int       retCode   = ASFFunctions.ASFProcess(pEngine, imageInfo.width, imageInfo.height, imageInfo.format, imageInfo.imgData, ref multiFaceInfo, FaceEngineMask.ASF_AGE | FaceEngineMask.ASF_GENDER);
                //获取年龄信息
                ASF_AgeInfo ageInfo = new ASF_AgeInfo();
                retCode = ASFFunctions.ASFGetAge(pEngine, ref ageInfo);
                AgeList = ageInfo.PtrToAgeArray(ageInfo.ageArray, ageInfo.num);
                //获取性别信息
                ASF_GenderInfo genderInfo = new ASF_GenderInfo();
                retCode    = ASFFunctions.ASFGetGender(pEngine, ref genderInfo);
                GenderList = genderInfo.PtrToGenderArray(genderInfo.genderArray, genderInfo.num);

                for (int i = 0; i < multiFaceInfo.faceNum; i++)
                {
                    FaceInfoModel faceInfo = new FaceInfoModel();
                    faceInfo.age        = AgeList[i];
                    faceInfo.gender     = GenderList[i];
                    faceInfo.faceRect   = multiFaceModel.FaceInfoList[i].faceRect;
                    faceInfo.feature    = ExtractFeature(pEngine, bitmap, multiFaceModel.FaceInfoList[i]);//提取单人脸特征
                    faceInfo.faceOrient = multiFaceModel.FaceInfoList[i].faceOrient;
                    listRet.Add(faceInfo);
                }
                return(listRet);//返回多人脸信息
            }
            catch {
                return(listRet);
            }
        }
示例#4
0
        /// <summary>
        /// 人脸信息检测(年龄/性别/人脸3D角度)最多支持4张人脸信息检测,超过部分返回未知
        /// </summary>
        /// <param name="width">图片宽度为4的倍数且大于0</param>
        /// <param name="height">YUYV/I420/NV21/NV12格式的图片高度为2的倍数,BGR24格式的图片高度不限制</param>
        /// <param name="format">颜色空间格式</param>
        /// <param name="pImageData">图片数据</param>
        /// <param name="detectedFaces">检测到的人脸信息</param>
        /// <param name="combinedMask">初始化中参数combinedMask与ASF_AGE| ASF_GENDER| ASF_FACE3DANGLE的交集的子集</param>
        public void FaceProcess(int width, int height, int format, IntPtr pImageData, MultiFaceModel detectedFaces, uint combinedMask = ArcFaceFunction.AGE | ArcFaceFunction.FACE_3DANGLE | ArcFaceFunction.GENDER)
        {
            //取交集
            combinedMask = combinedMask & this.CombinedMask;
            AsfMultiFaceInfo multiFaceInfo = detectedFaces.MultiFaceInfo;
            ResultCode       result        = (ResultCode)ArcFaceApi.ASFProcess(EngineHandle, width, height, format, pImageData,
                                                                               ref multiFaceInfo, combinedMask);

            if (result != ResultCode.成功)
            {
                throw new ResultCodeException(result);
            }
        }
示例#5
0
 /// <summary>
 /// 人脸信息检测(年龄/性别/人脸3D角度)最多支持4张人脸信息检测,超过部分返回未知
 /// </summary>
 /// <param name="imgData">图像数据 可用 ImageDataConverter 转换</param>
 /// <param name="detectedFaces">检测到的人脸信息</param>
 /// <param name="combinedMask">初始化中参数combinedMask与ASF_AGE| ASF_GENDER| ASF_FACE3DANGLE的交集的子集</param>
 public void FaceProcess(ImageData imgData, MultiFaceModel detectedFaces, uint combinedMask = ArcFaceFunction.AGE | ArcFaceFunction.FACE_3DANGLE | ArcFaceFunction.GENDER)
 {
     FaceProcess(imgData.Width, imgData.Height, imgData.Format, imgData.PImageData, detectedFaces, combinedMask);
 }
示例#6
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();
            }
        }
示例#7
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();
        }
示例#8
0
        private void btn_compare_Click(object sender, EventArgs e)
        {
            //图片比对
            ArcFaceCore arcFaceImg = new ArcFaceCore(APPID, FT_SDKKEY, ArcFaceDetectMode.IMAGE,
             ArcFaceFunction.FACE_DETECT | ArcFaceFunction.FACE_RECOGNITION | ArcFaceFunction.AGE | ArcFaceFunction.FACE_3DANGLE | ArcFaceFunction.GENDER, DetectionOrientPriority.ASF_OP_0_ONLY, 1, 16);

            Bitmap camImg = new Bitmap(@"E:\\CAM.JPG");
            Bitmap idCardImg = new Bitmap(@"E:\\IDCARDIMG.JPG");
            //将第一张图片的 Bitmap 转换成 ImageData
            ImageData camImgData = ImageDataConverter.ConvertToImageData(camImg);
            ImageData idCardImgData = ImageDataConverter.ConvertToImageData(idCardImg);
            try
            {
                // 检测第一张图片中的人脸
                MultiFaceModel camImgMultiFace = arcFaceImg.FaceDetection(camImgData);
                // 取第一张图片中返回的第一个人脸信息
                AsfSingleFaceInfo camImgfaceInfo = camImgMultiFace.FaceInfoList.First();
                // 提第一张图片中返回的第一个人脸的特征
                AsfFaceFeature asfFaceFeatureCam = arcFaceImg.FaceFeatureExtract(camImgData, ref camImgfaceInfo);

                
                MultiFaceModel idCardImgMultiFace = arcFaceImg.FaceDetection(idCardImgData);
                AsfSingleFaceInfo idCardImgfaceInfo = idCardImgMultiFace.FaceInfoList.First();
                AsfFaceFeature asfFaceFeatureIdCard = arcFaceImg.FaceFeatureExtract(idCardImgData, ref idCardImgfaceInfo);

                float ret = arcFaceImg.FaceCompare(asfFaceFeatureCam, asfFaceFeatureIdCard);

                if (ret > 0.6)
                {
                    //MessageBox.Show("人脸匹配成功"+ret);
                    lbl_msg.ForeColor = Color.Green;
                    lbl_msg.Text = "人脸匹配成功--相似度:" + ret;


                    bPlayflag = false;
                    ThreadCam.Abort();
                    m_vCapture.Release();
                    btn_play.Text = "打开摄像头";

                }
                else
                {
                    //MessageBox.Show("人脸匹配失败" + ret);
                    lbl_msg.ForeColor = Color.Red;
                    lbl_msg.Text = "人脸匹配失败--相似度:" + ret;
                }
            }
            catch(Exception ex)
            {
                //MessageBox.Show("人脸匹配失败Ex");
                lbl_msg.ForeColor = Color.Red;
                lbl_msg.Text = "人脸匹配失败Ex:" + ex.Message;
            }
            finally
            {
                //释放销毁引擎
                arcFaceImg.Dispose();

                // ImageData使用完之后记得要 Dispose 否则会导致内存溢出 
                camImgData.Dispose();
                idCardImgData.Dispose();
                // BItmap也要记得 Dispose
                camImg.Dispose();
                idCardImg.Dispose();

                GC.Collect();
            }
        }