Emgu cv人臉檢測識別


Emgu cv人臉檢測識別

1、開發平台:WIN10 X64    VS2012    Emgucv版本:3.1

2、先給大家分享一個官網給的示例源代碼:

https://ncu.dl.sourceforge.net/project/emgufacerecog/Face%20Recognition%202.4.9.zip

 

3、部分代碼展示:

 

【打開攝像頭:】
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 基於人臉識別的智能監控
{
    class CaptureManage
    {
        private Emgu.CV.Capture capture;//攝像頭對象


        //檢測是否有可用攝像頭
        void showCapture()
        {
           
            
        }

       public Object returnCapture(int a)
        {
            switch(a)
            {
                case 1://本地攝像頭
                    try
                    {
                        capture = new Emgu.CV.Capture();
                        capture.Start();//攝像頭開始工作
                        return capture;
                    }
                    catch
                    {
                        
                    }

                    break;
                case 2:             //網絡攝像頭
                    try
                    {
                        capture = new Emgu.CV.Capture("rtsp://admin:tlJwpbo6@192.168.1.125:554");
                    }
                    catch (NullReferenceException excpt)
                    {
                        //MessageBox.Show("攝像頭打開失敗\n" + excpt.Message);
                    }
                    break;
                case 3:
                    break;
            }
            return null;
        }
       private bool closeCapture(int i)
       {
           switch (i)
           {
               case 1://本地攝像頭
                   try
                   {
                       if(capture!=null)
                            capture.Stop();//攝像頭開始工作
                       return true;
                   }
                   catch
                   {

                   }

                   break;
               case 2:             //網絡攝像頭
                   break;
               case 3:
                   break;
           }
           return false;
       }
    }
}

 

【實時獲取圖像】
                CaptureManage cm = new CaptureManage();
                //capture = new Emgu.CV.Capture();
                //capture.Start();//攝像頭開始工作
                capture = (Emgu.CV.Capture)cm.returnCapture(1);
                capture.ImageGrabbed += frameProcess;//實時獲取圖像
【加載和人臉識別有關的XML】

                //faceClassifier = new CascadeClassifier("haarcascade_frontalface_default.xml");
                faceClassifier = new CascadeClassifier("haarcascade_frontalface_default.xml");
                SetTrainedFaceRecognizer(FaceRecognizerType.EigenFaceRecognizer);//設置識別器

 

 

【訓練人臉識別器】    
public TrainedFaceRecognizer SetTrainedFaceRecognizer(FaceRecognizerType type) { tfr = new TrainedFaceRecognizer(); tfr.trainedFileList = SetSampleFacesList(); switch (type) { case FaceRecognizerType.EigenFaceRecognizer: tfr.faceRecognizer = new Emgu.CV.Face.EigenFaceRecognizer(80, double.PositiveInfinity);//PositiveInfinity double.NegativeInfinity break; case FaceRecognizerType.FisherFaceRecognizer: tfr.faceRecognizer = new Emgu.CV.Face.FisherFaceRecognizer(0, 3500); break; case FaceRecognizerType.LBPHFaceRecognizer: tfr.faceRecognizer = new Emgu.CV.Face.LBPHFaceRecognizer(1, 8, 8, 8, 100); break; } tfr.faceRecognizer.Train(tfr.trainedFileList.trainedImages.ToArray(), tfr.trainedFileList.trainedLabelOrder.ToArray()); return tfr; }

 

     
【識別出人臉矩形框】
public faceDetectedObj GetFaceRectangle(Mat emguImage)
        {
            faceDetectedObj fdo = new faceDetectedObj();
            fdo.originalImg = emguImage;
            List<Rectangle> faces = new List<Rectangle>();
            //List<Rectangle> eyes = 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));
                    //Rectangle[] eyesDetected = eyesClassifier.DetectMultiScale(ugray, 1.1, 3, new Size(100, 100));
                    faces.AddRange(facesDetected);               //向list集合的末尾添加
                    //eyes.AddRange(eyesDetected);
                }
            }
            catch (Exception ex)
            {
                ex.ToString();
            }
            fdo.facesRectangle = faces;

            return fdo;
        }

 

【給識別出的所有人臉畫圈】
     public faceDetectedObj faceRecognize(Mat emguImage)
        {
            faceDetectedObj fdo;
            try
            {

                fdo = GetFaceRectangle(emguImage);
                Image<Gray, byte> tempImg = fdo.originalImg.ToImage<Gray, byte>();
                
                using (Graphics g = Graphics.FromImage(fdo.originalImg.Bitmap))
                {
                   // camoareTwoImage(Emgu.CV.Image<Bgr,byte>[] img1,Emgu.CV.Image<Bgr,byte> img2);
                   // camoareTwoImage(fdo.facesRectangle,emguImage.ToImage<Bgr,byte>);
                    foreach (Rectangle face in fdo.facesRectangle)
                    {
                        g.DrawArc(new Pen(Color.Blue, 2), face,0,360);//畫圓
                        Image<Gray, byte> GrayFace = tempImg.Copy(face).Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic);
                        GrayFace._EqualizeHist();//得到均衡化人臉的灰度圖像
                      
                        
                        Emgu.CV.Face.FaceRecognizer.PredictionResult pr = tfr.faceRecognizer.Predict(GrayFace);//返回預測圖像的標簽
                        
  
                        double db = pr.Distance;//.CompareTo(pr.Distance);//返回相似度

                        string recogniseName = tfr.trainedFileList.trainedFileName[pr.Label].ToString();
                        //FaceRecognizer
                        string name = tfr.trainedFileList.trainedFileName[pr.Label].ToString();
                        //pr.GetType();
                        if (db >5690 || pr.Label == -1)
                        {
                            name = "不認識";
                        } //畫出姓名
                        //camoareTwoImage(GrayFace.MIplImage<Bgr,byte>, fdo.originalImg.ToImage<Bgr, byte>);
                        else
                        {

                            Font font = new Font("楷體", 16, GraphicsUnit.Pixel);
                            SolidBrush fontLine = new SolidBrush(Color.Red);
                            float xPos = face.X + (face.Width / 2 - (name.Length * 14) / 2);
                            float yPos = face.Y - 21;
                            g.DrawString(name + "_" + pr.Label + "[" + db + "]", font, fontLine, xPos, yPos);
                            //MessageBox.Show("返回的Pr為:"+db);
                            //Console.WriteLine("db的值為==》》》》"+db);
                       
                        }
                        fdo.names.Add(name);
                    }
                }
            }
            finally
            {
                //emguImage.Dispose();
            }
            
            return fdo;
        }

4、識別效果見下圖:

 

5、以上代碼並非全部是我敲的,參照【http://blog.csdn.net/u011616825/article/details/51620061】。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM