2017-07-18 3 views
0

J'ai une application de fenêtre qui permettra de détecter plusieurs visages et de capturer le visage et enregistrer en tant qu'image. J'utilise le CV EMGU pour faire la détection de visage, j'apprends de l'exemple de code et du tutoriel. Lorsqu'il a besoin de capturer le visage en tant que jeu de données, il ne peut stocker qu'un visage alors qu'il a détecté 2 visages. J'essaie de modifier le code, mais il semble que cela ne fonctionne pas comme prévu. Voici le code:EMgucv enregistrer plusieurs visage détecté de la webcam

gray = grabber.QueryGrayFrame().Resize(320, 240, 
Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC); 

MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(
      face, 
      1.2, 
      10, 
      Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, 
      new Size(20, 20)); 

foreach (MCvAvgComp f in facesDetected[0]) 
{ 
    TrainedFace = currentFrame.Copy(f.rect).Convert<Gray, byte>(); 

    TrainedFace = result.Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC); 
    trainingImages.Add(TrainedFace); 

    for (int i = 1; i < trainingImages.ToArray().Length + 1; i++) 
    { 
     trainingImages.ToArray()[i - 1].Save(Application.StartupPath + "/TrainedFaces/face" + i + ".bmp"); 

    } 
} 

La boucle volonté de boucle foreach deux fois lorsque 2 visages détectés, mais le visage de sauvegarde est le même. Une idée de ce qui ne va pas?

Répondre

0

s'il vous plaît essayer de la manière suivante

Pour chacun des visages détectés, vous devrez ajouter aux images de formation et vous devez en boucle à côté de la pour chaque boucle

gray = grabber.QueryGrayFrame().Resize(320, 240, 
Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC); 

MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(
     face, 
     1.2, 
     10, 
     Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, 
     new Size(20, 20)); 

foreach (MCvAvgComp f in facesDetected[0]) 
{ 
TrainedFace = currentFrame.Copy(f.rect).Convert<Gray, byte>(); 

TrainedFace = result.Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC); 
trainingImages.Add(TrainedFace); 
} 

for (int i = 1; i < trainingImages.ToArray().Length + 1; i++) 
{ 
    trainingImages.ToArray()[i - 1].Save(Application.StartupPath + "/TrainedFaces/face" + i + ".bmp"); 

} 

Je pense que la boucle pourrait être changée pour

int i=1; 
foreach(TrainedFace Tface in trainingImages) 
    { 
    Tface.Save(Application.StartupPath + "/TrainedFaces/face" + i + ".bmp") 
    i++; 
    } 

S'il vous plaît essayer cette façon, il pourrait fonctionner ..

+0

J'ai essayé et toujours la même chose. Bien détecté 2 visages différents dans l'appareil photo et il dessine 2 rectangle rouge. Le foreach boucle deux fois mais il sauve le même visage. –