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

Sur*_*LSV 4 c# opencv emgucv opencvdotnet

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

Chr*_*ris 7

没有确切的置信度值,但是可以使用可变比例并且粗略地解释为特征距离.

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

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

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

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

为了开始,我们需要覆盖我称为我的Emgu.Custom的命名空间.

现在位于代码的顶部,在其他变量下面添加以下变量

private float eigenDistance;
Run Code Online (Sandbox Code Playgroud)

将以下方法添加到类中,

  /// <summary>
  /// Get the calculated Eignen Distance for the last proceessed frame
  /// </summary>
  public float GetEignenDistance
  {
      get { return eigenDistance; }
  }
Run Code Online (Sandbox Code Playgroud)

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

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

float eigenDistance;
Run Code Online (Sandbox Code Playgroud)

eigenDistance = -1;
Run Code Online (Sandbox Code Playgroud)

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

FindMostSimilarObject(image, out index, out eigenDistance, out label);
Run Code Online (Sandbox Code Playgroud)
  • 指数
  • eigenDistance
  • 标签

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

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

Emgu.Custom.EigenObjectRecognizer recognizer;
Run Code Online (Sandbox Code Playgroud)

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

float EigenDistance = recognizer.GetEignenDistance;
Run Code Online (Sandbox Code Playgroud)

希望这可以解决问题,

干杯,

克里斯