Exemple #1
0
        public static void DrawFaceRegion(Image <Bgr, Byte> image, FaceRegion2D faceRegion, Bgr color)
        {
            image.Draw(faceRegion.Face.ToRectangle(), color, 2);

            if (faceRegion.LeftEye != null)
            {
                image.Draw(new Rectangle
                               (faceRegion.Face.Location.X + faceRegion.LeftEye.Location.X,
                               faceRegion.Face.Location.Y + faceRegion.LeftEye.Location.Y,
                               faceRegion.LeftEye.Width,
                               faceRegion.LeftEye.Height),
                           color, 2);
            }

            if (faceRegion.RightEye != null)
            {
                image.Draw(new Rectangle
                               (faceRegion.Face.Location.X + faceRegion.RightEye.Location.X,
                               faceRegion.Face.Location.Y + faceRegion.RightEye.Location.Y,
                               faceRegion.RightEye.Width,
                               faceRegion.RightEye.Height),
                           color, 2);
            }

            if (faceRegion.Mouth != null)
            {
                image.Draw(new Rectangle
                               (faceRegion.Face.Location.X + faceRegion.Mouth.Location.X,
                               faceRegion.Face.Location.Y + faceRegion.Mouth.Location.Y,
                               faceRegion.Mouth.Width,
                               faceRegion.Mouth.Height),
                           color, 2);
            }
        }
 public FaceRegion2DHistory(FaceRegion2D faceRegion)
 {
     Face = faceRegion.Face;
     LeftEye = faceRegion.LeftEye;
     RightEye = faceRegion.RightEye;
     Mouth = faceRegion.Mouth;
     EyeAngle = faceRegion.EyeAngle;
 }
Exemple #3
0
 public FaceRegion2DHistory(FaceRegion2D faceRegion)
 {
     Face     = faceRegion.Face;
     LeftEye  = faceRegion.LeftEye;
     RightEye = faceRegion.RightEye;
     Mouth    = faceRegion.Mouth;
     EyeAngle = faceRegion.EyeAngle;
 }
