6

我正在尝试使用 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。使用这种方法对人脸识别有好处吗?或者有没有更好的方法?

4

4 回答 4

1

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

于 2010-05-18T20:28:59.903 回答
0

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

于 2010-05-14T21:28:54.383 回答
0
recognizer.Recognize(testImage) RETURN EigenObjectRecognizer.RecognitionResult

所以你可以尝试:

EigenObjectRecognizer.RecognitionResult helo = recognizer.Recognize(result);
Console.Write(helo.lable);
于 2013-06-14T14:30:58.090 回答
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;
      }

基于 Codeproject 的 Overload Snippet 构建的想法

并以这种方式接收运行的最后导出距离,例如

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

通过简单地将其输送到标签并查看值的范围。

大概三四千吧……

于 2017-05-10T01:15:19.823 回答