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】。

原文地址:https://www.cnblogs.com/ywf520/p/7519320.html