Exemple #4
0
        public static void DrawFaceRegionCircle(Image <Bgr, Byte> image, FaceRegion2D faceRegion, Bgr color)
        {
            image.Draw(new CircleF(new PointF(faceRegion.Face.Location.X + faceRegion.Face.Width / 2,
                                              faceRegion.Face.Location.Y + faceRegion.Face.Height / 2),
                                   (faceRegion.Face.Width + faceRegion.Face.Height) / 4), color, 2);

            if (faceRegion.LeftEye != null)
            {
                image.Draw(new CircleF(new PointF
                                           (faceRegion.Face.Location.X + faceRegion.LeftEye.Location.X + faceRegion.LeftEye.Width / 2,
                                           faceRegion.Face.Location.Y + faceRegion.LeftEye.Location.Y + faceRegion.LeftEye.Height / 2),
                                       (faceRegion.LeftEye.Width + faceRegion.LeftEye.Height) / 4),
                           color, 2);
            }

            if (faceRegion.RightEye != null)
            {
                image.Draw(new CircleF(new PointF
                                           (faceRegion.Face.Location.X + faceRegion.RightEye.Location.X + faceRegion.RightEye.Width / 2,
                                           faceRegion.Face.Location.Y + faceRegion.RightEye.Location.Y + faceRegion.RightEye.Height / 2),
                                       (faceRegion.RightEye.Width + faceRegion.RightEye.Height) / 4),
                           color, 2);
            }
        }
        private void ProcessFrame()
        {
            while (_captureContinue)
            {
                while (_processQueueLength != 2)
                {
                    Thread.Sleep(SleepInterval);
                }

                if ((Helper2D.FilterInstances.Mode == Mode.Cpu && useGpuMenuItem.Checked) ||
                    (Helper2D.FilterInstances.Mode == Mode.Gpu && useGpuMenuItem.Checked == false))
                {
                    Helper2D.FilterInstances = new FilterInstances(useGpuMenuItem.Checked ? Mode.Gpu : Mode.Cpu);
                }

                double distance;

                if (_cameras[0].FaceRegions == null ||
                    _cameras[1].FaceRegions == null)
                {
                    _resetCorrelation = true;
                }

                if (_resetCorrelation == false)
                {
                    #region Find correlation with previous face regions

                    // iterate through all cameras and track faces
                    foreach (Camera camera in _cameras)
                    {
                        var newRawFaceRegions = new List <FaceRegion2D>();

                        // iterate through every face found previously, rotate image and find faces
                        foreach (FaceRegion2D faceRegion in camera.FaceRegions)
                        {
                            Image <Bgr, byte> image = camera.Image.Rotate(faceRegion.EyeAngle,
                                                                          new PointF(faceRegion.Face.Location.X + faceRegion.Face.Width / 2, faceRegion.Face.Location.Y + faceRegion.Face.Height / 2),
                                                                          INTER.CV_INTER_CUBIC, _rotateBackground, true);

                            if (_debugRotation)
                            {
                                camera.Image = image;
                            }

                            // find faces in rotated image
                            newRawFaceRegions.AddRange(Helper2D.GetFaceRegion2Ds(image, FaceWidth, FaceHeight, true, false));
                        }

                        // find best corespondence between old faces and new faces
                        IEnumerable <Tuple <int, int> > corespondences = Helper.FindCorespondence
                                                                             (camera.FaceRegions.Select(item => item.Face.Location).ToArray(),
                                                                             newRawFaceRegions.Select(item => item.Face.Location).ToArray(),
                                                                             out distance);

                        if (corespondences == null ||
                            corespondences.Any() == false)
                        {
                            // face regions lost .. RESET both cameras
                            _resetCorrelation = true;
                            break;
                        }

                        var newFaceRegions = new FaceRegion2D[corespondences.Count()];

                        for (int i = 0; i < corespondences.Count(); i++)
                        {
                            FaceRegion2D faceRegion = newRawFaceRegions.ElementAt(corespondences.ElementAt(i).Item2);

                            faceRegion.SetHistory(camera.FaceRegions.ElementAt(corespondences.ElementAt(i).Item1));

                            newFaceRegions[i] = faceRegion;
                        }

                        camera.FaceRegions = newFaceRegions;
                    }

                    #endregion
                }

                if (_resetCorrelation)
                {
                    #region Reset Found Faces

                    foreach (Camera camera in _cameras)
                    {
                        camera.FaceRegions = Helper2D.GetFaceRegion2Ds(camera.Image, FaceWidth, FaceHeight, true, false);
                    }

                    #endregion
                }

                if (_cameras[0].FaceRegions.Length > 0 &&
                    _cameras[1].FaceRegions.Length > 0)
                {
                    #region Find correlation in stereo images and add history

                    IEnumerable <Point>[] points = _cameras.Select(camera => camera.FaceRegions.
                                                                   Select(region => region.Face.Location)).ToArray();

                    List <Tuple <int, int> > correlations = Helper.FindCorespondence(points.ElementAt(0), points.ElementAt(1), out distance).ToList();


                    // images have incorect correlations and history
                    if (_resetCorrelation == false &&
                        correlations.Any(item => _cameras[0].FaceRegions.ElementAt(item.Item1).Id != _cameras[1].FaceRegions.ElementAt(item.Item2).Id))
                    {
                        _resetCorrelation = true;
                    }

                    if (_resetCorrelation)
                    {
                        // assign faces color and Id
                        foreach (var correlation in correlations)
                        {
                            var color = new Bgr(_random.NextDouble() * 255, _random.NextDouble() * 255, _random.NextDouble() * 255);

                            FaceRegion2D leftFaceRegion  = _cameras[0].FaceRegions.ElementAt(correlation.Item1);
                            FaceRegion2D rightFaceRegion = _cameras[1].FaceRegions.ElementAt(correlation.Item2);

                            rightFaceRegion.Id = leftFaceRegion.Id;

                            leftFaceRegion.BoundingBoxColor  = color;
                            rightFaceRegion.BoundingBoxColor = color;
                        }
                    }

                    #endregion

                    #region Recognize Faces

                    _cameras.ForEach(camera =>
                    {
                        if (camera.FaceRegions != null)
                        {
                            camera.FaceRegions.ToList().ForEach(faceRegion =>
                            {
                                Helper.DrawFaceRegionCircle(camera.Image, faceRegion, faceRegion.BoundingBoxColor);

                                string label = HelperFaces.Recognize(faceRegion.FaceImage);

                                camera.Image.Draw(string.Format("{0}", label),
                                                  ref _font, faceRegion.Face.Location, new Bgr(0, 0, 255));
                            });
                        }
                    });

                    #endregion

                    EventHandler <FaceRegionsEventArgs> facesAvailableHandler = FacesAvailable;
                    if (facesAvailableHandler != null)
                    {
                        facesAvailableHandler(this, new FaceRegionsEventArgs(_cameras[0].FaceRegions, _cameras[1].FaceRegions, null));
                    }

                    _faces = _cameras.SelectMany(camera => camera.FaceRegions).Select(item => item.FaceImage).ToArray();
                }

                _resetCorrelation = false;

                PostProcess();

                lock (this)
                {
                    _processQueueLength = 0;
                }
            }
        }
