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

devtools/2024/10/18 2:36:46/

.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 - 27if (v == 27){break;}}
}

http://www.ppmy.cn/devtools/56467.html

相关文章

基于springboot、logback的日志脱敏组件

Logback⽇志数据脱敏⼯具&#xff1a;隐私和安全的守护者 概述 在涉及敏感数据的⽇志记录环境中&#xff0c;数据保护和个⼈隐私⽆疑是⾄关重要的领域。确保敏感数据不被泄露&#xff0c;脱敏处理成为必不可少的⼀步。数据脱敏是⼀种技术⼿段&#xff0c;其将敏感信息转换为不…

ARM 240625

练习&#xff1a; 汇编实现1-100累加&#xff0c;结果保存在r0 .text 声明下面内容都属于文本段内容 .globl _start 声明 _start 是一个全局启用的标签_start: 封装 _start 标签&#xff0c;汇编的标签和C中函数类似mov r0,#0 mov 把0 搬运到 r0 寄存器mov r1,#1 mov 把1 …

【使用webrtc-streamer解析rtsp视频流】

webrtc-streamer WebRTC (Web Real-Time Communications) 是一项实时通讯技术&#xff0c;它允许网络应用或者站点&#xff0c;在不借助中间媒介的情况下&#xff0c;建立浏览器之间点对点&#xff08;Peer-to-Peer&#xff09;的连接&#xff0c;实现视频流和&#xff08;或&a…

Android中ViewModel+LiveData+DataBinding的配合使用(kotlin)

Android 中 ViewModel、LiveData 和 Data Binding 的配合使用&#xff08;Kotlin&#xff09; 摘要 本文将介绍如何在 Android 开发中结合使用 ViewModel、LiveData 和 Data Binding 进行数据绑定和状态更新。我们将详细探讨这三者之间的关系&#xff0c;并展示如何在 Kotlin…

uni-app的showModal提示框,进行删除的二次确认,可自定义确定或取消操作

实现效果&#xff1a; 此处为删除的二次确认示例&#xff0c;点击删除按钮时出现该提示&#xff0c;该提示写在js script中。 实现方式&#xff1a; 通过uni.showModal进行提示&#xff0c;success为确认状态下的操作自定义&#xff0c;此处调用后端接口进行了删除操作&#…

计算机网络知识整理笔记

目录 1.对网络协议的分层&#xff1f; 2.TCP/IP和UDP之间的区别&#xff1f; 3.建立TCP连接的三次握手&#xff1f; 4.断开TCP连接的四次挥手&#xff1f; 5.TCP协议如何保证可靠性传输&#xff1f; 6.什么是TCP的拥塞控制&#xff1f; 7.什么是HTTP协议&#xff1f; 8…

昇思25天学习打卡营第4天|linchenfengxue

需求&#xff1a;建立一个图像分类模型&#xff0c;提供自动识别有(猫、狗、飞机、汽车等等) 图片的功能 ResNet50图像分类 图像分类是最基础的计算机视觉应用&#xff0c;属于有监督学习类别&#xff0c;如给定一张图像(猫、狗、飞机、汽车等等)&#xff0c;判断图像所属的类…

Windows系统下文件夹权限详解

文章目录 问题描述文件夹属性 问题描述 今天在Win10系统下&#xff0c;实现文件夹设置权限&#xff0c;具体的方案的涉及到我们公司内部的一款加密软件&#xff0c;不太方便透漏&#xff0c;借此机会&#xff0c;我也重新的回顾下windows系统下的文件夹权限 文件夹属性 打开…