ViewFaceCore 是一个开源的、人脸识别 SDK,支持 .NET/.NET Core/.NET Framework 平台

安装 ViewFaceCore 包

首先,我们需要将 ViewFaceCore 导入到我们的项目中。可以使用 NuGet 包管理器来安装它。

在终端中运行以下命令:

dotnet add package 以下包

ViewFaceCore
ViewFaceCore.all_models
ViewFaceCore.Extension.SkiaSharp
ViewFaceCore.runtime.win.x64

或者在 Visual Studio 中,通过 NuGet 包管理器搜索 ViewFaceCore 并安装。

基本使用

在开始之前,我们需要引入相关的命名空间:

using SkiaSharp;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using ViewFaceCore;
using ViewFaceCore.Core;
using ViewFaceCore.Model;

人脸检测

载入图片

private void btnLoad_Click(object sender, EventArgs e)
{
    using (OpenFileDialog openFileDialog = new OpenFileDialog())
    {
        openFileDialog.Filter = "Image Files|*.jpg;*.jpeg;*.png;";
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            pic.Image = Image.FromFile(openFileDialog.FileName);
            pic.ImageLocation = openFileDialog.FileName;
        }
    }
}

首先,我们进行人脸检测,识别图像中的人脸。

private async void btnStatisticsFaces_Click(object sender, EventArgs e)
{
    // 使用 SKBitmap.Decode 方法从图片路径中加载图像
    // 这里使用的是 SkiaSharp 库来处理图片
    var bitmap = SKBitmap.Decode(pic.ImageLocation);

    // 从 PictureBox 控件中加载图像并转换为 Bitmap 对象
    Bitmap bitmap2 = new Bitmap(pic.Image);

    // 初始化一个 FaceDetector 对象
    FaceDetector faceDetector = new FaceDetector();

    // 将 SkiaSharp 的 Bitmap 对象转换为 FaceImage 对象
    FaceImage faceImage = bitmap.ToFaceImage();

    // 异步检测图像中的面部
    var faces = await faceDetector.DetectAsync(bitmap);

    // 在 bitmap2 图像上绘制矩形框以标记检测到的面部
    using (Graphics g = Graphics.FromImage(bitmap2))
    {
        foreach (var face in faces)
        {
            // 绘制红色矩形框标记面部区域
            g.DrawRectangle(Pens.Red, new Rectangle()
            {
                X = face.Location.X, 
                Y = face.Location.Y, 
                Height = face.Location.Height, 
                Width = face.Location.Height 
            });
        }
    }

    // 将处理后的图像重新赋值给 PictureBox 控件
    pic.Image = bitmap2;

    // 释放 bitmap 对象
    bitmap.Dispose();

    // 显示包含检测到的面部数量的消息框
    MessageBox.Show($"找到了 {faces.Length} 张人脸!");
}

提取特征值

一旦检测到人脸,我们需要提取人脸的特征值,以便后续的比对。

public float[] ExtractFeature(string imagePath)
{
    using var faceImage = SKBitmap.Decode(imagePath);

    //检测人脸信息
    FaceDetector faceDetector = new FaceDetector();
    FaceInfo[] fi = faceDetector.Detect(faceImage);

    //标记人脸位置
    FaceLandmarker faceMark = new FaceLandmarker();
    FaceMarkPoint[] points = faceMark.Mark(faceImage, fi[0]);

    FaceRecognizer faceRecognizer = new FaceRecognizer();
    float[] data0 = faceRecognizer.Extract(faceImage, points);
    return data0;
}

比对人脸

最后,我们可以通过比较两个人脸的特征值来确定两张图片是否是同一个人。

private void btnMatching_Click(object sender, EventArgs e)
{
    DrawFace(pic);
    DrawFace(pic1);
    float[] f1 = ExtractFeature(pic.ImageLocation);
    float[] f2 = ExtractFeature(pic1.ImageLocation);
    FaceRecognizer faceRecognizer = new FaceRecognizer();
    //对比特征值
    bool isSelf = faceRecognizer.IsSelf(f1, f2);
    //计算相似度
    float similarity = faceRecognizer.Compare(f1, f2);
    string msg = "识别到的人脸是否为同一人:" + isSelf + ",相似度:" + similarity;
    MessageBox.Show(msg);
}

年龄预测

private void btnAgePrediction_Click(object sender, EventArgs e)
{
    // 从 PictureBox 控件的图像路径加载图像,并将其转换为 FaceImage 对象
    FaceImage img = SKBitmap.Decode(pic.ImageLocation).ToFaceImage(); 
    // 初始化一个 FaceDetector 对象,用于检测人脸
    FaceDetector faceDetector = new FaceDetector();
    // 检测图像中的人脸,返回的结果取第一个人脸信息
    var info = faceDetector.Detect(img).First();
    // 初始化一个 AgePredictor 对象,用于预测年龄
    AgePredictor agePredictor = new AgePredictor();
    // 初始化一个 FaceLandmarker 对象,用于标记人脸的特征点
    FaceLandmarker faceMark = new FaceLandmarker();
    // 获取人脸的特征点
    var points = faceMark.Mark(img, info);
    // 使用 AgePredictor 对象预测年龄
    int age = agePredictor.PredictAge(img, points);
    // 显示预测的年龄
    MessageBox.Show(age.ToString());
}

性别预测

private void btnGenderPrediction_Click(object sender, EventArgs e)
{
    // 从 PictureBox 控件的图像路径加载图像,并将其转换为 FaceImage 对象
    FaceImage img = SKBitmap.Decode(pic.ImageLocation).ToFaceImage();
    // 初始化一个 FaceDetector 对象,用于检测人脸
    FaceDetector faceDetector = new FaceDetector();
    // 检测图像中的人脸,返回的结果取第一个人脸信息
    var info = faceDetector.Detect(img).First();
    // 初始化一个 genderPredictor 对象,用于预测性别
    GenderPredictor genderPredictor = new GenderPredictor();
    // 初始化一个 FaceLandmarker 对象,用于标记人脸的特征点
    FaceLandmarker faceMark = new FaceLandmarker();
    // 获取人脸的特征点
    var points = faceMark.Mark(img, info);
    // 使用 GenderPredictor 对象预测性别
    Gender gender = genderPredictor.PredictGender(img, points);
    // 显示预测的年龄
    MessageBox.Show(gender.ToString());
}

更多推荐