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