Exemple #6
0
        private void OnButtonCalibrateClick(object sender, EventArgs e)
        {
            if (_leftFaceRegions.Count < 3)
            {
                return;
            }

            IsCalibrating = true;

            try
            {
                var objectPoints = new MCvPoint3D32f[_leftFaceRegions.Count][];

                FaceRegion2D firstLeft = _leftFaceRegions.First();

                for (int i = 0; i < _leftFaceRegions.Count; i++)
                {
                    objectPoints[i] = new MCvPoint3D32f[4];

                    objectPoints[i][0] = new MCvPoint3D32f(firstLeft.Mouth.Location.X, firstLeft.Mouth.Location.Y, 0);
                    objectPoints[i][1] = new MCvPoint3D32f(firstLeft.LeftEye.Location.X, firstLeft.LeftEye.Location.Y, 0);
                    objectPoints[i][2] = new MCvPoint3D32f(firstLeft.RightEye.Location.X, firstLeft.RightEye.Location.Y, 0);
                    objectPoints[i][3] = new MCvPoint3D32f(firstLeft.Face.Location.X, firstLeft.Face.Location.Y, 0);
                }

                var leftImagePoints = new PointF[_leftFaceRegions.Count][];

                for (int i = 0; i < _leftFaceRegions.Count; i++)
                {
                    leftImagePoints[i] = new PointF[4];

                    leftImagePoints[i][0] = new PointF(_leftFaceRegions[i].Mouth.Location.X, _leftFaceRegions[i].Mouth.Location.Y);
                    leftImagePoints[i][1] = new PointF(_leftFaceRegions[i].LeftEye.Location.X, _leftFaceRegions[i].LeftEye.Location.Y);
                    leftImagePoints[i][2] = new PointF(_leftFaceRegions[i].RightEye.Location.X, _leftFaceRegions[i].RightEye.Location.Y);
                    leftImagePoints[i][3] = new PointF(_leftFaceRegions[i].Face.Location.X, _leftFaceRegions[i].Face.Location.Y);
                }

                var rightImagePoints = new PointF[_leftFaceRegions.Count][];

                for (int i = 0; i < _leftFaceRegions.Count; i++)
                {
                    rightImagePoints[i] = new PointF[4];

                    rightImagePoints[i][0] = new PointF(_rightFaceRegions[i].Mouth.Location.X, _rightFaceRegions[i].Mouth.Location.Y);
                    rightImagePoints[i][1] = new PointF(_rightFaceRegions[i].LeftEye.Location.X, _rightFaceRegions[i].LeftEye.Location.Y);
                    rightImagePoints[i][2] = new PointF(_rightFaceRegions[i].RightEye.Location.X, _rightFaceRegions[i].RightEye.Location.Y);
                    rightImagePoints[i][3] = new PointF(_rightFaceRegions[i].Face.Location.X, _rightFaceRegions[i].Face.Location.Y);
                }

                var intrinsicCameraParameters1 = new IntrinsicCameraParameters();
                var intrinsicCameraParameters2 = new IntrinsicCameraParameters();

                ExtrinsicCameraParameters extrinsicCameraParameters;
                Matrix <double>           foundamentalMatrix;
                Matrix <double>           essentialMatrix;

                CameraCalibration.StereoCalibrate(objectPoints, leftImagePoints, rightImagePoints,
                                                  intrinsicCameraParameters1, intrinsicCameraParameters2,
                                                  new Size(firstLeft.SourceImage.Width, firstLeft.SourceImage.Height),
                                                  CALIB_TYPE.DEFAULT,
                                                  new MCvTermCriteria(), out extrinsicCameraParameters, out foundamentalMatrix, out essentialMatrix);

                Options.StereoCalibrationOptions = new StereoCalibrationOptions
                {
                    EssentialMatrix           = essentialMatrix,
                    ExtrinsicCameraParameters = extrinsicCameraParameters,
                    FoundamentalMatrix        = foundamentalMatrix
                };
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                IsCalibrating = false;
            }
        }