private void OnSmileAction(Mat frame, FrameRect face, FrameRect smile, FrameRect selectArea)
 {
     if (!smileState.isStart && isSelect)
     {
         smileState.Start();
     }
 }
        //private bool isPeopleSpan = false;

        private void Capture_ImageGrabbed(object sender, EventArgs e)
        {
            Mat frame = new Mat();

            capture.Retrieve(frame, 0);    //接收数据
            var       showFrame = frame.Clone();
            FrameRect face, smile, selectArea;

            if (showRateIndex == 0 || showRateIndex % showRate == 0)
            {
                face       = getFace(frame);
                selectArea = getSelectArea(frame, face);
                smile      = getSmile(frame, face);
                if (face != null)
                {
                    preFace = face;
                }
                preSmile      = smile;
                preSelectArea = selectArea;
            }
            else
            {
                face       = preFace;
                selectArea = preSelectArea;
                smile      = preSmile;
            }
            face = face == null ? preFace : face;

            Graphics g = Graphics.FromImage(showFrame.Bitmap);

            if (face != null)
            {
                DrawHat(preFace.rect, g);
                g.DrawRectangle(new Pen(Color.Red, 3), face.rect);
            }
            if (smile != null)
            {
                showRateIndex++;
                OnSmileAction(frame, face, smile, selectArea);
                if (isSelect)
                {
                    resFrame      = frame;
                    resSelectArea = selectArea;
                    resSelectFace = face;

                    Image <Rgba, byte> rgbaImg = frame.ToImage <Rgba, byte>().Copy(selectArea.rect);
                    Graphics           g_pic   = Graphics.FromImage(rgbaImg.Bitmap);
                    //DrawHat(new Rectangle(face.rect.X - selectArea.rect.X, face.rect.Y - selectArea.rect.Y, face.rect.Width, face.rect.Height), g_pic);
                    imageBox_pic.Image = rgbaImg;
                }
                g.DrawRectangle(new Pen(Color.Blue, 3), smile.rect);
            }
            imageBox_cap.Image = showFrame;       //显示图像
        }
        private FrameRect getFace(Mat frame)
        {
            FrameRect face = null;

            using (UMat ugray = new UMat())
            {
                CvInvoke.CvtColor(frame, ugray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray); //灰度化图片
                CvInvoke.EqualizeHist(ugray, ugray);                                      //均衡化灰度图片

                Rectangle[] facesDetected = faceClassifier.DetectMultiScale(ugray, 1.1, 10, new System.Drawing.Size(20, 20));
                if (facesDetected != null && facesDetected.Length > 0)
                {
                    face = new FrameRect(getMaxRectangle(facesDetected).rect);
                }
            }
            return(face);
        }
        private FrameRect getSelectArea(Mat frame, FrameRect face)
        {
            if (face == null)
            {
                return(null);
            }
            int leftRightWidth = (imgWidth - face.rect.Width) / 2;
            int topWidth = (imgHeigth - face.rect.Height) / 2;
            int x, y = 0;

            x = face.rect.X - leftRightWidth < 0 ? 0 : face.rect.X - leftRightWidth;
            y = face.rect.Y - topWidth < 0 ? 0 : face.rect.Y - topWidth;
            x = x + imgWidth > frame.Width ? frame.Width - imgWidth : x;
            y = y + imgHeigth > frame.Height ? frame.Height - imgHeigth : y;
            FrameRect rect = new FrameRect(new Rectangle(x, y, imgWidth, imgHeigth));

            return(rect);
        }
        private FrameRect getSmile(Mat frame, FrameRect face)
        {
            if (face == null)
            {
                return(null);
            }
            Image <Gray, byte> tempImg  = frame.ToImage <Gray, byte>();
            Rectangle          halfFace = new Rectangle(face.rect.X + face.rect.Width / 5, face.rect.Y + face.rect.Height * 3 / 5, face.rect.Width * 3 / 5, face.rect.Height * 2 / 5);
            Image <Gray, byte> grayFace = tempImg.Copy(halfFace);
            //imageBox2.Image = grayFace;
            FrameRect smile = null;

            Rectangle[] smileDetected = smileClassifier.DetectMultiScale(grayFace, 1.16, 35, new System.Drawing.Size(25, 25));
            if (smileDetected != null && smileDetected.Length > 0)
            {
                smile         = new FrameRect(getMaxRectangle(smileDetected).rect);
                smile.rect.X += halfFace.X;
                smile.rect.Y += halfFace.Y;
            }
            return(smile);
        }
        public bool SaveSelectAreaImg(string tel, Mat frame, FrameRect selectArea, string name)
        {
            var    rgbFrameImg = frame.ToImage <Rgba, byte>();
            string strencode   = "";

            byte[] utf8 = Encoding.UTF8.GetBytes(name);
            name = Encoding.UTF8.GetString(utf8);
            if (selectArea != null)
            {
                var    selectImg = rgbFrameImg.Copy(selectArea.rect).Bitmap;
                string path      = imgPath + "/" + name;
                //selectImg.Save(path);
                selectImg.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);
                if (openFtp != 0)
                {
                    upload(path);
                }

                return(true);
            }
            return(false);
        }
        private void saveFace(Mat frame, FrameRect face)
        {
            if (face == null)
            {
                return;
            }
            if (!status)
            {
                return;
            }
            if (index >= 10)
            {
                status = false;
                MessageBox.Show("完成");
                return;
            }
            Image <Gray, byte> tempImg  = frame.ToImage <Gray, byte>();
            Image <Gray, byte> grayFace = tempImg.Copy(face.rect).Resize(200, 200, Inter.Linear);

            grayFace.Save("./face_train/" + textBox1.Text + "_" + index + ".jpg");
            index++;
        }