欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Eye-Tracking】六、脸部处理

程序员文章站 2024-03-25 19:22:22
...

脸部处理函数


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;
        }
相关标签: eyetracking