【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;
        }
posted @ 2018-03-30 13:23  SEC.VIP_网络安全服务  阅读(119)  评论(0编辑  收藏  举报