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 ://本地摄像头
- 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人脸检测识别的更多相关文章
- [Winform]基于Emgu.CV人脸识别
摘要 “OpenCV是一个开源的计算机视觉库.OpenCV采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上.OpenCV还提供了Python.Ruby.MATLAB以及 ...
- Python学习案例之视频人脸检测识别
前言 上一篇博文与大家分享了简单的图片人脸识别技术,其实在实际应用中,很多是通过视频流的方式进行识别,比如人脸识别通道门禁考勤系统.人脸动态跟踪识别系统等等. 案例 这里我们还是使用 opencv 中 ...
- Python学习案例之人脸检测识别
前言 随着科技的发展,人脸识别技术在许多领域得到的非常广泛的应用,手机支付.银行身份验证.手机人脸解锁等等. 识别 废话少说,这里我们使用 opencv 中自带了 haar人脸特征分类器,利用训练好的 ...
- 基于AdaBoost算法——世纪晟结合Haar-like特征训练人脸检测识别
AdaBoost 算法是一种快速人脸检测算法,它将根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高. 系统在技术上的三个贡献: 1.用简单的Haa ...
- MTCNN人脸检测识别笔记
论文:Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks 论文链接:https:// ...
- Python视频人脸检测识别
案例 这里我们还是使用 opencv 中自带了 haar人脸特征分类器,通过读取一段视频来识别其中的人脸. 代码实现: 动图有点花,讲究着看吧: 如果是捕捉摄像头,只需要改变以下代码即可: c ...
- 人脸检测识别,人脸检测,人脸识别,离线检测,C#源码
百度网盘地址 微云地址 使用虹软人工智能开放平台技术开发完成
- 【转载】opencv实现人脸检测
全文转载自CSDN的博客(不知道怎么将CSDN的博客转到博客园,应该没这功能吧,所以直接复制全文了),转载地址如下 http://blog.csdn.net/lsq2902101015/article ...
- MTCNN人脸检测 附完整C++代码
人脸检测 识别一直是图像算法领域一个主流话题. 前年 SeetaFace 开源了人脸识别引擎,一度成为热门话题. 虽然后来SeetaFace 又放出来 2.0版本,但是,我说但是... 没有训练代码, ...
随机推荐
- UVA 11383 - Golden Tiger Claw(二分图完美匹配扩展)
UVA 11383 - Golden Tiger Claw 题目链接 题意:给定每列和每行的和,给定一个矩阵,要求每一个格子(x, y)的值小于row(i) + col(j),求一种方案,而且全部行列 ...
- 一、Redis 基础命令---总括
1.redis命令不区分大写和小写.可是KEY区分大写和小写. 2.redis-cli -h 127.0.0.1 -p 6379 依据IP/PORT链接服务端 3.redis-server --por ...
- LeetCode(1) Symmetric Tree
从简单的道题目開始刷题目: Symmetric Tree 题目:Given a binary tree, check whether it is a mirror of itself (ie, sym ...
- zoj3886--Nico Number(素数筛+线段树)
Nico Number Time Limit: 2 Seconds Memory Limit: 262144 KB Kousaka Honoka and Minami Kotori are ...
- ubuntu下安装AndroidStudio
近期将电脑的操作系统换成了ubuntu,对于不习惯win8/win10的人来说ubuntu确实是一个不错的选择,主要的软件都ok了,至于QQ什么的,大家能够去找wine版的,或者直接下载一个叫Cros ...
- linux sysbench (一): CPU性能测试详解
网上sysbench教材众多,但没有一篇中文教材对cpu测试参数和结果进行详解. 本文旨在能够让读者对sysbench的cpu有一定了解. 小慢哥的原创文章,欢迎转载 1.sysbench基础知识 s ...
- springmvc-servlet.xml 第二种选择
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- ADO.NET增删改
static void Main1(string[] args) {添加造连接字符串string connstring = "server=.;database=mydb;user=sa;p ...
- CI中的分页
根据MVC的思想,分页是需要传数据到模型中,把页码传过去,在模型中根据页码分配: 更多分页类函数可以通过CI手册的分页类查看: $this -> load ->library('pagin ...
- CI中的url相关函数以及路由设置和伪静态技术
当使用CI框架进行开发时,我们的一些数据传递的URL不应该写死,可以使用如下方法:比如说我们需要表单提交一个数据: 1.在controller控制器中我们需要先创建一个加载helper和视图的方法: ...