使用EigenObjectRecognizer

时间:2010-05-14 20:48:34

标签: c# emgucv

我正在尝试使用EmguCV进行面部识别。我想知道我是否可以使用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);

它返回“brad”。但是如果我在testimage中更改照片它也会返回一些名字甚至Brad.Is对于使用这种方法进行面部识别是否有用?或者有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

好吧,我不知道Emgu Cv,但我认为Robert Harvey说的是对的。你必须训练你的神经网络。此外,无论如何,神经网络总会返回结果。如果结果错误,则表示您没有对网络进行足够的培训。

答案 2 :(得分:0)

recognizer.Recognize(testImage) RETURN EigenObjectRecognizer.RecognitionResult

所以你可以尝试:

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

答案 3 :(得分:0)

你可以重载Emgu.CV.EigenObjectRecognizer的Recognize函数,如:

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...