[转]一个人脸检测器

 

//本文使用到Emgu.CV库,该库是C#语言对OpenCV的封装,以下是一个列子程序的改正版本。
using System; using System.Collections.Generic; using System.Text; using Emgu.CV.Structure; using Emgu.CV;namespace VSL.Plugin.TrackingSystem.SimpleTrackingSystemExample {public class FaceDetector{//private HaarCascade _faceCascade;Emgu.CV.HaarCascade face;// = new HaarCascade(".\\haarcascades\\haarcascade_frontalface_alt_tree.xml");Emgu.CV.HaarCascade eye;// = new HaarCascade(".\\haarcascades\\haarcascade_frontaleye.xml");public FaceDetector(){// _faceCascade = new HaarCascade(".\\haarcascades\\haarcascade_frontalface_alt_tree.xml");face = new Emgu.CV.HaarCascade(".\\haarcascades\\haarcascade_frontalface_alt_tree.xml");eye = new Emgu.CV.HaarCascade(".\\haarcascades\\haarcascade_frontaleye.xml");}public List<Face<D>> Detect<D>(Emgu.CV.Image<Emgu.CV.Bgr, D> img){using (Emgu.CV.Image<Emgu.CV.Gray, D> gray = img.Convert<Emgu.CV.Gray, D>()){MCvAvgComp[][] objects = gray.DetectHaarCascade(face);List<Face<D>> res = new List<Face<D>>();System.Drawing.Rectangle rect = img.ROI; //保存操作区域//通过判断脸部是否含有眼睛来进一步检测是否是正确的人脸foreach (MCvAvgComp f in objects[0]){//检测眼睛gray.ROI = f.rect;MCvAvgComp[][] eyesDetected = gray.DetectHaarCascade(eye, 1.1, 1,Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,new System.Drawing.Size(20, 20));gray.ROI = System.Drawing.Rectangle.Empty;//if there is no eye in the specific region, the region shouldn't contains a face//note that we might not be able to recoginize a person who ware glass in this caseif (eyesDetected[0].Length == 0) continue;img.ROI = f.rect; //设定操作区域res.Add(new Face<D>(img.Copy(), f.rect));}img.ROI = rect; //恢复操作区域return res;}}public void Dispose(){face.Dispose();}}public class Eye<D>{private Emgu.CV.Image<Emgu.CV.Bgr, D> _image;public Eye(Emgu.CV.Image<Emgu.CV.Bgr, D> img, System.Drawing.Rectangle rect){_image = img;}public Emgu.CV.Image<Emgu.CV.Bgr, D> RGB{get{return _image;}}}public class Face<D>{private Emgu.CV.Image<Emgu.CV.Bgr, D> _image;private Emgu.CV.Image<Emgu.CV.Gray, D> _imageGray;private Emgu.CV.Image<Emgu.CV.Hsv, D> _imageHSV;private Emgu.CV.Image<Emgu.CV.Gray, D> _h;private Emgu.CV.Image<Emgu.CV.Gray, D> _s;private Emgu.CV.Image<Emgu.CV.Gray, D> _v;private Emgu.CV.Histogram _hueHtg;//private Seq<MCvContour> _skinContour;private System.Drawing.Rectangle _rect;private Emgu.CV.HaarCascade _eyeCascade;public Face(Emgu.CV.Image<Emgu.CV.Bgr, D> img, System.Drawing.Rectangle rect){_image = img;_rect = rect;_eyeCascade = new Emgu.CV.HaarCascade(".\\haarcascades\\eye_12.xml");}public List<Eye<D>> DetectEye(){MCvAvgComp[][] objects = Gray.DetectHaarCascade(_eyeCascade);List<Eye<D>> res = new List<Eye<D>>();foreach (MCvAvgComp o in objects[0]){_image.ROI = o.rect;res.Add(new Eye<D>(_image.Copy(), o.rect));}_image.ROI = System.Drawing.Rectangle.Empty;return res;}public System.Drawing.Rectangle Rectangle{get { return _rect; }}public Emgu.CV.Image<Emgu.CV.Bgr, D> Bgr{get{return _image;}}public Emgu.CV.Image<Emgu.CV.Gray, D> Gray{get{if (_imageGray == null) _imageGray = _image.Convert<Emgu.CV.Gray, D>();return _imageGray;}}public Emgu.CV.Image<Emgu.CV.Hsv, D> Hsv{get{if (_imageHSV == null) _imageHSV = _image.Convert<Emgu.CV.Hsv, D>();return _imageHSV;}}public Emgu.CV.Image<Emgu.CV.Gray, D> H{get{if (_h == null){Emgu.CV.Image<Gray, D>[] imgs = Hsv.Split();_h = imgs[0];_s = imgs[1];_v = imgs[2];}return _h;}}public Image<Gray, D> S{get{if (_s == null){Image<Gray, D>[] imgs = Hsv.Split();_h = imgs[0];_s = imgs[1];_v = imgs[2];}return _s;}}public Image<Gray, D> V{get{if (_h == null){Image<Gray, D>[] imgs = Hsv.Split();_h = imgs[0];_s = imgs[1];_v = imgs[2];}return _v;}}public Histogram HueHistogram{get{if (_hueHtg == null){int size = 60;_hueHtg = new Histogram(new int[1] { size }, new float[1] { 0.0f }, new float[1] { 180.0f });}return _hueHtg;}}public Image<Gray, D> SkinMask{get{Image<Gray, D> skinMask = Gray.CopyBlank();//skinMask.Draw(SkinContour, new Gray(255.0), new Gray(120.0), -1);return skinMask;}}/*public Seq<MCvContour> SkinContour{get{if (_skinContour == null){Histogram htg = HueHistogram;htg.Accumulate(new Image<Gray, D>[1] { H });double[] arr = new double[htg.BinSize[0]];for (int i = 0; i < htg.BinSize[0]; i++)arr[i] = htg.Query(new int[1] { i });System.Array.Sort<double>(arr);System.Array.Reverse(arr);htg.Threshold(arr[2]);using (Image<Gray, D> bpj = htg.BackProject(new Image<Gray, D>[1] { H })){Seq<MCvContour> cList = bpj.FindContours( CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST, new MemStorage());Seq<MCvContour> maxAreaContour = cList;foreach (Seq<MCvContour> ct in cList){if (ct.Area > maxAreaContour.Area)maxAreaContour = ct;}_skinContour = GRAY.Snake(maxAreaContour, 1.0f, 1.0f, 1.0f, new Point2D<int>(5, 5), new Emgu.CV.MCvTermCriteria(20, 1.0), new MemStorage());}}return _skinContour;}}*/public void Dispose(){_image.Dispose();if (_imageGray != null) _imageGray.Dispose();if (_imageHSV != null) _imageHSV.Dispose();if (_h != null) _h.Dispose();if (_s != null) _s.Dispose();if (_v != null) _v.Dispose();//if (_skinContour != null) _skinContour.Dispose();}} }

 

 

文章源地址: http://www.cnblogs.com/zengqs/archive/2009/02/01/1382024.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目中cxf和weblogic整合时报错的问题

GJYW项目使用的weblogic版本是10.3.6&#xff0c;cxf使用的版本是3.1.4 在将项目部署到weblogic服务器上时就会报错&#xff0c;通过下面的方式可以解决weblogic和cxf框架在一起报错的问题&#xff08;解决了本项目报错的问题&#xff0c;未必全部适用&#xff09;&#xff1a;…

下周开幕!给深圳的嵌入式和电子工程师准备的嘉年华来了

我和电子圈老江认识了很久&#xff0c;应该是2012年&#xff0c;小龙第一次参加电子圈年会&#xff0c;那年他年会中奖的奖品送给我。后来&#xff0c;我也加入了电子圈的QQ群&#xff0c;早些年的时候&#xff0c;大家都喜欢在QQ群聊天&#xff0c;后来才慢慢转到微信群。老江…

java过去配置文件的值_java对.properties配置文件操作

实现运用Java.util.Properties来进行对.properties配置文件操作。配置文件实例&#xff1a;如debug.properties#Tue Mar 21 15:46:17 CST 2017#keyvalueremote.debug.prot7451第一步写个获取文件路径的外部方法//-in- String filePath&#xff1a;配置文件名如debug.properties…

AS3.0中的显示编程(末篇)-- 滤镜(下)

剩下的三种滤镜&#xff0c;因为我自己也不是很懂矩阵啊这些的&#xff0c;只能做些简单的范例和说明了&#xff0c;抱歉&#xff01;颜色矩阵滤镜、卷积滤镜、置换图滤镜这三种滤镜只能通过AS代码实现。如果说上面的六种滤镜&#xff0c;只是在原图的基础上做些简单的修改&…

这几个朋友,我记得

‍‍昨天的中秋节是在公司加班度过的&#xff0c;末了&#xff0c;在群里看到有人说要是今天还有人加班的话&#xff0c;那他一定是真正的卷王&#xff0c;好了&#xff0c;我是那个中秋节加班的卷王。早上打车去公司&#xff0c;快到公司楼下的时候&#xff0c;司机师傅跟我说…

HOWTO:如何修改InstallShield的运行环境

版权声明: 可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息。在InstallShield中&#xff0c;存在一些运行环境的变量&#xff0c;如果我们做了某种选择&#xff0c;之后可能将不再提示&#xff0c;说不定什么时候又想改回来呢&#xff0c;找不到地…

杭电java期末试卷2015_2014年杭州电子科技大学Java期末试卷.doc

2014年杭州电子科技大学Java期末试卷.doc杭州电子科技大学学生考试卷( A )卷考试课程Java语言程序设计考试日期2014年 6月 16日成 绩课程号教师号任课教师姓名考生姓名学号(8位)年级专业注意&#xff1a;所有答案均写在答卷上&#xff0c;写在试卷上无效;(一)单选题(每题2分&am…

深入理解Java线程池:ThreadPoolExecutor

线程池介绍 在web开发中&#xff0c;服务器需要接受并处理请求&#xff0c;所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便&#xff0c;但是存在一个问题&#xff1a; 如果并发的请求数量非常多&#xff0c;但每个线程执行的时间…

看嵌入式大神直播,送开发板!

这是一场嵌入式学习者不可错过的直播……以往拿到一个开发板&#xff0c;还要花费时间找资料&#xff0c;向有经验的朋友请教测试过程现在&#xff0c;在捷客直播间&#xff0c;嵌入式大神现场教学&#xff0c;手把手教你如何使用开发板开发一款智能设备9月26日晚&#xff0c;看…

iphone上如何绘制饼图(使用CGContextAddArc)(原创)

CGContextAddArc是一个比较强大的函数&#xff0c;建议仔细看一下iphone的开发文档。 CGContextAddArc(CGContextRef c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, intclockwise) CGContextRef: 图形上下文x,y: 开始画的坐标radius: 半径s…

java实现itchat_GitHub - Xiazki/itchat4j: wechatbot 的java实现,简单搭建了基本框架和实现了扫码登陆,具体网页微信api请参考...

itchat4j 微信自动回复机器人-------------- --------------- ---------------| | | | | || Get UUID | | Get Contact | | Status Notify || | | | | |------------- -------^------- -------^-------| | || ------- --------| | |-------v------ ------------- -------------…

华为宣布:免费培养8000名开发者! 学习免费!实验免费!考证免费!

很多朋友都想储备一些不同领域的新技术以便未来有更好的发展但目前市面上各种教程质量良莠不齐而且想要掌握高阶的开发技术需要耗费大量的时间和精力So&#xff0c;华为云特别推出 互联网技能加油站包含物联网、Python、AI等五大领域&#xff0c;核心技术赋能构建全面技能体系现…

ruby

官网 http://www.ruby-lang.org/en/ https://ruby-china.org/ DOC http://ruby-doc.com/docs/ProgrammingRuby/ http://ruby-doc.org/core-2.2.1/ 六个最酷的Ruby on Rails项目 https://www.ctocio.com/ccnews/20453.html Rake: Ruby中任务构建工具rake的入门 https://www.cnbl…

java 两个点球面距离_计算球面两点间距离实现Vincenty+Haversine

vincenty公式 精度很高能达到0.5毫米&#xff0c;但是很慢。Haversine公式半正矢公式&#xff0c;比vincenty快&#xff0c;精度没有vincenty高&#xff0c;也长使用。-------------------------------------------openlayers中实现的Vincenty-------------------------------…

送20个鼠标垫

之前发的朋友圈&#xff0c;里面晒了一个鼠标垫&#xff0c;大家都挺喜欢的&#xff0c;这次决定送30个给大家&#xff0c;没有什么规则&#xff0c;直接抽奖就好了。在下方的公众号回复【1001】获取抽奖小程序。因为之前好几次抽奖&#xff0c;因为时间比较长导致大家忘记填写…

angularjs的表单验证

angularjs的表单验证 废话&#xff1a;angular的热度在减小&#xff0c;但是老项目依旧是angular的&#xff0c;就是不能丢&#xff0c;得会 干活直接上代码  <!DOCTYPE html> <html> <head><!-- CSS --><link rel"stylesheet" href&qu…

越老越值钱,除了程序员!

-我们见过太多靠经验、资历“镀金”的职业。司机、教师、医生、律师、会计……这些职业的薪资待遇、社会地位、声誉等等都会随着从业时间的增长而变得越来越高、越来越好。“老”这个字&#xff0c;对于这类的职业来说&#xff0c;更像是褒奖。大家对于“资深”的他们&#xff…

Visual Studio 2010授权修改

为什么80%的码农都做不了架构师&#xff1f;>>> 参见以下步骤&#xff1a; 32位的系统中&#xff0c;修改以下注册表键值 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\Registration\UserName HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Curr…

Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验

Net Core平台灵活简单的日志记录框架NLogSqlServer初体验 前几天分享的"[Net Core平台灵活简单的日志记录框架NLogMysql组合初体验][http://www.cnblogs.com/yilezhu/p/9416439.html]" 反响还行。有网友就说有了NLogMySql的组合&#xff0c;那如果我是用SqlServer怎么…

从单片机步入Linux之文件系统的构建

大家好&#xff0c;我是情报小哥&#xff01;本文为【从单片机步入嵌入式Linux】系列文章的第四篇文章&#xff0c;前面三篇大家有时间也可以回头阅读一下&#xff0c;本系列文章的很多知识我都会从裸机开发和理解的角度来分析&#xff0c;帮助大家迅速理解Linux系统相关的知识…