脸部处理函数
public List<Image<Bgr, byte>> GetFaceImgByXML(Image<Bgr, byte> img, string FaceXML)
主要功能:
封装了opencv级联分类器检测人脸的函数,使用更简单。
返回:检测到的人脸图像
private List<Image<Bgr, byte>> GetFaceImgBySpilt(Image<Bgr, byte> img)
主要功能:对人脸进行切分
返回:4张图像,包含人脸的4个部分
private static List<Image<Bgr, byte>> GetTopOrLowFace(Image<Bgr, byte> img, int offset)
主要功能:对人脸进行切分(上下切分),可以设置偏移量。
返回:2张上下切分后的图像
源码:
/// <summary>
/// 使用xml文件检测到的包含人脸的一个矩形
/// </summary>
private Rectangle face_rec;
/// <summary>
/// 使用直接分割脸部图像的方法得到的每一部分脸的矩形。
/// 它的大小为4,包含一张脸的4个部分。
/// </summary>
private List<Rectangle> split_face_rec;
/// <summary>
/// 通过xml文件检测的方式获取人脸
/// </summary>
/// <param name="img">输入的原始图像</param>
/// <param name="FaceXML">训练好的xml文件</param>
/// <returns></returns>
public Rectangle GetFaceRec()
{
return this.face_rec;
}
public List<Rectangle> GetSplitFaceRec()
{
return this.split_face_rec;
}
public List<Image<Bgr, byte>> GetFaceImgByXML(Image<Bgr, byte> img, string FaceXML)
{
CascadeClassifier faceClassifier = new CascadeClassifier(FaceXML);
List<Image<Bgr, byte>> facelist = new List<Image<Bgr, byte>>();
Rectangle[] faces = faceClassifier.DetectMultiScale(img, 1.3, 3);
try
{
foreach (Rectangle face in faces)
{
CvInvoke.cvSetImageROI(img, face);
Image<Bgr, byte> roi = new Image<Bgr, byte>(face.Size);
CvInvoke.cvCopy(img, roi, IntPtr.Zero);
facelist.Add(roi);
face_rec = face;
}
if (facelist.Count != 0)
return facelist;
else
{
facelist.Add(img);
return facelist;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
facelist.Add(img);
return facelist;
}
}
/// <summary>
/// 将人脸进行田字格式的切分
/// </summary>
/// <param name="img">人脸图像</param>
/// <returns></returns>
private List<Image<Bgr, byte>> GetFaceImgBySpilt(Image<Bgr, byte> img)
{
Image<Bgr, byte> temp = img;
List<Image<Bgr, byte>> list = new List<Image<Bgr, byte>>();
list.Add(temp.Copy(new Rectangle(0, 0, temp.Width / 2, temp.Height / 2)));
list.Add(temp.Copy(new Rectangle(temp.Width / 2, 0, temp.Width / 2, temp.Height / 2)));
list.Add(temp.Copy(new Rectangle(0, temp.Height / 2, temp.Width / 2, temp.Height / 2)));
list.Add(temp.Copy(new Rectangle(temp.Width / 2, temp.Height / 2, temp.Width / 2, temp.Height / 2)));
split_face_rec = new List<Rectangle>();
split_face_rec.Add(new Rectangle(0, 0, temp.Width / 2, temp.Height / 2));
split_face_rec.Add(new Rectangle(temp.Width / 2, 0, temp.Width / 2, temp.Height / 2));
split_face_rec.Add(new Rectangle(0, temp.Height / 2, temp.Width / 2, temp.Height / 2));
split_face_rec.Add(new Rectangle(temp.Width / 2, temp.Height / 2, temp.Width / 2, temp.Height / 2));
return list;
}
/// <summary>
/// 将人脸进行上下切分
/// </summary>
/// <param name="img">人脸图像</param>
/// <param name="offset">偏移量</param>
/// <returns></returns>
private static List<Image<Bgr, byte>> GetTopOrLowFace(Image<Bgr, byte> img, int offset)
{
Image<Bgr, byte> temp = new Image<Bgr, byte>(img.Size);
CvInvoke.cvCopy(img, temp, IntPtr.Zero);
List<Image<Bgr, byte>> list = new List<Image<Bgr, byte>>();
list.Add(temp.Copy(new Rectangle(0, 0, temp.Width, temp.Height / 2)));
list.Add(temp.Copy(new Rectangle(0, temp.Height / 2 + offset, temp.Width, temp.Height / 2 - offset)));
return list;
}