【EmguCv】人脸/人眼检测

目录:

1. 获取脸部和眼部图像的接口定义(IFace.cs)

 using Emgu.CV;
    using Emgu.CV.Structure;
    using System.Collections.Generic;

    public interface IFace
    {
       /// <summary>
       /// 获取脸部图像
       /// </summary>
       /// <param name="img">原始图像</param>
       /// <returns>脸部图像集合</returns>
    List<Image<Bgr, byte>> GetFaceImgList(Image<Bgr, byte> img);
    /// <summary>
    /// 获取眼睛图像
    /// </summary>
    /// <param name="img">脸部图像</param>
    /// <returns>眼睛图像集合</returns>
    List<Image<Bgr, byte>> GetEyeImgList(Image<Bgr, byte> faceimg);

    }

2. IFaces接口实现(FaceImpl.cs)

 using Emgu.CV;
    using Emgu.CV.Structure;
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;

    namespace FaceRecognition
    {
    public class FaceImpl : IFace
    {
    private CascadeClassifier faceClassifier;
    private CascadeClassifier eyeClassifier;
    public string log;
    public void LoadFaceRecognitionFile(string file)
    {

    try
    {
    faceClassifier = new CascadeClassifier(file);
    log = "识别文件载入成功";
    }
    catch(Exception ex)
    {
    MessageBox.Show("识别文件载入失败,详细原因
"+ex.Message);
    }
    }
    public void LoadEyeRecognitionFile(string file)
    {
    try
    {
    eyeClassifier = new CascadeClassifier(file);

    }
    catch (Exception ex)
    {
    MessageBox.Show("识别文件载入失败,详细原因
" + ex.Message+"
"+ex.StackTrace);
    }
    }
    public List<Image<Bgr,byte>> GetFaceImgList( Image<Bgr,byte> img)
    {
    List<Image<Bgr, byte>> facelist = new List<Image<Bgr, byte>>();
    Rectangle[] faces = faceClassifier.DetectMultiScale(img,1.3, 3, new Size(40, 40));
    try
    {
    log = "检测中";
    foreach (Rectangle face in faces)
    {
    CvInvoke.Rectangle(img, face, new Bgr(Color.Red).MCvScalar, 2);
    CvInvoke.cvSetImageROI(img, face);
    Image<Bgr, byte> roi = new Image<Bgr, byte>(face.Size);
    CvInvoke.cvCopy(img, roi, IntPtr.Zero);
    facelist.Add(roi);
    }
    if (facelist.Count != 0)
    return facelist;
    else 
    {
    facelist.Add(img);
    return facelist;
    }

    }
    catch(Exception ex)
    {
    MessageBox.Show("脸部检测失败,详细原因
" + ex.Message + "
" + ex.StackTrace);
    facelist.Add(img);
    return facelist;
    }
    }

    public List<Image<Bgr, byte>> GetEyeImgList(Image<Bgr, byte> faceimg)
    {
    List<Image<Bgr, byte>> eyelist = new List<Image<Bgr, byte>>();
    Rectangle[] eyes = eyeClassifier.DetectMultiScale(faceimg, 1.3, 3, new Size(20, 20));
    try
    {
    log = "检测中";
    foreach (Rectangle eye in eyes)
    {
        CvInvoke.Rectangle(faceimg, eye, new Bgr(Color.Green).MCvScalar, 2);
    CvInvoke.cvSetImageROI(faceimg, eye);
    Image<Bgr, byte> roi = new Image<Bgr, byte>(eye.Size);
    CvInvoke.cvCopy(faceimg, roi, IntPtr.Zero);
    eyelist.Add(roi);
    }
    if (eyelist.Count == 0)
    {
    eyelist.Add(faceimg);
    eyelist.Add(faceimg);
    return eyelist;
    }
    else if (eyelist.Count == 1)
    {
    eyelist.Add(faceimg);
    return eyelist;
    }
    else
    return eyelist;

    }
    catch (Exception ex)
    { MessageBox.Show("眼部检测检测失败,详细原因
" + ex.Message + "
" + ex.StackTrace);
    eyelist.Add(faceimg);
    return eyelist;
    }
    }

    }
    }

3. CascadeClassifier.DetectMultiScale参数

   public Rectangle[] DetectMultiScale(
    IInputArray image,
     double scaleFactor = 1.1, 
    int minNeighbors = 3,
     Size minSize = default(Size),
     Size maxSize = default(Size)
    );
参数1:image--待检测图片,一般为灰度图像加快检测速度;
参数2:scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;
参数3:minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个)。
        如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
        如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,
        这种设定值一般用在用户自定义对检测结果的组合程序上;    
参数4、5:minSize和maxSize用来限制得到的目标区域的范围。

4. 分类文件

haarcascade_frontalface_default.xml检测人脸

haarcascade_eye检测人眼

5. 检测截图

原文地址:https://www.cnblogs.com/cnsec/p/13286773.html