如何使用EMGU CV获得面部识别中的置信度值?

时间:2012-02-26 22:26:48

标签: c# opencv emgucv opencvdotnet

我正在开发一个项目,我应该设计一个可以检测路过的人的所有面孔的应用程序......我有一个非常庞大的数据库,由几个已知的人组成......我使用了EigenObjectRecognizer来识别网络摄像头捕获的图像帧...但问题是有时它会错误地识别一些人....所以如果得到这个面部匹配的置信度...那么我可以写一个条件循环,如果它是超过75%,然后只检测他,否则不要。我也知道基于PCA的识别是基本的,我肯定会转向其他新算法。但由于项目的截止日期,我应该快速提交.. ..那么请告诉我如何获得这个EigenObjectRecognizer面部识别的置信度值....

1 个答案:

答案 0 :(得分:7)

没有确切的置信度值,但是有一个可变比例可以使用并大致解释为特征距离。

根据您拥有的数据量和训练参数,分类为良好匹配的值会发生变化,因此您必须使用不同的面来测试值以计算出您的阈值。

您必须向Eigen类添加一个函数才能获得此值。首先,我们将覆盖我们使用的EigenObjectRecognizer。这个文件EigenObjectRecognizer.cs真的很简单,它位于\ EMGU安装目录\ Emgu.CV中,或者你在哪里提取文件你应该能够将它作为它与bin文件夹相同的文件夹你使用的.dll。

通过在视觉分析中右键单击解决方案资源管理器中的项目名称并选择添加>现有项目...导航到该文件并添加它,将文件添加到项目中。您的项目将自动使用此项而不是您的参考中使用EMGU.CV.dll保存的项目。

现在在项目中打开EigenObjectRecognizer.cs,不要担心它是原始的副本,因此您所做的任何更改都不会影响原始源。通过按住Ctrl键,按m键,然后按o键,可以使所有方法字段折叠,从而简化操作。

首先,我们需要覆盖我称之为我的Emgu.Custom的命名空间。

现在位于代码的顶部,在其他

下添加以下变量
private float eigenDistance;

将以下方法添加到类

  /// <summary>
  /// Get the calculated Eignen Distance for the last proceessed frame
  /// </summary>
  public float GetEignenDistance
  {
      get { return eigenDistance; }
  }

您可以将它放在任何地方,但显然是在课堂内和方法之外,现在是重要的一点。我们已经将eigenDistance设为全局,但是当我们调用.Recognize(图像图像)方法时它是私有创建的。

在EigenObjectRecognizer.cs中找到此方法并更改

float eigenDistance;

eigenDistance = -1;

你可以删除float eigenDistance;但是我喜欢确保用一个我可以观察到的错误值来覆盖它,因为如果正确应用了识别,它应该总是正的。您会注意到以下代码部分包括:

FindMostSimilarObject(image, out index, out eigenDistance, out label);
  • 索引
  • eigenDistance
  • 标签

所有输出都可以使用一些额外的编码。

我们不需要将我们的Eigen识别器变量指向写入变量:

Emgu.Custom.EigenObjectRecognizer recognizer;

我们现在可以使用此函数调用获取EigenDistance:

float EigenDistance = recognizer.GetEignenDistance;

希望这可以解决问题,

干杯,

克里斯