/////////////////////////////////////////////////////////////////////////////////////
        public faceDetection facedetection(Mat image, CascadeClassifier cascade)
        {
            faceDetection face = new faceDetection();
            Mat           tmp  = new Mat();

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

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

            Rectangle[] facedetected = cascade.DetectMultiScale(grayImage, 1.1, 3, new Size(80, 80));
            faces.AddRange(facedetected);
            int rect_x, rect_y, rect_width, rect_height;

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

                CvInvoke.Rectangle(tmp, faces[0], new Bgr(Color.Red).MCvScalar, 1);

                face.faceRoi  = new Mat(image, faces[0]);
                face.coor_x   = rect_x;
                face.coor_y   = rect_y;
                face.srcImage = tmp;
                face.FLAG     = true;

                return(face);
            }
            else
            {
                face.srcImage = tmp;
                face.FLAG     = false;

                return(face);
            }
        }
        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);
        }