Sur*_*LSV 4 c# opencv emgucv opencvdotnet
我正在开发一个项目,我应该设计一个可以检测路过的人的所有面孔的应用程序......我有一个非常庞大的数据库,由几个已知的人组成......我使用了EigenObjectRecognizer来识别图像网络摄像头捕获的帧...但问题是有时它会错误地识别一些人....所以如果得到这个面部匹配的置信度...那么我可以写一个条件循环,这样如果它大于75 %,然后只检测他,否则不要.我也知道基于PCA的识别是基本的,我肯定会转向其他新算法.但由于项目的截止日期,我应该快速提交....所以请告诉我如何获得这个EigenObjectRecognizer面部识别的置信度....
没有确切的置信度值,但是可以使用可变比例并且粗略地解释为特征距离.
分类为良好匹配的值会根据您拥有的数据量和训练参数而变化,因此您必须使用不同的面测试值以计算出您的阈值.
您必须向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)
是否所有输出都可以使用一些额外的编码.
我们不需要将我们的Eigen识别器变量指向写入变量:
Emgu.Custom.EigenObjectRecognizer recognizer;
Run Code Online (Sandbox Code Playgroud)
我们现在可以使用此函数调用获取EigenDistance:
float EigenDistance = recognizer.GetEignenDistance;
Run Code Online (Sandbox Code Playgroud)
希望这可以解决问题,
干杯,
克里斯