Emgu cv人脸检测识别
Emgu cv人脸检测识别
1、开发平台:WIN10 X64 VS2012 Emgucv版本:3.1
2、先给大家分享一个官网给的示例源代码:
https://ncu.dl.sourceforge.net/project/emgufacerecog/Face%20Recognition%202.4.9.zip
3、部分代码展示:
【打开摄像头:】 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 基于人脸识别的智能监控 { class CaptureManage { private Emgu.CV.Capture capture;//摄像头对象 //检测是否有可用摄像头 void showCapture() { } public Object returnCapture(int a) { switch(a) { case 1://本地摄像头 try { capture = new Emgu.CV.Capture(); capture.Start();//摄像头开始工作 return capture; } catch { } break; case 2: //网络摄像头 try { capture = new Emgu.CV.Capture("rtsp://admin:tlJwpbo6@192.168.1.125:554"); } catch (NullReferenceException excpt) { //MessageBox.Show("摄像头打开失败\n" + excpt.Message); } break; case 3: break; } return null; } private bool closeCapture(int i) { switch (i) { case 1://本地摄像头 try { if(capture!=null) capture.Stop();//摄像头开始工作 return true; } catch { } break; case 2: //网络摄像头 break; case 3: break; } return false; } } }
【实时获取图像】 CaptureManage cm = new CaptureManage(); //capture = new Emgu.CV.Capture(); //capture.Start();//摄像头开始工作 capture = (Emgu.CV.Capture)cm.returnCapture(1); capture.ImageGrabbed += frameProcess;//实时获取图像
【加载和人脸识别有关的XML】 //faceClassifier = new CascadeClassifier("haarcascade_frontalface_default.xml"); faceClassifier = new CascadeClassifier("haarcascade_frontalface_default.xml"); SetTrainedFaceRecognizer(FaceRecognizerType.EigenFaceRecognizer);//设置识别器
【训练人脸识别器】
public TrainedFaceRecognizer SetTrainedFaceRecognizer(FaceRecognizerType type) { tfr = new TrainedFaceRecognizer(); tfr.trainedFileList = SetSampleFacesList(); switch (type) { case FaceRecognizerType.EigenFaceRecognizer: tfr.faceRecognizer = new Emgu.CV.Face.EigenFaceRecognizer(80, double.PositiveInfinity);//PositiveInfinity double.NegativeInfinity break; case FaceRecognizerType.FisherFaceRecognizer: tfr.faceRecognizer = new Emgu.CV.Face.FisherFaceRecognizer(0, 3500); break; case FaceRecognizerType.LBPHFaceRecognizer: tfr.faceRecognizer = new Emgu.CV.Face.LBPHFaceRecognizer(1, 8, 8, 8, 100); break; } tfr.faceRecognizer.Train(tfr.trainedFileList.trainedImages.ToArray(), tfr.trainedFileList.trainedLabelOrder.ToArray()); return tfr; }
【识别出人脸矩形框】 public faceDetectedObj GetFaceRectangle(Mat emguImage) { faceDetectedObj fdo = new faceDetectedObj(); fdo.originalImg = emguImage; List<Rectangle> faces = new List<Rectangle>(); //List<Rectangle> eyes = new List<Rectangle>(); try { using (UMat ugray = new UMat()) { CvInvoke.CvtColor(emguImage, ugray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);//灰度化图片 CvInvoke.EqualizeHist(ugray, ugray);//均衡化灰度图片 Rectangle[] facesDetected = faceClassifier.DetectMultiScale(ugray, 1.1, 10, new Size(20, 20)); //Rectangle[] eyesDetected = eyesClassifier.DetectMultiScale(ugray, 1.1, 3, new Size(100, 100)); faces.AddRange(facesDetected); //向list集合的末尾添加 //eyes.AddRange(eyesDetected); } } catch (Exception ex) { ex.ToString(); } fdo.facesRectangle = faces; return fdo; }
【给识别出的所有人脸画圈】 public faceDetectedObj faceRecognize(Mat emguImage) { faceDetectedObj fdo; try { fdo = GetFaceRectangle(emguImage); Image<Gray, byte> tempImg = fdo.originalImg.ToImage<Gray, byte>(); using (Graphics g = Graphics.FromImage(fdo.originalImg.Bitmap)) { // camoareTwoImage(Emgu.CV.Image<Bgr,byte>[] img1,Emgu.CV.Image<Bgr,byte> img2); // camoareTwoImage(fdo.facesRectangle,emguImage.ToImage<Bgr,byte>); foreach (Rectangle face in fdo.facesRectangle) { g.DrawArc(new Pen(Color.Blue, 2), face,0,360);//画圆 Image<Gray, byte> GrayFace = tempImg.Copy(face).Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic); GrayFace._EqualizeHist();//得到均衡化人脸的灰度图像 Emgu.CV.Face.FaceRecognizer.PredictionResult pr = tfr.faceRecognizer.Predict(GrayFace);//返回预测图像的标签 double db = pr.Distance;//.CompareTo(pr.Distance);//返回相似度 string recogniseName = tfr.trainedFileList.trainedFileName[pr.Label].ToString(); //FaceRecognizer string name = tfr.trainedFileList.trainedFileName[pr.Label].ToString(); //pr.GetType(); if (db >5690 || pr.Label == -1) { name = "不认识"; } //画出姓名 //camoareTwoImage(GrayFace.MIplImage<Bgr,byte>, fdo.originalImg.ToImage<Bgr, byte>); else { Font font = new Font("楷体", 16, GraphicsUnit.Pixel); SolidBrush fontLine = new SolidBrush(Color.Red); float xPos = face.X + (face.Width / 2 - (name.Length * 14) / 2); float yPos = face.Y - 21; g.DrawString(name + "_" + pr.Label + "[" + db + "]", font, fontLine, xPos, yPos); //MessageBox.Show("返回的Pr为:"+db); //Console.WriteLine("db的值为==》》》》"+db); } fdo.names.Add(name); } } } finally { //emguImage.Dispose(); } return fdo; }
4、识别效果见下图:
5、以上代码并非全部是我敲的,参照【http://blog.csdn.net/u011616825/article/details/51620061】。
用自己所知道的去帮助他人,就像别人当初帮助自己一样!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!