Emgu cv人脸检测识别

1、开发平台:WIN10 X64    VS2012    Emgucv版本:3.1

2、先给大家分享一个官网给的示例源代码:

https://ncu.dl.sourceforge.net/project/emgufacerecog/Face%20Recognition%202.4.9.zip

3、部分代码展示:

  1. 【打开摄像头:】
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace 基于人脸识别的智能监控
  9. {
  10. class CaptureManage
  11. {
  12. private Emgu.CV.Capture capture;//摄像头对象
  13.  
  14. //检测是否有可用摄像头
  15. void showCapture()
  16. {
  17.  
  18. }
  19.  
  20. public Object returnCapture(int a)
  21. {
  22. switch(a)
  23. {
  24. case ://本地摄像头
  25. try
  26. {
  27. capture = new Emgu.CV.Capture();
  28. capture.Start();//摄像头开始工作
  29. return capture;
  30. }
  31. catch
  32. {
  33.  
  34. }
  35.  
  36. break;
  37. case : //网络摄像头
  38. try
  39. {
  40. capture = new Emgu.CV.Capture("rtsp://admin:tlJwpbo6@192.168.1.125:554");
  41. }
  42. catch (NullReferenceException excpt)
  43. {
  44. //MessageBox.Show("摄像头打开失败\n" + excpt.Message);
  45. }
  46. break;
  47. case :
  48. break;
  49. }
  50. return null;
  51. }
  52. private bool closeCapture(int i)
  53. {
  54. switch (i)
  55. {
  56. case ://本地摄像头
  57. try
  58. {
  59. if(capture!=null)
  60. capture.Stop();//摄像头开始工作
  61. return true;
  62. }
  63. catch
  64. {
  65.  
  66. }
  67.  
  68. break;
  69. case : //网络摄像头
  70. break;
  71. case :
  72. break;
  73. }
  74. return false;
  75. }
  76. }
  77. }
  1. 【实时获取图像】
  2. CaptureManage cm = new CaptureManage();
  3. //capture = new Emgu.CV.Capture();
  4. //capture.Start();//摄像头开始工作
  5. capture = (Emgu.CV.Capture)cm.returnCapture();
  6. capture.ImageGrabbed += frameProcess;//实时获取图像
  1. 【加载和人脸识别有关的XML
  2.  
  3. //faceClassifier = new CascadeClassifier("haarcascade_frontalface_default.xml");
  4. faceClassifier = new CascadeClassifier("haarcascade_frontalface_default.xml");
  5. SetTrainedFaceRecognizer(FaceRecognizerType.EigenFaceRecognizer);//设置识别器
  1. 【训练人脸识别器】
    public TrainedFaceRecognizer SetTrainedFaceRecognizer(FaceRecognizerType type)
  2. {
  3. tfr = new TrainedFaceRecognizer();
  4. tfr.trainedFileList = SetSampleFacesList();
  5.  
  6. switch (type)
  7. {
  8. case FaceRecognizerType.EigenFaceRecognizer:
  9. tfr.faceRecognizer = new Emgu.CV.Face.EigenFaceRecognizer(, double.PositiveInfinity);//PositiveInfinity double.NegativeInfinity
  10.  
  11. break;
  12. case FaceRecognizerType.FisherFaceRecognizer:
  13. tfr.faceRecognizer = new Emgu.CV.Face.FisherFaceRecognizer(, );
  14. break;
  15. case FaceRecognizerType.LBPHFaceRecognizer:
  16. tfr.faceRecognizer = new Emgu.CV.Face.LBPHFaceRecognizer(, , , , );
  17. break;
  18. }
  19. tfr.faceRecognizer.Train(tfr.trainedFileList.trainedImages.ToArray(), tfr.trainedFileList.trainedLabelOrder.ToArray());
  20. return tfr;
  21. }
  1. 【识别出人脸矩形框】
  2. public faceDetectedObj GetFaceRectangle(Mat emguImage)
  3. {
  4. faceDetectedObj fdo = new faceDetectedObj();
  5. fdo.originalImg = emguImage;
  6. List<Rectangle> faces = new List<Rectangle>();
  7. //List<Rectangle> eyes = new List<Rectangle>();
  8. try
  9. {
  10. using (UMat ugray = new UMat())
  11. {
  12. CvInvoke.CvtColor(emguImage, ugray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);//灰度化图片
  13. CvInvoke.EqualizeHist(ugray, ugray);//均衡化灰度图片
  14.  
  15. Rectangle[] facesDetected = faceClassifier.DetectMultiScale(ugray, 1.1, , new Size(, ));
  16. //Rectangle[] eyesDetected = eyesClassifier.DetectMultiScale(ugray, 1.1, 3, new Size(100, 100));
  17. faces.AddRange(facesDetected); //向list集合的末尾添加
  18. //eyes.AddRange(eyesDetected);
  19. }
  20. }
  21. catch (Exception ex)
  22. {
  23. ex.ToString();
  24. }
  25. fdo.facesRectangle = faces;
  26.  
  27. return fdo;
  28. }
  1. 【给识别出的所有人脸画圈】
  2. public faceDetectedObj faceRecognize(Mat emguImage)
  3. {
  4. faceDetectedObj fdo;
  5. try
  6. {
  7.  
  8. fdo = GetFaceRectangle(emguImage);
  9. Image<Gray, byte> tempImg = fdo.originalImg.ToImage<Gray, byte>();
  10.  
  11. using (Graphics g = Graphics.FromImage(fdo.originalImg.Bitmap))
  12. {
  13. // camoareTwoImage(Emgu.CV.Image<Bgr,byte>[] img1,Emgu.CV.Image<Bgr,byte> img2);
  14. // camoareTwoImage(fdo.facesRectangle,emguImage.ToImage<Bgr,byte>);
  15. foreach (Rectangle face in fdo.facesRectangle)
  16. {
  17. g.DrawArc(new Pen(Color.Blue, ), face,,);//画圆
  18. Image<Gray, byte> GrayFace = tempImg.Copy(face).Resize(, , Emgu.CV.CvEnum.Inter.Cubic);
  19. GrayFace._EqualizeHist();//得到均衡化人脸的灰度图像
  20.  
  21. Emgu.CV.Face.FaceRecognizer.PredictionResult pr = tfr.faceRecognizer.Predict(GrayFace);//返回预测图像的标签
  22.  
  23. double db = pr.Distance;//.CompareTo(pr.Distance);//返回相似度
  24.  
  25. string recogniseName = tfr.trainedFileList.trainedFileName[pr.Label].ToString();
  26. //FaceRecognizer
  27. string name = tfr.trainedFileList.trainedFileName[pr.Label].ToString();
  28. //pr.GetType();
  29. if (db > || pr.Label == -)
  30. {
  31. name = "不认识";
  32. } //画出姓名
  33. //camoareTwoImage(GrayFace.MIplImage<Bgr,byte>, fdo.originalImg.ToImage<Bgr, byte>);
  34. else
  35. {
  36.  
  37. Font font = new Font("楷体", , GraphicsUnit.Pixel);
  38. SolidBrush fontLine = new SolidBrush(Color.Red);
  39. float xPos = face.X + (face.Width / - (name.Length * ) / );
  40. float yPos = face.Y - ;
  41. g.DrawString(name + "_" + pr.Label + "[" + db + "]", font, fontLine, xPos, yPos);
  42. //MessageBox.Show("返回的Pr为:"+db);
  43. //Console.WriteLine("db的值为==》》》》"+db);
  44.  
  45. }
  46. fdo.names.Add(name);
  47. }
  48. }
  49. }
  50. finally
  51. {
  52. //emguImage.Dispose();
  53. }
  54.  
  55. return fdo;
  56. }

4、识别效果见下图:

5、以上代码并非全部是我敲的,参照【http://blog.csdn.net/u011616825/article/details/51620061】。

Emgu cv人脸检测识别的更多相关文章

  1. [Winform]基于Emgu.CV人脸识别

    摘要 “OpenCV是一个开源的计算机视觉库.OpenCV采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上.OpenCV还提供了Python.Ruby.MATLAB以及 ...

  2. Python学习案例之视频人脸检测识别

    前言 上一篇博文与大家分享了简单的图片人脸识别技术,其实在实际应用中,很多是通过视频流的方式进行识别,比如人脸识别通道门禁考勤系统.人脸动态跟踪识别系统等等. 案例 这里我们还是使用 opencv 中 ...

  3. Python学习案例之人脸检测识别

    前言 随着科技的发展,人脸识别技术在许多领域得到的非常广泛的应用,手机支付.银行身份验证.手机人脸解锁等等. 识别 废话少说,这里我们使用 opencv 中自带了 haar人脸特征分类器,利用训练好的 ...

  4. 基于AdaBoost算法——世纪晟结合Haar-like特征训练人脸检测识别

      AdaBoost 算法是一种快速人脸检测算法,它将根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高.   系统在技术上的三个贡献: 1.用简单的Haa ...

  5. MTCNN人脸检测识别笔记

    论文:Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks 论文链接:https:// ...

  6. Python视频人脸检测识别

    案例 这里我们还是使用 opencv 中自带了 haar人脸特征分类器,通过读取一段视频来识别其中的人脸. 代码实现:   动图有点花,讲究着看吧:   如果是捕捉摄像头,只需要改变以下代码即可: c ...

  7. 人脸检测识别,人脸检测,人脸识别,离线检测,C#源码

    百度网盘地址 微云地址 使用虹软人工智能开放平台技术开发完成

  8. 【转载】opencv实现人脸检测

    全文转载自CSDN的博客(不知道怎么将CSDN的博客转到博客园,应该没这功能吧,所以直接复制全文了),转载地址如下 http://blog.csdn.net/lsq2902101015/article ...

  9. MTCNN人脸检测 附完整C++代码

    人脸检测 识别一直是图像算法领域一个主流话题. 前年 SeetaFace 开源了人脸识别引擎,一度成为热门话题. 虽然后来SeetaFace 又放出来 2.0版本,但是,我说但是... 没有训练代码, ...

