//本文使用到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

[转]一个人脸检测器相关推荐

  1. 使用yolov3-tiny训练一个人脸检测器

    春节放假回家时,在北京西乘坐高铁进站时发现,现在出现了很多自助进站验证对pos机器,主要是对身份证和个人的照片进行匹配,判断是不是同一个人,无需人工check了,省时省力.春节在家没事干,想起了人脸识 ...

  2. 使用Python,OpenCV和Haar级联进行人脸检测——轻量级的人脸检测器

    使用Python,OpenCV和Haar级联进行人脸检测--轻量级的人脸检测器 1. 效果图 2. 原理 2.1 项目结构 2.2 [haarcascade_frontalface_default.x ...

  3. 今日 Paper | 高效骨干搜索;学习扩充;最小人脸检测器;​DEPARA等

    2020-04-01 11:19 导语:为了更好地服务广大 AI 青年,AI 研习社正式推出全新「论文」版块.   目录 用于场景文本识别的高效骨干搜索 学习扩充:用于文本识别的联合数据增强和网络优化 ...

  4. 基于PYQT编写一个人脸识别软件(2)

    前言 以前在博客:基于PYQT编写一个人脸识别软件 中给出了我自己用PYQT编写的一个小软件.鉴于使用的是开源库--face_recogniton,尽管使用很简单,但是还有些问题,比如:识别黄种人时效 ...

  5. 重磅!2K图像90FPS,中科院开源轻量级通用人脸检测器

    欢迎加小助手微信(cv-mart) 备注:研究方向-姓名-学校/公司-城市(如:目标检测-小极-北大-深圳),即可申请加入目标检测.目标跟踪.人脸.工业检测.医学影像.三维&SLAM.图像分割 ...

  6. python识别人脸多种属性_OpenCV-Python(3)训练一个人脸识别器

    想要能人脸识别,我们需要训练一个识别器处理.训练的话就需要之前已经标注好的训练集,在前一篇文章中,我们创建了一个已经标注好的训练集.现在,是时候用这个训练集来训练一个人脸识别器了.当然,是用OpenC ...

  7. 【人脸识别6】用haar+adaboost训练自己的人脸检测器

    [人脸识别6]用haar+adaboost训练自己的人脸检测器 [1. 准备样本] 1.将ORL数据库中的400张人脸储存到一个文件夹下positive_samples 2.生成索引文件posdata ...

  8. 人脸检测:经典的VJ人脸检测器(类Harr特征,积分图加速法,级联的Adaboost强分类器)

    著名的VJ人脸检测算法就是一种基于Adaboost分类器的方法.该检测器由Paul Viola和Michael Jones在2001年的 Robust Real-Time Face Detection ...

  9. 用PyQt5+Caffe+Opencv搭建一个人脸识别登录界面

    最近开始学习Qt,结合之前学习过的caffe一起搭建了一个人脸识别登录系统的程序,新手可能有理解不到位的情况,还请大家多多指教. 我的想法是用opencv自带的人脸检测算法检测出面部,利用caffe训 ...

最新文章

  1. vector容器的用法
  2. FPGA之道(63)“万能”的查表法
  3. [云炬创业基础笔记]第一章创业环境测试7
  4. boost::outcome模块outcome相关的测试程序
  5. linux笔记之 rpm常用参数 ,yum安装编译器,httpd服务的开关
  6. python 根据文件夹大小删除修改时间比较早的文件
  7. 微信小程序实战 购物车功能
  8. iPhone SE 3渲染图曝光:还是熟悉的味道
  9. Quay (3) - 访问权限管理
  10. 2008安装完了找不到_防臭地漏哪种好?防臭地漏怎么安装?一篇文章全了解
  11. linux应用之Lamp(apache+mysql+php)的源码安装(centos)
  12. idea code key study form qinChao
  13. 微软MSDN原版所有系统合集我告诉你,Windows历史操作系统索引
  14. 实用干货:电放提单详解,与海运单、一般提单到底有什么区别?
  15. 202007219 Oracle建表语句
  16. oracle 定时任务plsql,最简单的一个Oracle定时任务
  17. 简述神经网络的优点和缺点,人工神经网络优缺点
  18. 百度地图API仿链家地图找房 聚合开发 js实现
  19. 8086中寻址方式详解
  20. PHP实现时间轴函数(个性化时间)

热门文章

  1. 算法(17)-leetcode-剑指offer1
  2. 剑指offer_03
  3. 10kv线路负载率计算_电工必懂计算公式,你若不会,如何立足于电力行业?
  4. python怎么实现图像去噪_基于深度卷积神经网络和跳跃连接的图像去噪和超分辨...
  5. C++字符串的个人理解
  6. TDengine安装教程
  7. 对于以太坊的Solidity语言介绍
  8. 养不教 父母之过:10个不能靠老师解决的孩子教育问题
  9. 李开复唱衰互联网手机:大部分公司会失败
  10. 解决 --- Docker 启动时报错:iptables:No chain/target/match by the name