private void ProcessFrame(object sender, EventArgs arg)
        {
            if (imageFrame != null)
            {
                Image <Gray, byte> greyImage = imageFrame.Copy().Convert <Gray, byte>();
                greyImage = greyImage.SmoothMedian(3);

                //stopWatch.Start();
                var faces = face.Detect(greyImage, 1.3, 6, HAAR_DETECTION_TYPE.FIND_BIGGEST_OBJECT, new Size(120, 120), new Size(300, 300));

                if (faces.Length == 0)
                {
                    var eyeObjects = eyeWithGlass.DetectMultiScale(greyImage, 1.3, 6, minEye, maxEye);
                    if (eyeObjects.Length == 2)
                    {
                        #region comment

                        /*Console.WriteLine("helper");
                         * if(eyeObjects[0].X > eyeObjects[1].X)
                         * {
                         *   var temp = eyeObjects[0];
                         *   eyeObjects[0] = eyeObjects[1];
                         *   eyeObjects[1] = temp;
                         * }
                         * int betweeneLength = eyeObjects[1].X - eyeObjects[0].X;
                         * int middleposition = eyeObjects[0].X + ((betweeneLength + eyeObjects[1].Width )/ 2);
                         * int forheadpeak = (int)(0.8 * betweeneLength);//
                         * int forheadpeakpeak = (int)(0.7 * betweeneLength);//
                         * int forheadbelowpeak = (int)(0.4 * betweeneLength);
                         * int foreheadpoint = (int)(0.6 * betweeneLength);
                         * int neareyebrowpoint = (int)(0.2 * betweeneLength);
                         * int lefteyebrowpoint = eyeObjects[0].X;//
                         * int righteyebrowpoint = eyeObjects[0].X + betweeneLength + eyeObjects[1].Width;//
                         * //int nosepoint =
                         * int xx = (int)((5.0 / 12.0) * betweeneLength);
                         * int margin = (int)((1.5 / 8.0) * betweeneLength);
                         *
                         * int x1 = (int)((1.0 / 16.0) * betweeneLength);
                         *
                         *
                         * int round = 3;
                         * int around = round-2;
                         * double tempcolor = 0;
                         * for (int i = 0; i<round; i++)
                         * {
                         *   for (int j = 0; j < round; j++)
                         *   {
                         *       tempcolor += greyImage[middleposition - around + i, eyeObjects[0].Y + forheadpeak - around + j].Intensity;
                         *   }
                         * }
                         * Gray skincolor = new Gray(tempcolor/(round*round));
                         * Point[] p = new Point[7];
                         * p[0] = new Point(middleposition, eyeObjects[0].Y - forheadpeak);
                         *
                         * p[1] = new Point(eyeObjects[0].X + (eyeObjects[0].Width / 2), eyeObjects[0].Y - forheadpeakpeak);
                         * p[2] = new Point(eyeObjects[0].X - x1, eyeObjects[0].Y - forheadbelowpeak);
                         * p[3] = new Point(lefteyebrowpoint - margin, eyeObjects[0].Y + (eyeObjects[0].Height/6));
                         *
                         * p[4] = new Point(righteyebrowpoint + margin, eyeObjects[0].Y + (eyeObjects[0].Height /6));
                         * p[5] = new Point(righteyebrowpoint + x1, eyeObjects[0].Y - forheadbelowpeak);
                         * p[6] = new Point(eyeObjects[1].X + (eyeObjects[1].Width / 2), eyeObjects[0].Y - forheadpeakpeak);
                         *
                         * //imageFrame.Draw(new Rectangle(new Point(eyeObjects[0].X, eyeObjects[0].Y), new Size(betweeneLength + eyeObjects[1].Width, eyeObjects[0].Height)), new Bgr(Color.Aqua), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(middleposition,eyeObjects[0].Y+ foreheadpoint), 1), new Bgr(Color.Yellow), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(middleposition,eyeObjects[0].Y - forheadpeak), 1), new Bgr(Color.Yellow), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(middleposition, eyeObjects[0].Y - neareyebrowpoint), 1), new Bgr(Color.Gold), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(lefteyebrowpoint - margin, eyeObjects[0].Y), 1), new Bgr(Color.AliceBlue), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(righteyebrowpoint + margin, eyeObjects[0].Y), 1), new Bgr(Color.AliceBlue), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(lefteyebrowpoint, eyeObjects[0].Y - neareyebrowpoint), 1), new Bgr(Color.LimeGreen), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(righteyebrowpoint, eyeObjects[0].Y - neareyebrowpoint), 1), new Bgr(Color.LimeGreen), 2);
                         * //imageFrame.DrawPolyline(p,true, new Bgr(Color.Azure), 2);
                         * greyImage.FillConvexPoly(p, skincolor);
                         * //imageFrame.Draw(new CircleF(new PointF(eyeObjects[0].X - x1, eyeObjects[0].Y - forheadbelowpeak), 1), new Bgr(Color.LimeGreen), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(righteyebrowpoint + x1, eyeObjects[0].Y - forheadbelowpeak), 1), new Bgr(Color.LimeGreen), 2);
                         *
                         * //imageFrame.Draw(new CircleF(new PointF(eyeObjects[0].X + (eyeObjects[0].Width / 2), eyeObjects[0].Y - forheadpeakpeak), 1), new Bgr(Color.LimeGreen), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(eyeObjects[1].X + (eyeObjects[1].Width / 2), eyeObjects[0].Y - forheadpeakpeak), 1), new Bgr(Color.LimeGreen), 2);
                         */
                        #endregion
                    }
                    else //not see eye in frame
                    {
                        learningTag        = true;
                        name               = "Processing...";
                        userid             = "Processing...";
                        timestampFlag      = true;
                        faceRectangle      = Rectangle.Empty;
                        realfaceRectangle  = Rectangle.Empty;
                        label2.ForeColor   = Color.DeepSkyBlue;
                        label2.Text        = "Idle";
                        progressBar1.Value = 0;
                        recogNameResult.Clear();
                        recogDistanceResult.Clear();
                        Console.WriteLine("Clear");
                    }

                    ARDisplayFlag = false;
                }
                else
                {
                    Parallel.ForEach(faces, facecount =>
                    {
                        try {
                            facePosition      = new Point(facecount.rect.X, facecount.rect.Y);
                            faceRectangleSize = new Size(facecount.rect.Width, facecount.rect.Height);
                            faceRectangle     = new Rectangle(facePosition, faceRectangleSize);
                            greyImage.ROI     = faceRectangle;
                            var eyeObjects    = eyeWithGlass.DetectMultiScale(greyImage, 1.3, 6, minEye, maxEye);
                            greyImage.ROI     = Rectangle.Empty;
                            if (eyeObjects.Length == 2)
                            {
                                Console.WriteLine("eye detected...");
                                if (eyeObjects[0].X > eyeObjects[1].X)
                                {
                                    var temp      = eyeObjects[0];
                                    eyeObjects[0] = eyeObjects[1];
                                    eyeObjects[1] = temp;
                                }

                                int betweeneLength    = eyeObjects[1].X - eyeObjects[0].X;
                                int lefteyebrowpoint  = eyeObjects[0].X;                       //
                                int righteyebrowpoint = eyeObjects[1].X + eyeObjects[1].Width; //
                                int margin            = (int)((1.5 / 8.0) * betweeneLength);
                                int neareyebrowpoint  = (int)(0.2 * betweeneLength);
                                int faceheight        = (int)(2.3 * betweeneLength);

                                realFacePosition      = new Point(facePosition.X + lefteyebrowpoint - margin, facePosition.Y + eyeObjects[0].Y - neareyebrowpoint);
                                realfaceRectangleSize = new Size((righteyebrowpoint + margin) - (lefteyebrowpoint - margin), faceheight);
                                realfaceRectangle     = new Rectangle(realFacePosition, realfaceRectangleSize);

                                greyImage.ROI = realfaceRectangle;
                                imageroi      = greyImage.Copy();
                                greyImage.ROI = Rectangle.Empty;

                                if (eigenRecog.IsTrained)
                                {
                                    imageroi._EqualizeHist();
                                    imageroi = imageroi.Resize(ROIwidth, ROIheight, INTER.CV_INTER_LINEAR);
                                    Image <Gray, byte> plainImage = imageroi.Copy();

                                    imageroi.FillConvexPoly(pL, new Gray(128));
                                    imageroi.FillConvexPoly(pR, new Gray(128));

                                    //find the most relative face
                                    progressBar1.Value = recogNameResult.Count;
                                    if (recogNameResult.Count == maxImageCount && !ARDisplayFlag)
                                    {
                                        Console.WriteLine("Processing...");
                                        int max         = 0;
                                        string mostFace = "";

                                        double euclidVal = 0;
                                        foreach (string value in recogNameResult.Distinct())
                                        {
                                            Console.WriteLine("\"{0}\" occurs {1} time(s).\n", value, recogNameResult.Count(v => v == value));
                                            if (recogNameResult.Count(v => v == value) > max)
                                            {
                                                max      = recogNameResult.Count(v => v == value);
                                                mostFace = value;
                                            }
                                        }
                                        name   = mostFace;
                                        userid = mydb.getUserIdFromSerrogate(name);
                                        if (learningTag && !(name.Equals("UnknownNull") || name.Equals("UnknownFace")))
                                        {
                                            learnImage    = imageroi;
                                            matchedResult = eigenRecog.Recognise(learnImage);
                                            //matchedResult = fishRecog.Recognise(learnImage);
                                            string[] matchedData = matchedResult.Split(' ');
                                            if ((Double.Parse(matchedData[1]) <= eigenRecog.getRecognizeTreshold) && (Double.Parse(matchedData[1]) != 0))
                                            //if ((Double.Parse(matchedData[1]) <= fishRecog.getRecognizeTreshold) && (Double.Parse(matchedData[1]) != 0))
                                            {
                                                int ItemIndex = 0;
                                                List <double> recogResultSum = new List <double>();
                                                foreach (var item in recogNameResult)
                                                {
                                                    if (mydb.getUserIdFromSerrogate(item).Equals(userid) && !item.Equals("UnknownNull"))
                                                    {
                                                        recogResultSum.Add(recogDistanceResult[ItemIndex]);
                                                    }
                                                    ItemIndex++;
                                                }
                                                meanDistance = recogResultSum.Sum() / recogResultSum.Count;
                                                euclidVal    = falsePositiveCheck(mydb.getComputeResultImage(name), imageroi.Copy());
                                                if (euclidVal < 9000)
                                                {
                                                    confident = (((double)recogResultSum.Count / (double)maxImageCount) * 100) * (1.00 - (euclidVal - (meanDistance * 130 / 100)) / 4500.00);
                                                    if (confident > 100)
                                                    {
                                                        confident = 100;
                                                    }
                                                    if (confident >= 80)
                                                    //if (meanDistance <= fishRecog.getRecognizeTreshold)
                                                    {
                                                        learnImage.Save(folderPath + tempPath);
                                                        plainImage.Save(folderPath + tempPath2);
                                                        Console.WriteLine(folderPath + tempPath);
                                                        string dbPath      = (folderPath + tempPath).Replace("\\", "/");
                                                        string dbPathPlain = (folderPath + tempPath2).Replace("\\", "/");
                                                        mydb.InsertImageTraining(int.Parse(userid), dbPathPlain, dbPath, false);
                                                        //
                                                        //auto train
                                                        //
                                                        if (mydb.getSpecifyImageCount(userid) > 5)
                                                        {
                                                            mydb.DeleteOldestImage(userid);
                                                        }
                                                        //eigenRecog.reloadData();
                                                        //fishRecog.reloadData();
                                                        learningTag = false;
                                                        Console.WriteLine("Learning:" + userid + "  Distance:" + meanDistance);
                                                    }
                                                    else
                                                    {
                                                        Console.WriteLine("Distance:" + meanDistance + "\n");
                                                    }
                                                }
                                            }
                                            if (timestampFlag)
                                            {
                                                Image <Gray, byte> resultImage = imageroi;
                                                resultImage.Save(folderPath + tempPath);
                                                Console.WriteLine(folderPath + tempPath);
                                                string dbPath = (folderPath + tempPath).Replace("\\", "/");
                                                mydb.InsertTimestamp(userid, Environment.MachineName, confident.ToString(), dbPath, meanDistance.ToString(), euclidVal.ToString());
                                                timestampFlag = false;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        Console.WriteLine("recognizing...");
                                        matchedResult = eigenRecog.Recognise(imageroi); //get serro+distance
                                        Console.WriteLine("Result:" + matchedResult + "\n");
                                        string[] matchedData = matchedResult.Split(' ');
                                        if (!matchedResult[0].Equals("UnknownNull") && !matchedResult[0].Equals("UnknownFace"))
                                        {
                                            //Console.WriteLine(matchedData[0] +" "+ matchedData[1]);
                                            recogNameResult.Add(matchedData[0]);
                                            recogDistanceResult.Add(Double.Parse(matchedData[1]));
                                            //File.AppendAllText(@"C:\Users\Xypher\Desktop\test2.csv", matchedData[1]+"\r\n");
                                        }
                                    }
                                }
                            }
                        }
                        catch
                        {
                        }
                    });
                }

                /*stopWatch.Stop();
                 * TimeSpan ts = stopWatch.Elapsed;
                 *
                 * string elapsedTime = String.Format("{0}",ts.TotalMilliseconds * 10000);
                 * stopWatch.Reset();*/
            }
        }
예제 #2
0
        private void TrainFrame(object sender, EventArgs e)
        {
            try
            {
                imageFrameT = captureT.QueryFrame();

                Image <Gray, byte> darkimage  = new Image <Gray, byte>(ROIwidth, ROIheight);
                Image <Gray, byte> cropimage  = new Image <Gray, byte>(ROIwidth, ROIheight);
                Image <Gray, byte> plainimage = new Image <Gray, byte>(ROIwidth, ROIheight);
                //ArrayList pic = new ArrayList();
                if (imageFrameT != null)
                {
                    Image <Gray, byte> greyImage = imageFrameT.Copy().Convert <Gray, byte>();


                    var faces = face.Detect(greyImage, 1.3, 6, HAAR_DETECTION_TYPE.FIND_BIGGEST_OBJECT, new Size(120, 120), new Size(300, 300));
                    if (faces.Length > 0)
                    {
                        label6.ForeColor = Color.Chocolate;
                        label6.Text      = "Tracking Face";
                        foreach (var facecount in faces)
                        {
                            facePosition      = new Point(facecount.rect.X, facecount.rect.Y);
                            faceRectangleSize = new Size(facecount.rect.Width, facecount.rect.Height);
                            faceRectangle     = new Rectangle(facePosition, faceRectangleSize);
                            greyImage.ROI     = faceRectangle;
                            var eyeObjects = eyeWithGlass.DetectMultiScale(greyImage, 1.3, 6, minEye, maxEye);
                            greyImage.ROI = Rectangle.Empty;
                            if (eyeObjects.Length == 2)
                            {
                                Console.WriteLine("eye");
                                if (eyeObjects[0].X > eyeObjects[1].X)
                                {
                                    var temp = eyeObjects[0];
                                    eyeObjects[0] = eyeObjects[1];
                                    eyeObjects[1] = temp;
                                }
                                int betweeneLength    = eyeObjects[1].X - eyeObjects[0].X;
                                int lefteyebrowpoint  = eyeObjects[0].X;                       //
                                int righteyebrowpoint = eyeObjects[1].X + eyeObjects[1].Width; //
                                int margin            = (int)((1.5 / 8.0) * betweeneLength);
                                int neareyebrowpoint  = (int)(0.2 * betweeneLength);
                                int faceheight        = (int)(2.3 * betweeneLength);

                                realFacePosition      = new Point(facePosition.X + lefteyebrowpoint - margin, facePosition.Y + eyeObjects[0].Y - neareyebrowpoint);
                                realfaceRectangleSize = new Size((righteyebrowpoint + margin) - (lefteyebrowpoint - margin), faceheight);
                                realfaceRectangle     = new Rectangle(realFacePosition, realfaceRectangleSize);

                                greyImage.ROI = realfaceRectangle;

                                imageFrameT.Draw(realfaceRectangle, new Bgr(Color.LimeGreen), 2);

                                if (trainflag)
                                {
                                    //get bigger face in frame
                                    cropimage = greyImage.Resize(ROIwidth, ROIheight, INTER.CV_INTER_LINEAR);

                                    if (!cropimage.Equals(darkimage))
                                    {
                                        cropimage._EqualizeHist();

                                        CvInvoke.cvFastNlMeansDenoising(cropimage, cropimage, 3, 7, 21);
                                        plainimage = cropimage.Copy();
                                        Point[] pL = new Point[3];
                                        Point[] pR = new Point[3];
                                        int     y0 = 105;
                                        int     y1 = 174;
                                        int     x0 = 0;
                                        int     x1 = 34;
                                        int     x2 = 105;
                                        int     x3 = 139;
                                        pL[0] = new Point(x0, y0);
                                        pL[1] = new Point(x0, y1);
                                        pL[2] = new Point(x1, y1);
                                        pR[0] = new Point(x3, y0);
                                        pR[1] = new Point(x3, y1);
                                        pR[2] = new Point(x2, y1);
                                        cropimage.FillConvexPoly(pL, new Gray(128));
                                        cropimage.FillConvexPoly(pR, new Gray(128));
                                        //cropimage = cropimage.SmoothMedian(3);
                                        imageBox7.Image = cropimage;         //line 2
                                        cropimage.Save(folderPath + tempPath);
                                        string dbPath = (folderPath + tempPath).Replace("\\", "/");
                                        plainimage.Save(folderPath + tempPath2);
                                        string dbPathPlain = (folderPath + tempPath2).Replace("\\", "/");
                                        mydb.InsertImageTraining(newid, dbPathPlain, dbPath, true);
                                        label6.ForeColor = Color.ForestGreen;
                                        label6.Text      = "Success";
                                        //File.Delete(tempPath);
                                        //eigenRecog.reloadData();
                                        imageBox7.Image = cropimage;
                                        imageCount++;
                                    }
                                    else
                                    {
                                        label6.ForeColor = Color.Red;
                                        label6.Text      = "Fail";
                                    }
                                    if (imageCount > 25)
                                    {
                                        trainflag        = false;
                                        imageCount       = 1;
                                        label6.ForeColor = Color.LimeGreen;
                                        label6.Text      = "Finish";
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        label6.ForeColor = Color.DeepSkyBlue;
                        label6.Text      = "Idle";
                    }
                    imageBox1.Image = imageFrameT;
                }
                else
                {
                    mydb.DeleteUser(newid);
                }
            }
            catch
            {
                // MessageBox.Show("Enable the face detection first", "Training Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
예제 #3
0
        private void ProcessFrame(object sender, EventArgs arg)
        {
            if (imageFrame != null)
            {
                Image <Gray, byte> greyImage = imageFrame.Copy().Convert <Gray, byte>();


                //greyImage._SmoothGaussian(3);
                //greyImage._EqualizeHist();
                stopWatch.Start();
                var faces = face.Detect(greyImage, 1.2, 6, HAAR_DETECTION_TYPE.FIND_BIGGEST_OBJECT, new Size(120, 120), new Size(200, 200));

                if (faces.Length == 0)
                {
                    var eyeObjects = eyeWithGlass.DetectMultiScale(greyImage, 1.2, 6, minEye, maxEye);
                    if (eyeObjects.Length == 2)
                    {
                        #region comment

                        /*Console.WriteLine("helper");
                         * if(eyeObjects[0].X > eyeObjects[1].X)
                         * {
                         *  var temp = eyeObjects[0];
                         *  eyeObjects[0] = eyeObjects[1];
                         *  eyeObjects[1] = temp;
                         * }
                         * int betweeneLength = eyeObjects[1].X - eyeObjects[0].X;
                         * int middleposition = eyeObjects[0].X + ((betweeneLength + eyeObjects[1].Width )/ 2);
                         * int forheadpeak = (int)(0.8 * betweeneLength);//
                         * int forheadpeakpeak = (int)(0.7 * betweeneLength);//
                         * int forheadbelowpeak = (int)(0.4 * betweeneLength);
                         * int foreheadpoint = (int)(0.6 * betweeneLength);
                         * int neareyebrowpoint = (int)(0.2 * betweeneLength);
                         * int lefteyebrowpoint = eyeObjects[0].X;//
                         * int righteyebrowpoint = eyeObjects[0].X + betweeneLength + eyeObjects[1].Width;//
                         * //int nosepoint =
                         * int xx = (int)((5.0 / 12.0) * betweeneLength);
                         * int xxx = (int)((1.5 / 8.0) * betweeneLength);
                         *
                         * int x1 = (int)((1.0 / 16.0) * betweeneLength);
                         *
                         *
                         * int round = 3;
                         * int around = round-2;
                         * double tempcolor = 0;
                         * for (int i = 0; i<round; i++)
                         * {
                         *  for (int j = 0; j < round; j++)
                         *  {
                         *      tempcolor += greyImage[middleposition - around + i, eyeObjects[0].Y + forheadpeak - around + j].Intensity;
                         *  }
                         * }
                         * Gray skincolor = new Gray(tempcolor/(round*round));
                         * Point[] p = new Point[7];
                         * p[0] = new Point(middleposition, eyeObjects[0].Y - forheadpeak);
                         *
                         * p[1] = new Point(eyeObjects[0].X + (eyeObjects[0].Width / 2), eyeObjects[0].Y - forheadpeakpeak);
                         * p[2] = new Point(eyeObjects[0].X - x1, eyeObjects[0].Y - forheadbelowpeak);
                         * p[3] = new Point(lefteyebrowpoint - xxx, eyeObjects[0].Y + (eyeObjects[0].Height/6));
                         *
                         * p[4] = new Point(righteyebrowpoint + xxx, eyeObjects[0].Y + (eyeObjects[0].Height /6));
                         * p[5] = new Point(righteyebrowpoint + x1, eyeObjects[0].Y - forheadbelowpeak);
                         * p[6] = new Point(eyeObjects[1].X + (eyeObjects[1].Width / 2), eyeObjects[0].Y - forheadpeakpeak);
                         *
                         * //imageFrame.Draw(new Rectangle(new Point(eyeObjects[0].X, eyeObjects[0].Y), new Size(betweeneLength + eyeObjects[1].Width, eyeObjects[0].Height)), new Bgr(Color.Aqua), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(middleposition,eyeObjects[0].Y+ foreheadpoint), 1), new Bgr(Color.Yellow), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(middleposition,eyeObjects[0].Y - forheadpeak), 1), new Bgr(Color.Yellow), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(middleposition, eyeObjects[0].Y - neareyebrowpoint), 1), new Bgr(Color.Gold), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(lefteyebrowpoint - xxx, eyeObjects[0].Y), 1), new Bgr(Color.AliceBlue), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(righteyebrowpoint + xxx, eyeObjects[0].Y), 1), new Bgr(Color.AliceBlue), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(lefteyebrowpoint, eyeObjects[0].Y - neareyebrowpoint), 1), new Bgr(Color.LimeGreen), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(righteyebrowpoint, eyeObjects[0].Y - neareyebrowpoint), 1), new Bgr(Color.LimeGreen), 2);
                         * //imageFrame.DrawPolyline(p,true, new Bgr(Color.Azure), 2);
                         * greyImage.FillConvexPoly(p, skincolor);
                         * //imageFrame.Draw(new CircleF(new PointF(eyeObjects[0].X - x1, eyeObjects[0].Y - forheadbelowpeak), 1), new Bgr(Color.LimeGreen), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(righteyebrowpoint + x1, eyeObjects[0].Y - forheadbelowpeak), 1), new Bgr(Color.LimeGreen), 2);
                         *
                         * //imageFrame.Draw(new CircleF(new PointF(eyeObjects[0].X + (eyeObjects[0].Width / 2), eyeObjects[0].Y - forheadpeakpeak), 1), new Bgr(Color.LimeGreen), 2);
                         * //imageFrame.Draw(new CircleF(new PointF(eyeObjects[1].X + (eyeObjects[1].Width / 2), eyeObjects[0].Y - forheadpeakpeak), 1), new Bgr(Color.LimeGreen), 2);
                         */
                        #endregion
                    }
                    else //not see eye in frame
                    {
                        name              = "Processing...";
                        learningTag       = true;
                        faceRectangle     = Rectangle.Empty;
                        realfaceRectangle = Rectangle.Empty;
                        recogNameResult.Clear();
                        recogDistanceResult.Clear();
                        Console.WriteLine("Clear");
                    }
                }
                else
                {
                    Parallel.ForEach(faces, facecount =>
                    {
                        try
                        {
                            facePosition      = new Point(facecount.rect.X, facecount.rect.Y);
                            faceRectangleSize = new Size(facecount.rect.Width, facecount.rect.Height);
                            faceRectangle     = new Rectangle(facePosition, faceRectangleSize);
                            greyImage.ROI     = faceRectangle;
                            var eyeObjects    = eyeWithGlass.DetectMultiScale(greyImage, 1.2, 6, minEye, maxEye);
                            greyImage.ROI     = System.Drawing.Rectangle.Empty;
                            if (eyeObjects.Length == 2)
                            {
                                Console.WriteLine("eye detected...");
                                if (eyeObjects[0].X > eyeObjects[1].X)
                                {
                                    var temp      = eyeObjects[0];
                                    eyeObjects[0] = eyeObjects[1];
                                    eyeObjects[1] = temp;
                                }

                                int betweeneLength    = eyeObjects[1].X - eyeObjects[0].X;
                                int lefteyebrowpoint  = eyeObjects[0].X;                                        //
                                int righteyebrowpoint = eyeObjects[0].X + betweeneLength + eyeObjects[1].Width; //
                                int xxx = (int)((1.5 / 8.0) * betweeneLength);
                                int neareyebrowpoint = (int)(0.2 * betweeneLength);
                                int faceheight       = (int)(2.3 * betweeneLength);

                                realFacePosition      = new Point(facePosition.X + lefteyebrowpoint - xxx, facePosition.Y + eyeObjects[0].Y - neareyebrowpoint);
                                realfaceRectangleSize = new Size((righteyebrowpoint + xxx) - (lefteyebrowpoint - xxx), faceheight);
                                realfaceRectangle     = new Rectangle(realFacePosition, realfaceRectangleSize);


                                greyImage.ROI = realfaceRectangle;
                                imageroi      = greyImage.Copy();
                                greyImage.ROI = new Rectangle();


                                if (eigenRecog.IsTrained)
                                {
                                    imageroi._EqualizeHist();
                                    imageroi = imageroi.Resize(ROIwidth, ROIheight, INTER.CV_INTER_LINEAR);

                                    //find the most relative face
                                    if (recogNameResult.Count == maxImageCount)
                                    {
                                        Console.WriteLine("Processing...");
                                        int max         = 0;
                                        string mostFace = "";
                                        foreach (string value in recogNameResult.Distinct())
                                        {
                                            Console.WriteLine("\"{0}\" occurs {1} time(s).\n", value, recogNameResult.Count(v => v == value));
                                            if (recogNameResult.Count(v => v == value) > max)
                                            {
                                                max      = recogNameResult.Count(v => v == value);
                                                mostFace = value;
                                            }
                                        }
                                        name = mostFace;
                                        if (learningTag && !(name.Equals("UnknownNull") || name.Equals("UnknownFace")))
                                        {
                                            learnImage           = imageroi;
                                            matchedResult        = eigenRecog.Recognise(learnImage);
                                            string[] matchedData = matchedResult.Split(' ');
                                            if ((Double.Parse(matchedData[1]) <= eigenRecog.getRecognizeTreshold) && (Double.Parse(matchedData[1]) != 0))
                                            {
                                                meanDistance = recogDistanceResult.Sum() / maxImageCount;
                                                if (meanDistance <= eigenRecog.getRecognizeTreshold)
                                                {
                                                    learnImage.Save(tempPath);
                                                    mydb.InsertImageTraining(name, tempPath, false);
                                                    if (mydb.getSpecifyImageCount(name) > 3)
                                                    {
                                                        mydb.DeleteOldestImage(name);
                                                    }
                                                    eigenRecog.reloadData();
                                                    learningTag = false;
                                                    Console.WriteLine("Learning:" + name + "  Distance:" + meanDistance);
                                                }
                                                else
                                                {
                                                    Console.WriteLine("Distance:" + meanDistance + "\n");
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        Console.WriteLine("recognizing...");
                                        matchedResult = eigenRecog.Recognise(imageroi);
                                        Console.WriteLine("Result:" + matchedResult + "\n");
                                        File.AppendAllText(@logFolder + logName + "_ver1.0.txt", "Result:" + matchedResult + "\r\n");
                                        string[] matchedData = matchedResult.Split(' ');
                                        if (!matchedResult[0].Equals("UnknownNull") && !matchedResult[0].Equals("UnknownFace"))
                                        {
                                            //Console.WriteLine(matchedData[0] +" "+ matchedData[1]);
                                            recogNameResult.Add(matchedData[0]);
                                            recogDistanceResult.Add(Double.Parse(matchedData[1]));
                                        }
                                    }
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            Console.Write(e);
                        }
                    });
                }
                stopWatch.Stop();
                TimeSpan ts = stopWatch.Elapsed;

                // Format and display the TimeSpan value.
                string elapsedTime = String.Format("{0}",

                                                   ts.TotalMilliseconds * 10000);
                textBox2.Text = elapsedTime;
                //listView1.Items.Add(elapsedTime);
                //File.AppendAllText(@logFolder + logName + "_ver1.0.txt", "Frametime: "+elapsedTime+"\r\n");
                stopWatch.Reset();
            }
        }
        private void TrainFrame()
        {
            try
            {
                Image <Gray, byte> darkimage = new Image <Gray, byte>(ROIwidth, ROIheight);
                Image <Gray, byte> cropimage = new Image <Gray, byte>(ROIwidth, ROIheight);

                //ArrayList pic = new ArrayList();
                if (imageFrameT != null)
                {
                    Image <Gray, byte> greyImage = imageFrameT.Convert <Gray, byte>();


                    var faces = face.Detect(greyImage, 1.3, 6, HAAR_DETECTION_TYPE.FIND_BIGGEST_OBJECT, new Size(120, 120), new Size(200, 200));
                    if (faces.Length > 0)
                    {
                        foreach (var facecount in faces)
                        {
                            facePosition = new Point(facecount.rect.X, facecount.rect.Y);
                            var eyeObjects = eyeWithGlass.DetectMultiScale(greyImage, 1.3, 6, minEye, maxEye);
                            if (eyeObjects.Length == 2)
                            {
                                Console.WriteLine("eye");
                                if (eyeObjects[0].X > eyeObjects[1].X)
                                {
                                    var temp = eyeObjects[0];
                                    eyeObjects[0] = eyeObjects[1];
                                    eyeObjects[1] = temp;
                                }
                                int betweeneLength    = eyeObjects[1].X - eyeObjects[0].X;
                                int lefteyebrowpoint  = eyeObjects[0].X;                                        //
                                int righteyebrowpoint = eyeObjects[0].X + betweeneLength + eyeObjects[1].Width; //
                                int xxx = (int)((1.5 / 8.0) * betweeneLength);
                                int neareyebrowpoint = (int)(0.2 * betweeneLength);
                                int faceheight       = (int)(2.3 * betweeneLength);

                                //imageFrameT.Draw(facecount.rect, new Bgr(Color.Red), 2);
                                //imageFrameT.Draw(facecount.rect.Height + "," + facecount.rect.Width, ref font, new Point(facecount.rect.X - 2, facecount.rect.Y - 2), new Bgr(Color.LightGreen));
                                greyImage.ROI = new Rectangle(new Point(lefteyebrowpoint - xxx, eyeObjects[0].Y - neareyebrowpoint), new Size((righteyebrowpoint + xxx) - (lefteyebrowpoint - xxx), faceheight));
                                //CropFrame = greyImage.Copy();
                                //pic.Add(CropFrame);

                                //get bigger face in frame
                                cropimage = greyImage.Resize(ROIwidth, ROIheight, INTER.CV_INTER_LINEAR);
                                if (!cropimage.Equals(darkimage))
                                {
                                    cropimage._EqualizeHist();
                                    //CvInvoke.cvSmooth(cropimage, cropimage, SMOOTH_TYPE.CV_GAUSSIAN, 1, 1, 1, 1);
                                    //cropimage = eigenRecog.convertLBP(cropimage,1);
                                    imageBox7.Image = cropimage;     //line 2


                                    cropimage.Save(tempPath);
                                    mydb.InsertImageTraining(textBox1.Text, tempPath, true);

                                    //File.Delete(tempPath);
                                    eigenRecog.reloadData();
                                    //Fish_Recog.reloadData();
                                }
                            }
                            imageBox7.Image = cropimage;
                        }
                    }
                }
            }
            catch
            {
                // MessageBox.Show("Enable the face detection first", "Training Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }