您的位置:首页 > 运维架构

【EmguCv】人脸/人眼检测

2017-10-13 16:26 239 查看
目录:

获取脸部和眼部图像的接口定义IFacecs

IFaces接口实现FaceImplcs

CascadeClassifierDetectMultiScale参数

分类文件

检测截图

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("识别文件载入失败,详细原因\n"+ex.Message);
}
}
public void LoadEyeRecognitionFile(string file)
{
try
{
eyeClassifier = new CascadeClassifier(file);

}
catch (Exception ex)
{
MessageBox.Show("识别文件载入失败,详细原因\n" + ex.Message+"\n"+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("脸部检测失败,详细原因\n" + ex.Message + "\n" + 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);
}

4000
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("眼部检测检测失败,详细原因\n" + ex.Message + "\n" + 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. 检测截图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OpenCv EmguCv 人脸检测