有没有办法在 C# 中使用 emguCV 比较两张脸?

Posted

技术标签:

【中文标题】有没有办法在 C# 中使用 emguCV 比较两张脸?【英文标题】:Is there any way to compare two faces using emguCV in C#? 【发布时间】:2021-01-19 21:17:13 【问题描述】:

如果是同一个人,我只需要比较两张脸... 我将这个项目 Face detection and recognition in runtime 转换为比较两张脸,但该方法总是返回 true 。

        int ImagesCount = 0;
        CascadeClassifier faceDetector = new CascadeClassifier("haarcascade_frontalface_alt.xml");
        List<Mat> TrainedFaces = new List<Mat>();
        List<int> PersonsLabes = new List<int>();
        Mat image1 = img1.ToImage<Gray, byte>().Mat;
        Mat image1Temp = img1.ToImage<Bgr, byte>().Mat;

        foreach (Rectangle face in faceDetector.DetectMultiScale(image1, 1.2, 10, new Size(50, 50), Size.Empty))
        
            Image<Gray, byte> trainedImage = ImageClass.CropImage(image1.ToBitmap(), face).ToImage<Gray, byte>().Resize(200, 200, Inter.Cubic);
            CvInvoke.EqualizeHist(trainedImage, trainedImage);
            TrainedFaces.Add(trainedImage.Mat);
            PersonsLabes.Add(ImagesCount);
            ImagesCount++;
        

        EigenFaceRecognizer recognizer = new EigenFaceRecognizer(ImagesCount, 2000);
        recognizer.Train(TrainedFaces.ToArray(), PersonsLabes.ToArray());

        Mat image2 = img2.ToImage<Gray, byte>().Mat;
        Rectangle[] rect = faceDetector.DetectMultiScale(image2, 1.2, 10, new Size(50, 50), Size.Empty);
        if (rect.Length == 1)
        
            Image<Gray, Byte> grayFaceResult = ImageClass.CropImage(image2.ToBitmap(), rect[0]).ToImage<Gray, byte>().Resize(200, 200, Inter.Cubic);
            CvInvoke.EqualizeHist(grayFaceResult, grayFaceResult);
            var result = recognizer.Predict(grayFaceResult);
            if (result.Label != -1 && result.Distance < 2000)
            
                return true;
            
        
        return false;

注意:第一张图片可能包含不止一张同一个人的图片,第二张图片应始终包含另一张或同一个人的图片,但始终给我 0(始终返回 true 虽然我尝试了两张不同的图片人),我使用了 emguCv 4.3 我搜索了很多,但我没有发现任何东西可以解决我的问题 有没有人可以知道我在这段代码中的错误,或者可以给我一个链接以获取另一个比较两张面孔的解决方案? (注意:我是这个领域的新手)

【问题讨论】:

【参考方案1】:

如果您可以在服务器上部署 python 应用程序,您可能会采用deepface。它有一个验证功能,您应该将 base64 编码的图像作为输入发送到这些功能。

端点:http://127.0.0.1:5000/verify

正文:

  
    "model_name": "VGG-Face",
    "img": [
        
                "img1": "data:image/jpeg;base64,..."
                , "img2": "data:image/jpeg;base64,..."  
        
    ]
  

【讨论】:

以上是关于有没有办法在 C# 中使用 emguCV 比较两张脸?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 EmguCV 和 C# 绘制直方图

使用 emgucv (c#) 查找人脸的位置

VS2010+C#+EmguCV 配置详解

[C#]emgucv教程1:摄像头读取

c#使用emguCV 中new Gray(10)是啥意思

EmguCV:使用光流在运动物体上绘制轮廓?