2017-07-18 66 views
0

我有窗口應用程序,它將檢測多個臉部並捕捉臉部並保存爲圖像。我使用EMGU CV來做臉部檢測,我從示例代碼和教程中學習。當需要將面部捕捉爲訓練數據集時,雖然它檢測到2個面,但只能存儲一個面。我嘗試修改代碼,但它看起來不像預期的那樣工作。下面是代碼:EMgucv保存從網絡攝像頭檢測到的多個臉部

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"); 

    } 
} 

當檢測到2個臉部時,foreach循環將循環兩次,但臉部保存是相同的。任何想法出了什麼問題?

回答

0

,請嘗試以下方法

每個檢測到的面部,你必須把它添加到訓練圖像 ,你需要循環出來的側for each循環

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"); 

} 

我認爲,在for循環可改爲

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

請嘗試這種方式,它可能工作..

+0

我試過了,仍然一樣。儘管在相機中檢測到2個不同的面並且繪製了2個紅色矩形。 foreach循環兩次,但保存了同一張臉。 –

相關問題