• 【Eye-Tracking】六、脸部处理


    脸部处理函数


    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;
            }
  • 相关阅读:
    我见过的最完善的log4net配置
    根据身份证号中的日期判断某人是否已满18岁及是否已满60岁
    第三届“百越杯”福建省高校网络空间安全大赛
    PHP-上传文件
    PHP-操作Mysql
    PHP-异常处理
    PHP-错误处理
    Python(算法)-时间复杂度和空间复杂度
    Python-集合
    Python-字典
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286712.html
Copyright © 2020-2023  润新知