Ejemplo n.º 1
0
        /// <summary>
        /// 获取制定图片,识别出的人脸矩形框
        /// </summary>
        /// <param name="emguImage"></param>
        /// <returns></returns>
        public faceDetectedObj GetFaceRectangle(Mat emguImage)
        {
            faceDetectedObj fdo = new faceDetectedObj();

            fdo.originalImg = emguImage;
            List <Rectangle> faces = new List <Rectangle>();

            try
            {
                using (UMat ugray = new UMat())
                {
                    CvInvoke.CvtColor(emguImage, ugray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray); //灰度化图片
                    CvInvoke.EqualizeHist(ugray, ugray);                                          //均衡化灰度图片

                    Rectangle[] facesDetected = faceClassifier.DetectMultiScale(ugray, 1.1, 10, new Size(20, 20));
                    faces.AddRange(facesDetected);
                }
            }
            catch (Exception ex)
            {
            }
            fdo.facesRectangle = faces;

            return(fdo);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 人脸识别
        /// </summary>
        /// <param name="emguImage"></param>
        /// <returns></returns>
        public faceDetectedObj faceRecognize(Mat emguImage)
        {
            faceDetectedObj    fdo     = GetFaceRectangle(emguImage);
            Image <Gray, byte> tempImg = fdo.originalImg.ToImage <Gray, byte>();

            #region 给识别出的所有人脸画矩形框
            using (Graphics g = Graphics.FromImage(fdo.originalImg.Bitmap))
            {
                foreach (Rectangle face in fdo.facesRectangle)
                {
                    g.DrawRectangle(new Pen(Color.Red, 2), face); //给识别出的人脸画矩形框
                    Image <Gray, byte> GrayFace = tempImg.Copy(face).Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic);
                    GrayFace._EqualizeHist();                     //得到均衡化人脸的灰度图像
                    #region 得到匹配姓名,并画出
                    Emgu.CV.Face.FaceRecognizer.PredictionResult pr = tfr.faceRecognizer.Predict(GrayFace);
                    string recogniseName = tfr.trainedFileList.trainedFileName[pr.Label].ToString();

                    name = tfr.trainedFileList.trainedFileName[pr.Label].ToString();

                    Font       font     = new Font("宋体", 16, GraphicsUnit.Pixel);
                    SolidBrush fontLine = new SolidBrush(Color.Yellow);
                    float      xPos     = face.X + (face.Width / 2 - (name.Length * 14) / 2);
                    float      yPos     = face.Y - 21;
                    g.DrawString(name, font, fontLine, xPos, yPos);
                    #endregion

                    fdo.names.Add(name);
                }
            }

            #endregion
            return(fdo);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 人脸识别
        /// </summary>
        /// <param name="emguImage"></param>
        /// <returns></returns>
        public faceDetectedObj faceRecognize(Mat emguImage)
        {
            faceDetectedObj    fdo     = GetFaceRectangle(emguImage);
            Image <Gray, byte> tempImg = fdo.originalImg.ToImage <Gray, byte>();

            #region 给识别出的所有人脸画矩形框
            using (Graphics g = Graphics.FromImage(fdo.originalImg.Bitmap))
            {
                foreach (Rectangle face in fdo.facesRectangle)
                {
                    Image <Gray, byte> GrayFace = tempImg.Copy(face).Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic);
                    GrayFace._EqualizeHist();//得到均衡化人脸的灰度图像

                    #region 得到匹配姓名
                    Emgu.CV.Face.FaceRecognizer.PredictionResult pr = tfr.faceRecognizer.Predict(GrayFace);
                    string name = "";

                    //Distance越小表示 越可能是同一个人
                    if (pr.Distance < 4000)
                    {
                        name = tfr.trainedFileList.trainedFileName[pr.Label].ToString();
                    }

                    #endregion
                    fdo.names.Add(name);
                }
            }

            #endregion
            return(fdo);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 人脸识别
        /// </summary>
        /// <param name="emguImage"></param>
        /// <returns></returns>
        public faceDetectedObj faceRecognize(Mat emguImage)
        {
            faceDetectedObj    fdo     = GetFaceRectangle(emguImage);
            Image <Gray, byte> tempImg = fdo.originalImg.ToImage <Gray, byte>();

            #region 给识别出的所有人脸画矩形框
            using (Graphics g = Graphics.FromImage(fdo.originalImg.Bitmap))
            {
                foreach (Rectangle face in fdo.facesRectangle)
                {
                    g.DrawRectangle(new Pen(Color.Red, 2), face);//给识别出的人脸画矩形框

                    Image <Gray, byte> GrayFace = tempImg.Copy(face).Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic);
                    GrayFace._EqualizeHist();//得到均衡化人脸的灰度图像

                    //Mat pMat = new Mat();

                    //float[] ranges = new float[] { 0.0f, 256.0f };
                    //using (Emgu.CV.Util.VectorOfMat vm = new Emgu.CV.Util.VectorOfMat())
                    //{
                    //    vm.Push(GrayFace);
                    //    CvInvoke.CalcHist(vm, new int[] { 0 }, null, pMat, new int[] { 1 }, ranges, false);
                    //}


                    #region 得到匹配姓名,并画出
                    Emgu.CV.Face.FaceRecognizer.PredictionResult pr = tfr.faceRecognizer.Predict(GrayFace);
                    System.Diagnostics.Debug.WriteLine(pr.Distance + " " + pr.Label);
                    string recogniseName = tfr.trainedFileList.trainedFileName[pr.Label].ToString();

                    string name = tfr.trainedFileList.trainedFileName[pr.Label].ToString();

                    Font       font     = new Font("宋体", 16, GraphicsUnit.Pixel);
                    SolidBrush fontLine = new SolidBrush(Color.Yellow);
                    float      xPos     = face.X + (face.Width / 2 - (name.Length * 14) / 2);
                    float      yPos     = face.Y - 21;
                    g.DrawString(name, font, fontLine, xPos, yPos);
                    #endregion

                    fdo.names.Add(name);
                }
            }
            GC.Collect();

            #endregion
            return(fdo);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 人脸识别
        /// </summary>
        /// <param name="emguImage"></param>
        /// <returns></returns>
        public faceDetectedObj faceRecognize(Mat emguImage)
        {
            //tfr = new TrainedFaceRecognizer();
            //tfr.trainedFileList = SetSampleFacesList();


            //tfr.faceRecognizer = new Emgu.CV.Face.LBPHFaceRecognizer(1, 8, 8, 8, 100);

            faceDetectedObj    fdo     = GetFaceRectangle(emguImage);
            Image <Gray, byte> tempImg = fdo.originalImg.ToImage <Gray, byte>();

            #region 给识别出的所有人脸画矩形框
            using (Graphics g = Graphics.FromImage(fdo.originalImg.Bitmap))
            {
                foreach (Rectangle face in fdo.facesRectangle)
                {
                    g.DrawRectangle(new Pen(Color.Red, 2), face);

                    Image <Gray, byte> GrayFace = tempImg.Copy(face).Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic);
                    GrayFace._EqualizeHist();//得到均衡化人脸的灰度图像

                    #region 得到匹配姓名
                    //tfr.faceRecognizer.Load("test.xml");
                    Emgu.CV.Face.FaceRecognizer.PredictionResult pr = tfr.faceRecognizer.Predict(GrayFace);

                    string name = "";

                    //Distance越小表示 越可能是同一个人
                    //if (pr.Distance < 4000)
                    //{
                    name = tfr.trainedFileList.trainedFileName[pr.Label].ToString();
                    // }
                    Font       font     = new Font("宋体", 16, GraphicsUnit.Pixel);
                    SolidBrush fontLine = new SolidBrush(Color.Yellow);
                    float      xPos     = face.X + (face.Width / 2 - (name.Length * 14) / 2);
                    float      yPos     = face.Y - 21;
                    g.DrawString(name, font, fontLine, xPos, yPos);
                    #endregion

                    fdo.names.Add(name);
                }
            }
            GC.Collect();
            #endregion
            return(fdo);
        }