.NET C# 使用OpenCV实现人脸识别

.NET C# 使用OpenCV实现模型训练、人脸识别

码图~~~
微信图片_20240626175714

微信图片_20240626175734

1 引入依赖

image-20240626174305168

OpenCvSHarp4 - 4.10.0.20240616

OpenCvSHarp4.runtime.win - 4.10.0.20240616

2 人脸数据存储结构

image-20240626174620053

image-20240626174646845

runtime directory | face | {id}_{name} | *.jpg
id - 不可重复
name - 人名
*.jpg - 人脸照片

3 Demo

3.1 人脸识别训练

//人脸识别器
FaceRecognizer _faceRecongnizer = FisherFaceRecognizer.Create();
//人脸id,name字典
Dictionary<int, string> _faceNameDic = new Dictionary<int, string>();
//人脸数据统一大小
OpenCvSharp.Size _imgSize = new OpenCvSharp.Size(1000, 1000);

private void InitializeTrain()
{
    string baseDir = AppDomain.CurrentDomain.BaseDirectory;
    string faceDir = baseDir + "face\\";
    string[] faceImageDirs = Directory.GetDirectories(faceDir, "*_*");
    //读取人脸数据
    List<Mat> faceMats = new List<Mat>();
    List<int> faceIds = new List<int>();
    foreach (var faceImageDir in faceImageDirs)
    {
        string[] faceImages = Directory.GetFiles(faceImageDir, "*.jpg");
        if (faceImages.Length < 1)
        {
            continue;
        }
        DirectoryInfo faceImageDirInfo = new DirectoryInfo(faceImageDir);
        string[] faceNameArr = faceImageDirInfo.Name.Split('_');
        int id = int.Parse(faceNameArr[0]);
        string name = faceNameArr[1];
        _faceNameDic.Add(id, name);
        IEnumerable<Mat> mats = faceImages.Select(face =>
        {
            Mat mat = new Mat(face, ImreadModes.Grayscale);
            Cv2.Resize(mat, mat, _imgSize);
            return mat;
        });
        IEnumerable<int> ids = mats.Select(e => id);
        faceMats.AddRange(mats);
        faceIds.AddRange(ids);
    }
    //训练
    _faceRecongnizer.Train(faceMats, faceIds);
    //保存训练数据
	//_faceRecongnizer.Save("train.xml");
}

3.2 开启摄像头进行人脸识别

//加载人眼、人脸识别训练模型
//这两个是OpenCV官方给出的,在官方库就可以找到
//https://github.com/opencv/opencv/tree/master/data/haarcascades
CascadeClassifier faceFinder = new CascadeClassifier(@"haarcascade_frontalface_default.xml");
CascadeClassifier eyeFinder = new CascadeClassifier(@"haarcascade_eye_tree_eyeglasses.xml");
using (OpenCvSharp.Window window = new OpenCvSharp.Window("video - 按ESC退出"))
//获取camera
using (FrameSource video = Cv2.CreateFrameSource_Camera(0))
using (Mat frame = new Mat())
{
    while (true)
    {
        //获取帧
        video.NextFrame(frame);
        //进行检测识别
        OpenCvSharp.Rect[] faceRects = faceFinder.DetectMultiScale(frame);
        OpenCvSharp.Rect[] eyeRects = eyeFinder.DetectMultiScale(frame);
        //如果没有检测到人脸,就跳过
        if (faceRects.Length < 1)
        {
            continue;
        }
        for (int i = 0; i < faceRects.Length; i++)
        {
            //人脸区域
            OpenCvSharp.Rect rect = faceRects[i];
            using (Mat nFrame = frame.Clone())
            {
                Mat m1 = new Mat(frame, rect);
                Cv2.CvtColor(m1, m1, ColorConversionCodes.BGR2GRAY);
                //设置大小
                Cv2.Resize(m1, nFrame, _imgSize);
                //人脸识别
                _faceRecongnizer.Predict(nFrame, out int id, out double confidence);
                //置信度
                confidence = Math.Round(confidence, 2);
                _faceNameDic.TryGetValue(id, out var name);
                string label = name == null ? "unknow" : $"{name}  {confidence}";
                // 在图像上绘制文字
                Cv2.PutText(frame, label, new OpenCvSharp.Point(rect.Left, rect.Top - 10), HersheyFonts.HersheySimplex, 1.0, new Scalar(0, 0, 255), 2, LineTypes.Link8);
            }
            //绘制人脸框
            Cv2.Rectangle(frame, faceRects[i], new Scalar(0, 0, 255), 1);
        }
        //眼部区域
        if (eyeRects.Length > 1)
        {
            for (int i = 0; i < eyeRects.Length; i++)
            {
                //绘制眼部框
                Cv2.Rectangle(frame, eyeRects[i], new Scalar(255, 0, 0), 1);
            }
        }
        //显示结果
        window.ShowImage(frame);
        int v = Cv2.WaitKey(1);
        //ESC - 27
        if (v == 27)
        {
            break;
        }
    }
}
  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCvSharp是一个开源的计算机视觉库,用于处理图像和视频。它提供了对OpenCV库的C#绑定,使得在C#环境下进行图像处理和计算机视觉任务更加方便。 对于人脸识别OpenCvSharp提供了丰富的功能和方法来实现。根据引用,人脸识别的主要步骤包括: 1. 准备人脸图像和对应的ID:将经过灰度化和直方图均衡化处理的人脸图像和它们对应的ID组织到文件夹中,每个人对应一个文件夹,每个文件夹中存储多张该人脸的图像。 2. 创建人脸识别器:OpenCvSharp提供了三种人脸识别器,包括FisherFaceRecognizer、LBPHFaceRecognizer和EigenFaceRecognizer,你可以根据需要选择一种识别器进行创建。 3. 导入人脸数据和ID进行训练:将准备好的人脸数据和对应的ID导入人脸识别器进行训练,使得识别器具备预测功能。 根据引用,OpenCvSharp还提供了启用摄像头、识别人脸并以视频形式显示的功能。这使得你可以实时地识别人脸,并将结果以视频的形式展示在界面上。 总结起来,使用OpenCvSharp进行人脸识别的一般步骤包括:准备人脸图像和ID,创建人脸识别器,导入人脸数据和ID进行训练,然后可以通过启用摄像头来实时识别人脸并显示结果。希望这些信息对你有帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [基于OpenCVSharp的人脸识别系统](https://blog.csdn.net/IT_BOY__/article/details/91865726)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [OpenCvSharp人脸识别系统(视频中的人脸)](https://blog.csdn.net/auogsy/article/details/100077255)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值