EmguCV人脸识别的案例运行测试(C#版本的OpenCV)附源代码案例

EmguCV人脸识别的案例运行测试

一、人脸识别测试运行前提条件

类别 选用情况
Visual Studio版本 Visual Studio 2019
编码语言 C#
EmguCV版本 libemgucv-windesktop-4.1.0.3420

建议使用EmguCV版本所支持的Visual Studio版本,本代码适用于Visual Studio 2019版可直接使用,低版本如Visual Studio 2008经测试需要对代码较多修正可成功运行。

二、VS2019创建新的项目

选择Windows窗体应用(.Net Framework)C#
也可以通过选择条件“语言为C#、平台为Windows、项目类型为桌面”来缩小选择的范围。
EmguCV人脸识别的案例运行测试(C#版本的OpenCV)附源代码案例_第1张图片

三、创建项目FaceDetection

项目名称设置为FaceDetection,点击创建EmguCV人脸识别的案例运行测试(C#版本的OpenCV)附源代码案例_第2张图片

四、引用EmguCV中的插件到到项目中

在解决方案资源管理器中右键选择添加引用,然后浏览项目下找到你所安装的EmguCV的bin文件夹,比如D盘时路径可为D:\EmguCV\libemgucv-windesktop-4.1.0.3420\bin,可根据你的实际情况调整,选择文件下的Emgu.CV.UI.dllEmgu.CV.World.dll添加,再勾选确认即可添加插件引用
EmguCV人脸识别的案例运行测试(C#版本的OpenCV)附源代码案例_第3张图片
EmguCV人脸识别的案例运行测试(C#版本的OpenCV)附源代码案例_第4张图片

五、进入代码编辑修改界面

创建好项目后双击如下图的项目窗口Form1进入Form1.cs代码编辑界面。
EmguCV人脸识别的案例运行测试(C#版本的OpenCV)附源代码案例_第5张图片EmguCV人脸识别的案例运行测试(C#版本的OpenCV)附源代码案例_第6张图片

六、复制粘贴修正后的代码

复制粘贴入下边提供的修正后的代码到Form1.cs

  修正后的可用代码

整合所有的代码到一起并加以修正使其可运行成功。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.UI;
using Emgu.CV.Cuda;
using System.Diagnostics;

namespace FaceDetection
{
    public static class DetectFace
    {
        public static void Detect(
           IInputArray image, String faceFileName, String eyeFileName,
           List<Rectangle> faces, List<Rectangle> eyes,
           out long detectionTime)
        {
            Stopwatch watch;

            using (InputArray iaImage = image.GetInputArray())
            {

#if !(__IOS__ || NETFX_CORE)
                if (iaImage.Kind == InputArray.Type.CudaGpuMat && CudaInvoke.HasCuda)
                {
                    using (CudaCascadeClassifier face = new CudaCascadeClassifier(faceFileName))
                    using (CudaCascadeClassifier eye = new CudaCascadeClassifier(eyeFileName))
                    {
                        face.ScaleFactor = 1.1;
                        face.MinNeighbors = 10;
                        face.MinObjectSize = Size.Empty;
                        eye.ScaleFactor = 1.1;
                        eye.MinNeighbors = 10;
                        eye.MinObjectSize = Size.Empty;
                        watch = Stopwatch.StartNew();
                        using (CudaImage<Bgr, Byte> gpuImage = new CudaImage<Bgr, byte>(image))
                        using (CudaImage<Gray, Byte> gpuGray = gpuImage.Convert<Gray, Byte>())
                        using (GpuMat region = new GpuMat())
                        {
                            face.DetectMultiScale(gpuGray, region);
                            Rectangle[] faceRegion = face.Convert(region);
                            faces.AddRange(faceRegion);
                            foreach (Rectangle f in faceRegion)
                            {
                                using (CudaImage<Gray, Byte> faceImg = gpuGray.GetSubRect(f))
                                {
                                    //For some reason a clone is required.
                                    //Might be a bug of CudaCascadeClassifier in opencv
                                    using (CudaImage<Gray, Byte> clone = faceImg.Clone(null))
                                    using (GpuMat eyeRegionMat = new GpuMat())
                                    {
                                        eye.DetectMultiScale(clone, eyeRegionMat);
                                        Rectangle[] eyeRegion = eye.Convert(eyeRegionMat);
                                        foreach (Rectangle e in eyeRegion)
                                        {
                                            Rectangle eyeRect = e;
                                            eyeRect.Offset(f.X, f.Y);
                                            eyes.Add(eyeRect);
                                        }
                                    }
                                }
                            }
                        }
                        watch.Stop();
                    }
                }
                else
#endif
                {
                    //Read the HaarCascade objects
                    using (CascadeClassifier face = new CascadeClassifier(faceFileName))
                    using (CascadeClassifier eye = new CascadeClassifier(eyeFileName))
                    {
                        watch = Stopwatch.StartNew();

                        using (UMat ugray = new UMat())
                        {
                            CvInvoke.CvtColor(image, ugray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);

                            //normalizes brightness and increases contrast of the image
                            CvInvoke.EqualizeHist(ugray, ugray);

                            //Detect the faces  from the gray scale image and store the locations as rectangle
                            //The first dimensional is the channel
                            //The second dimension is the index of the rectangle in the specific channel                     
                            Rectangle[] facesDetected = face.DetectMultiScale(
                               ugray,
                               1.1,
                               10,
                               new Size(20, 20));

                            faces.AddRange(facesDetected);

                            foreach (Rectangle f in facesDetected)
                            {
                                //Get the region of interest on the faces
                                using (UMat faceRegion = new UMat(ugray, f))
                                {
                                    Rectangle[] eyesDetected = eye.DetectMultiScale(
                                       faceRegion,
                                       1.1,
                                       10,
                                       new Size(20, 20));

                                    foreach (Rectangle e in eyesDetected)
                                    {
                                        Rectangle eyeRect = e;
                                        eyeRect.Offset(f.X, f.Y);
                                        eyes.Add(eyeRect);
                                    }
                                }
                            }
                        }
                        watch.Stop();
                    }
                }
                detectionTime = watch.ElapsedMilliseconds;
            }
        }
    }
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Run();
        }
        
        static void Run()
        {
            IImage image;
            //Read the files as an 8-bit Bgr image 
            image = new UMat("lena.jpg", ImreadModes.Color); //UMat version
                                                             //image = new Mat("lena.jpg", ImreadModes.Color); //CPU version

            long detectionTime;
            List<Rectangle> faces = new List<Rectangle>();
            List<Rectangle> eyes = new List<Rectangle>();

            DetectFace.Detect(
              image, "haarcascade_frontalface_default.xml", "haarcascade_eye.xml",
              faces, eyes,
              out detectionTime);

            foreach (Rectangle face in faces)
                CvInvoke.Rectangle(image, face, new Bgr(Color.Red).MCvScalar, 2);
            foreach (Rectangle eye in eyes)
                CvInvoke.Rectangle(image, eye, new Bgr(Color.Blue).MCvScalar, 2);
                
            CvInvoke.Imshow("", image);//下边的屏蔽替换为本行代码
            //display the image 
            //using (InputArray iaImage = image.GetInputArray())
            //    ImageViewer.Show(image, String.Format(
            //       "Completed face and eye detection using {0} in {1} milliseconds",
            //       (iaImage.Kind == InputArray.Type.CudaGpuMat && CudaInvoke.HasCuda) ? "CUDA" :
            //       (iaImage.IsUMat && CvInvoke.UseOpenCL) ? "OpenCL"
            //       : "CPU",
            //       detectionTime));
        }
    } 
}

  修正后的代码结尾处

七、Debug文件夹下放入需要检测的图片

代码编辑完成后,需要在项目下 \bin\Debug 文件夹下放入一张名为lena.jpg的人脸照片,
可以自选照片重命名为lena.jpg
EmguCV人脸识别的案例运行测试(C#版本的OpenCV)附源代码案例_第7张图片

八、Debug文件夹下放入人脸检测需要的文件

haarcascade_eye.xmlhaarcascade_frontalface_default.xml文件也复制到项目下\bin\Debug文件夹下。
EmguCV人脸识别的案例运行测试(C#版本的OpenCV)附源代码案例_第8张图片

九、运行项目即可得到图像识别出的人脸效果

EmguCV人脸识别的案例运行测试(C#版本的OpenCV)附源代码案例_第9张图片

十、参考案例下载

也可参照流程自行编辑体验其中的乐趣,也可下载参考案例直接运行修改。

VS2019项目文件链接如下:

EmguCV人脸识别的案例项目代码(C#版本的OpenCV)FaceDetection.rar

你可能感兴趣的:(EmguCV,C#,opencv,c#,visual,studio,人脸识别)