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 ://本地摄像头
try
{
capture = new Emgu.CV.Capture();
capture.Start();//摄像头开始工作
return capture;
}
catch
{ } break;
case : //网络摄像头
try
{
capture = new Emgu.CV.Capture("rtsp://admin:tlJwpbo6@192.168.1.125:554");
}
catch (NullReferenceException excpt)
{
//MessageBox.Show("摄像头打开失败\n" + excpt.Message);
}
break;
case :
break;
}
return null;
}
private bool closeCapture(int i)
{
switch (i)
{
case ://本地摄像头
try
{
if(capture!=null)
capture.Stop();//摄像头开始工作
return true;
}
catch
{ } break;
case : //网络摄像头
break;
case :
break;
}
return false;
}
}
}
【实时获取图像】
CaptureManage cm = new CaptureManage();
//capture = new Emgu.CV.Capture();
//capture.Start();//摄像头开始工作
capture = (Emgu.CV.Capture)cm.returnCapture();
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(, double.PositiveInfinity);//PositiveInfinity double.NegativeInfinity break;
case FaceRecognizerType.FisherFaceRecognizer:
tfr.faceRecognizer = new Emgu.CV.Face.FisherFaceRecognizer(, );
break;
case FaceRecognizerType.LBPHFaceRecognizer:
tfr.faceRecognizer = new Emgu.CV.Face.LBPHFaceRecognizer(, , , , );
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, , new Size(, ));
//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, ), face,,);//画圆
Image<Gray, byte> GrayFace = tempImg.Copy(face).Resize(, , 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 > || pr.Label == -)
{
name = "不认识";
} //画出姓名
//camoareTwoImage(GrayFace.MIplImage<Bgr,byte>, fdo.originalImg.ToImage<Bgr, byte>);
else
{ Font font = new Font("楷体", , GraphicsUnit.Pixel);
SolidBrush fontLine = new SolidBrush(Color.Red);
float xPos = face.X + (face.Width / - (name.Length * ) / );
float yPos = face.Y - ;
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】。

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. LNMP编译安装(centos7+nginx1.9+mysql5.6+php5.5)

    LNMP编译安装 # 需先配置IP # 软件包的路径 /usr/local/src yum install -y libjpeg-devel libpng-devel freetype-devel c ...

  2. java泛型具体解释

    为什么引入泛型 bug是编程的一部分,我们仅仅能尽自己最大的能力降低出现bug的几率,可是谁也不能保证自己写出的程序不出现不论什么问题. 错误可分为两种:编译时错误与执行时错误.编译时错误在编译时能够 ...

  3. Eclipse开启代码自动提示功能

    Eclipse代码里面的代码提示功能默认是关闭的,只有输入“.”的时候才会提示功能,用vs的用户可能不太习惯 这种,vs是输入任何字母都会提示,下面说一下如何修改eclipse配置,开启代码自动提示功 ...

  4. VIM中括号的自动补全与删除

    先放来源 http://oldj.net/article/vim-parenthesis/ 很多现代 IDE 都有自动补全配对括号的功能,比如输入了左括号“(”,IDE 就自动在后面添加一个对应的右括 ...

  5. nyoj--170--网络的可靠性(水题)

    网络的可靠性 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 A公司是全球依靠的互联网解决方案提供商,也是2010年世博会的高级赞助商.它将提供先进的网络协作技术,展示其 ...

  6. Docker修改hosts方法

    方法一: 直接进入容器中修改/etc/hosts 缺点:重启容器后,增加的内容会丢失 方法二: 制作镜像的时候,直接修改. 限制: 需要是root用户,需要在容器中安装sudo 增大了镜像大小 方法三 ...

  7. LeetCode.888-公平的糖果交换(Fair Candy Swap)

    这是悦乐书的第339次更新,第363篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第208题(顺位题号是888).Alice和Bob有不同大小的糖果棒:A[i]是Alic ...

  8. 9.13[XJOI] NOIP训练32

    今日9.13 洛谷打卡:小吉(今天心情不错,决定取消密码) (日常记流水账) 上午 今天听说是鏼鏼的题目,题面非常的清真啊,也没有当初以为的爆零啊 T1 排排坐 非常非常清真的模拟或是结论题,再次将难 ...

  9. Hadoop MapReduce编程 API入门系列之二次排序(十六)

    不多说,直接上代码. -- ::, INFO [org.apache.hadoop.metrics.jvm.JvmMetrics] - Initializing JVM Metrics with pr ...

  10. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本2(十)

    下面,是版本1. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本1(一) 这篇博文,包括了,实际生产开发非常重要的,单元测试和调试代码.这里不多赘述,直接送上代码. MRUni ...