2010-05-14 33 views
6

我想用EmguCV做一些面部识别。我想知道我是否可以使用EigenObjectRecognizer来完成这项任务?有人能解释我如何使用它吗?因为如果没有不匹配的照片,它也会返回一个值。这里有一个例子:使用EigenObjectRecognizer

Image<Gray, Byte>[] trainingImages = new Image<Gray,Byte>[5]; 
     trainingImages[0] = new Image<Gray, byte>("brad.jpg"); 
     trainingImages[1] = new Image<Gray, byte>("david.jpg"); 
     trainingImages[2] = new Image<Gray, byte>("foof.jpg"); 
     trainingImages[3] = new Image<Gray, byte>("irfan.jpg"); 
     trainingImages[4] = new Image<Gray, byte>("joel.jpg"); 
String[] labels = new String[] { "Brad", "David", "Foof", "Irfan" , "Joel"} 
    MCvTermCriteria termCrit = new MCvTermCriteria(16, 0.001); 

    EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
     trainingImages, 
     labels, 
     5000, 
     ref termCrit); 
     Image<Gray,Byte> testImage = new Image<Gray,Byte>("brad_test.jpg"); 

    String label = recognizer.Recognize(testImage); 
    Console.Write(label); 

它返回“布拉德”。但如果我在testimage改变照片的时候也返回了一些名字,甚至Brad.Is什么好处人脸识别使用这种方法吗?或者有没有更好的方法?

+1

难道你不需要训练所有其他图片吗?看起来你只是训练它寻找brad。 – 2010-05-14 21:13:10

+0

他似乎将一组图像和一组标签传递给他的识别器。你为什么认为他没有训练他们? – Blindy 2010-05-14 21:35:31

+0

我训练它寻找brad,因为我想用数据库来品尝图像。就像我有1张人的照片,我想找到它是谁? – Ercan 2010-05-14 21:51:59

回答

1

我做了一些练习,发现当它没有发现它会返回空字符串。将值5000更改为1000可以获得更接近的价值,但是如果您使用网络摄像头,则测试和数据库中的照片必须几乎相同。

+0

我也练习过它,似乎如果我有一张测试面,那么它将所有面都贴上标签,作为测试面的标签。我想识别不同的面孔,因为他们已被标记。目前还没有解决问题。 – Rick2047 2010-07-15 19:26:47

0

嗯,我不知道Emgu Cv,但我认为Robert Harvey说的是正确的。你必须训练你的神经网络。此外,无论如何,神经网络总会返回结果。如果结果是错误的,这意味着你没有足够的训练你的网络。

+0

以下所述。但是,我也需要错误的结果来查看没有匹配。并报告没有找到。但如果它返回一些东西,我该怎么做? – Ercan 2010-05-14 22:03:39

+0

我当然不是这些东西的专家,但是我认为你会混淆标准是/否,1/0,“发现/未找到”与神经网络编程(如人脸识别)编程。一个“未发现”的问题不会发生在一个神经网络中......也许你必须添加一个“未知”图像,并训练你的网络将其识别为默认值?我不知道... http://www.google.be/search?source=ig&hl=nl&rlz=&q=neural+networks&btnG=Google+zoeken&meta= http://www.google。be/search?source = ig&hl = nl&rlz =&q = fuzzy + logic&btnG = Google + zoeken&meta = – 2010-05-17 14:03:57

0
recognizer.Recognize(testImage) RETURN EigenObjectRecognizer.RecognitionResult 

所以你可以尝试:

EigenObjectRecognizer.RecognitionResult helo = recognizer.Recognize(result); 
Console.Write(helo.lable); 
0

你可以重载Emgu.CV.EigenObjectRecognizer的识别功能,如:

public String Recognize(Image<Gray, Byte> image, out float distance) 
     { 
      int index; 
      float eigenDistance; 
      String label; 
      FindMostSimilarObject(image, out index, out eigenDistance, out label); 
      distance = eigenDistance; 
      return (_eigenDistanceThreshold <= 0 || eigenDistance < _eigenDistanceThreshold) ? _labels[index] : String.Empty; 
     } 

Idea constructed on Overload Snippet from Codeproject

,并以这种方式获得运行的最后派生距离如

float last_distance =0; 
label = recognizer.Recognize(testImage, out last_distance); 

这会给你的价值的一个更好的想法通过简单地将其输送至一个标签,在看看值的范围就摆在

MCvTermCriteria termCrit = new MCvTermCriteria(trainingImages.count, 0.001); 

EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
         trainingImages.ToArray(), 
         labels.ToArray(), 
         <<good max val derived from last_distance>>, 
         ref termCrit); 

3 or 4 thousand maybe...