zoukankan      html  css  js  c++  java
  • 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("摄像头打开失败
    " + 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】。

  • 相关阅读:
    Networking
    Table of Contents
    Table of Contents
    Jersey(1.19.1)
    Jersey(1.19.1)
    11.Container With Most Water---两指针
    85.Maximal Rectangle---dp
    42.Trapping Rain Water---dp,stack,两指针
    84.Largest Rectangle in histogram---stack
    174.Dungeon Game---dp
  • 原文地址:https://www.cnblogs.com/ywf520/p/7519320.html
Copyright © 2011-2022 走看看