Esempio n. 1
0
/////////////////////////////////////////////////////////////////////////////////////////
        public eyeDetection eyedetection(Mat image, CascadeClassifier cascade, Mat faceRectImage, int coor_x, int coor_y)
        {
            eyeDetection eye = new eyeDetection();
            Mat          tmp = new Mat();

            image.CopyTo(tmp);
            Mat grayImage         = new Mat();
            List <Rectangle> eyes = new List <Rectangle>();

            CvInvoke.CvtColor(tmp, grayImage, ColorConversion.Bgr2Gray);
            CvInvoke.EqualizeHist(grayImage, grayImage);     // 均衡化

            Rectangle[] eyedetected = cascade.DetectMultiScale(grayImage, 1.1, 3, new Size(20, 20));
            eyes.AddRange(eyedetected);

            int rect_x, rect_y, rect_width, rect_height;

            if (eyes.Count > 0)
            {
                rect_x      = eyes[0].X;
                rect_y      = eyes[0].Y;
                rect_width  = eyes[0].Width;
                rect_height = eyes[0].Height;

                CvInvoke.Rectangle(faceRectImage, new Rectangle(rect_x + coor_x, rect_y + coor_y, rect_width, rect_height), new Bgr(Color.Blue).MCvScalar, 1);

                eye.eyeRoi    = new Mat(image, eyes[0]);
                eye.faceImage = faceRectImage;
                eye.FLAG      = true;

                return(eye);
            }
            else
            {
                eye.faceImage = faceRectImage;
                eye.FLAG      = false;
                return(eye);
            }
        }
Esempio n. 2
0
        public Mat process(Mat image, bool flag)
        {
            // 人脸检测 START...

            flag = glassCheckBox.Checked ? false : true;

            faceDetection face = new faceDetection();

            face          = facedetection(image, cascadeFace);
            faceFLAG      = face.FLAG;
            faceRectImage = face.srcImage;
            faceROI       = face.faceRoi;
            coor_x        = face.coor_x;
            coor_y        = face.coor_y;

            // 人脸检测 END...
            // 眼睛检测 START...

            if (faceFLAG)
            {
                if (flag)          // 不戴眼镜
                {
                    eyeDetection eye = eyedetection(faceROI, cascadeEye, faceRectImage, coor_x, coor_y);
                    resShowImage = eye.faceImage;
                    eyeROI       = eye.eyeRoi;
                    eyeFLAG      = eye.FLAG;
                }
                else              // 戴眼镜
                {
                    eyeDetection eye = eyedetection(faceROI, cascadeEyeWithGlasses, faceRectImage, coor_x, coor_y);
                    resShowImage = eye.faceImage;
                    eyeROI       = eye.eyeRoi;
                    eyeFLAG      = eye.FLAG;
                }

                // 眼睛检测 END...
                // 椭圆拟合 START...

                if (eyeFLAG)    // 检测到眼睛
                {
                    CvInvoke.Resize(eyeROI, eyeROI, new Size(24, 24));
                    EllipseEye e = eyeEllipse(eyeROI);
                    if (e.FLAG)        // 椭圆拟合完成
                    {
                        eyeOpenDegree = e.width / e.height;

                        if (eye.Count == 20)
                        {
                            //eye.ToArray();
                            eye.Reverse();
                            eye.RemoveAt(19);
                            eye.Reverse();
                        }
                        eye.Add(eyeOpenDegree);
                    }
                    else        // 椭圆拟合未完成
                    {
                        eyeOpenDegree = 0.1F;

                        if (eye.Count == 20)
                        {
                            //eye.ToArray();
                            eye.Reverse();
                            eye.RemoveAt(19);
                            eye.Reverse();
                        }

                        eye.Add(eyeOpenDegree);
                    }
                }
                else     // 未检测到眼睛
                {
                    eyeOpenDegree = 0.1F;

                    if (eye.Count == 20)
                    {
                        //eye.ToArray();
                        eye.Reverse();
                        eye.RemoveAt(19);
                        eye.Reverse();
                    }
                    eye.Add(eyeOpenDegree);
                }
            }
            else   // 未检测到人脸
            {
                nHeadPosture++;
            }

            return(resShowImage);
        }