我正在尝试使用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对于使用这种方法进行面部识别是否有用?或者有更好的方法吗?
答案 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);
通过简单地将其连接到标签并查看值的范围。