随机推荐

  1. UVA 11383 - Golden Tiger Claw(二分图完美匹配扩展)

    UVA 11383 - Golden Tiger Claw 题目链接 题意:给定每列和每行的和,给定一个矩阵,要求每一个格子(x, y)的值小于row(i) + col(j),求一种方案,而且全部行列 ...

  2. 一、Redis 基础命令---总括

    1.redis命令不区分大写和小写.可是KEY区分大写和小写. 2.redis-cli -h 127.0.0.1 -p 6379 依据IP/PORT链接服务端 3.redis-server --por ...

  3. LeetCode(1) Symmetric Tree

    从简单的道题目開始刷题目: Symmetric Tree 题目:Given a binary tree, check whether it is a mirror of itself (ie, sym ...

  4. zoj3886--Nico Number(素数筛+线段树)

    Nico Number Time Limit: 2 Seconds      Memory Limit: 262144 KB Kousaka Honoka and Minami Kotori are ...

  5. ubuntu下安装AndroidStudio

    近期将电脑的操作系统换成了ubuntu,对于不习惯win8/win10的人来说ubuntu确实是一个不错的选择,主要的软件都ok了,至于QQ什么的,大家能够去找wine版的,或者直接下载一个叫Cros ...

  6. linux sysbench (一): CPU性能测试详解

    网上sysbench教材众多,但没有一篇中文教材对cpu测试参数和结果进行详解. 本文旨在能够让读者对sysbench的cpu有一定了解. 小慢哥的原创文章,欢迎转载 1.sysbench基础知识 s ...

  7. springmvc-servlet.xml 第二种选择

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  8. ADO.NET增删改

    static void Main1(string[] args) {添加造连接字符串string connstring = "server=.;database=mydb;user=sa;p ...

  9. CI中的分页

    根据MVC的思想,分页是需要传数据到模型中,把页码传过去,在模型中根据页码分配: 更多分页类函数可以通过CI手册的分页类查看: $this -> load ->library('pagin ...

  10. CI中的url相关函数以及路由设置和伪静态技术

    当使用CI框架进行开发时,我们的一些数据传递的URL不应该写死,可以使用如下方法:比如说我们需要表单提交一个数据: 1.在controller控制器中我们需要先创建一个加载helper和视图的方法: ...