我已经按照代码项目中的示例代码使用 EMGUCV 创建了人脸识别系统。我用 2 个人训练了数据库,每个人有 10 张图像。当网络摄像头检测到这些人并能够正确显示姓名但问题是网络摄像头检测到训练有素的数据库中不存在的第三个人时,它将拍摄最近的人脸并在其上显示姓名而不是显示“未知”。我怎样才能提高准确性?我试图更改阈值但没有帮助。出了什么问题?
currentFrame = grabber.QueryFrame().Resize(320, 240,
Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
currentFrame.SmoothBlur(320, 240);
gray = currentFrame.Convert<Gray, Byte>();
Rectangle[] facesDetected = face.DetectMultiScale(gray, 1.2, 10, new
Size(50, 50), Size.Empty);
for (int j = 0; j < facesDetected.Length; j++)
{
facesDetected[j].X += (int)(facesDetected[j].Height * 0.15);
facesDetected[j].Y += (int)(facesDetected[j].Width * 0.22);
facesDetected[j].Height -= (int)(facesDetected[j].Height * 0.3);
facesDetected[j].Width -= (int)(facesDetected[j].Width * 0.35);
result = currentFrame.Copy(facesDetected[j]).Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
result._EqualizeHist();
currentFrame.Draw(facesDetected[j], new Bgr(Color.Red), 2);
if (trainingImages.ToArray().Length != 0)
{
recog = new LBPHFaceRecognizer(1, 10, 8, 8, 10000);
//recog = new EigenFaceRecognizer(0, 3500);
//recog = new FisherFaceRecognizer(0, 3500);
recog.Train(trainingImages.ToArray(), Names_List_ID.ToArray());
FaceRecognizer.PredictionResult ER = recog.Predict(result);
if (ER.Label == -1)
{
name = "Unknown";
}
else
{
name = taglabels[ER.Label];
}
currentFrame.Draw(name, ref font, new Point(facesDetected[j].X - 2, facesDetected[j].Y - 2), new Bgr(Color.Green));
}
}
最佳答案
您可以阈值 returned distance/confidence .你需要一组图像的验证集,训练好的人脸的新图像和一些随机的人脸,得到距离并设置阈值。
关于c# - EMGU CV 2.4.9 人脸识别精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45615346/