ViewFaceCore 是一个开源的、人脸识别 SDK,支持 .NET/.NET Core/.NET Framework 平台。它提供了高效且准确的人脸检测和特征提取功能,可以用于各种与人脸识别相关的应用场景中。本文将探讨如何在 C# 应用程序中使用 ViewFaceCore 实现基本的人脸识别功能,并通过一些实际例子来展示其使用方法。
首先,我们需要将 ViewFaceCore 导入到我们的项目中。可以使用 NuGet 包管理器来安装它。
在终端中运行以下命令:
dotnet add package 以下包
BashViewFaceCore ViewFaceCore.all_models ViewFaceCore.Extension.SkiaSharp ViewFaceCore.runtime.win.x64
或者在 Visual Studio 中,通过 NuGet 包管理器搜索 ViewFaceCore
并安装。
在开始之前,我们需要引入相关的命名空间:
C#using SkiaSharp;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using ViewFaceCore;
using ViewFaceCore.Core;
using ViewFaceCore.Model;
载入图片
C#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;
}
}
}
首先,我们进行人脸检测,识别图像中的人脸。
C#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} 张人脸!");
}
一旦检测到人脸,我们需要提取人脸的特征值,以便后续的比对。
C#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;
}
最后,我们可以通过比较两个人脸的特征值来确定两张图片是否是同一个人。
C#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);
}
C#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());
}
C#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());
}
通过本文,我们学习了如何使用 ViewFaceCore 在 C# 中进行人脸识别。我们探讨了初始化、检测人脸、提取特征值和比较人脸特征的基本流程,并提供了完整的示例代码来演示这些方法的使用。希望这篇文章能帮助你在实际项目中应用 ViewFaceCore 实现人脸识别功能。
本文作者:rick
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!