public static FaceResult FaceDetect(Image <Bgr, Byte> image)
        {
            FaceResult result = new FaceResult(image.Copy());

            //convierto a escala de grises
            Image <Gray, Byte> gray = image.Convert <Gray, Byte>();

            //normalizamos el brillo y mejoramos el contraste
            gray._EqualizeHist();

            //leemos el XML con el entrenamiento (en nuestros caso usamos uno de caras frontales)
            HaarCascade face = new HaarCascade(Directories.GetHaarCascade());

            //Detectamos las caras de la imagen en blanco y negro
            //El primer dimensional contiene el canal (solo nos centraremos en el canal 0, porque estamos trabajando en blanco y negro)
            //El segundo dimensional es el indice del rectangulo
            MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(face, 1.1, 10, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(20, 20));

            //Por cada rectangulo detectado, lo incluimos en el resultado
            foreach (MCvAvgComp f in facesDetected[0])
            {
                result.AddFace(f.rect);
            }

            return(result);
        }
Exemple #2
0
        private void ProcessImage()
        {
            GetImage();

            LastResult = new LastResults(image);

            if (Config.calculeIluminance)
            {
                double iluminance = ImageUtils.GetIluminance(image);
                LastResult.iluminance = iluminance;
                if (iluminance <= Config.lowIluminanceEvent && lowIluminanceEvent != null)
                {
                    //Data.InfoMessages.InformationMessage("La iluminacion es " + iluminance);
                    lowIluminanceEvent(iluminance);
                }

                if (iluminance >= Config.highIluminanceEvent && highIluminanceEvent != null)
                {
                    //Data.InfoMessages.InformationMessage("La iluminacion es " + iluminance);
                    highIluminanceEvent(iluminance);
                }
            }

            if (Config.calculeMovement)
            {
                double movement = ImageUtils.GetMovement(image, lastImage);
                LastResult.movement = movement;
                if (movement >= Config.isMovement)
                {
                    //lanzar evento
                    if (movementDetected != null)
                    {
                        //Data.InfoMessages.InformationMessage("Movimiento " + movement);
                        movementDetected(movement);
                    }

                    if (Config.saveMovement)
                    {
                        ImageUtils.SavePicture(image);
                    }
                }
            }

            if (Config.calculeFace)
            {
                FaceResult faceResult = ImageUtils.FaceDetect(image);
                LastResult.faces         = faceResult;
                LastResult.numberOfFaces = faceResult.GetNumberOfFaces();
                if (faceResult.FaceDetect())
                {
                    //lanzar evento
                    if (peopleDetected != null)
                    {
                        peopleDetected(faceResult);
                    }

                    if (Config.saveFaces)
                    {
                        faceResult.SaveAllFaces();
                    }
                }
            }
            if (finishImageProcess != null)
            {
                finishImageProcess(LastResult);
                //Data.InfoMessages.InformationMessage(LastResult.ToString());
            }
        }