使用EigenObjectRecognizer
我正在尝试使用EmguCV进行一些面部识别。 我想知道我是否可以使用EigenObjectRecognizer进行此任务? 有人可以解释我如何使用它吗? 因为如果没有不匹配的照片,它也会返回一个值。 这是一个例子:
Image[] trainingImages = new Image[5]; trainingImages[0] = new Image("brad.jpg"); trainingImages[1] = new Image("david.jpg"); trainingImages[2] = new Image("foof.jpg"); trainingImages[3] = new Image("irfan.jpg"); trainingImages[4] = new Image("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 testImage = new Image("brad_test.jpg"); String label = recognizer.Recognize(testImage); Console.Write(label);
它返回“brad”。但是如果我在testimage中更改照片它也会返回一些名字甚至是Brad.Is对于使用这种方法进行面部识别是否有用? 或者有更好的方法吗?
我做了一些练习,发现当它没有找到它时会返回空字符串。 将值5000更改为1000可以提供更接近的值,但是如果您使用的是网络摄像头,则您的照片在测试和数据库中必须几乎相同。
好吧,我不知道Emgu Cv,但我认为Robert Harvey所说的是对的。 你必须训练你的神经网络。 此外,无论如何,神经网络总会返回结果。 如果结果错误,则表示您未对网络进行足够的培训。
recognizer.Recognize(testImage) RETURN EigenObjectRecognizer.RecognitionResult
所以你可以尝试:
EigenObjectRecognizer.RecognitionResult helo = recognizer.Recognize(result); Console.Write(helo.lable);
您可以重载Emgu.CV.EigenObjectRecognizer的Recognize函数,如:
public String Recognize(Image 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(), <>, ref termCrit);
通过简单地将其连接到标签并查看值的范围。