using System; using System.Collections.Generic; using System.Text; namespace Emgu.CV.Test { public class FaceDetector { private HaarCascade _faceCascade; public FaceDetector() { _faceCascade = new HaarCascade(".\\haarcascades\\haarcascade_frontalface_alt2.xml"); } public List> Detect(Image img) { using (Image gray = img.Convert()) { Rectangle[][] objects = gray.DetectHaarCascade(_faceCascade); List> res = new List>(); foreach (Rectangle o in objects[0]) { img.ROI = o; res.Add(new Face(img.Copy(), o)); } img.ROI = null; return res; } } public void Dispose() { _faceCascade.Dispose(); } } public class Eye { private Image _image; public Eye(Image img, Rectangle rect) { _image = img; } public Image RGB { get { return _image; } } } public class Face { private Image _image; private Image _imageGray; private Image _imageHSV; private Image _h; private Image _s; private Image _v; private Histogram _hueHtg; //private Seq _skinContour; private Rectangle _rect; private HaarCascade _eyeCascade; public Face(Image img, Rectangle rect) { _image = img; _rect = rect; _eyeCascade = new HaarCascade(".\\haarcascades\\eye_12.xml"); } public List> DetectEye() { Rectangle[][] objects = Gray.DetectHaarCascade(_eyeCascade); List> res = new List>(); foreach (Rectangle o in objects[0]) { _image.ROI = o; res.Add(new Eye(_image.Copy(), o)); } _image.ROI = null; return res; } public Rectangle Rectangle { get { return _rect; } } public Image Bgr { get { return _image; } } public Image Gray { get { if (_imageGray == null) _imageGray = _image.Convert(); return _imageGray; } } public Image Hsv { get { if (_imageHSV == null) _imageHSV = _image.Convert(); return _imageHSV; } } public Image H { get { if (_h == null) { Image[] imgs = Hsv.Split(); _h = imgs[0]; _s = imgs[1]; _v = imgs[2]; } return _h; } } public Image S { get { if (_s == null) { Image[] imgs = Hsv.Split(); _h = imgs[0]; _s = imgs[1]; _v = imgs[2]; } return _s; } } public Image V { get { if (_h == null) { Image[] 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 SkinMask { get { Image skinMask = Gray.CopyBlank(); //skinMask.Draw(SkinContour, new Gray(255.0), new Gray(120.0), -1); return skinMask; } } /* public Seq SkinContour { get { if (_skinContour == null) { Histogram htg = HueHistogram; htg.Accumulate(new Image[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(arr); System.Array.Reverse(arr); htg.Threshold(arr[2]); using (Image bpj = htg.BackProject(new Image[1] { H })) { Seq cList = bpj.FindContours( CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST, new MemStorage()); Seq maxAreaContour = cList; foreach (Seq ct in cList) { if (ct.Area > maxAreaContour.Area) maxAreaContour = ct; } _skinContour = GRAY.Snake(maxAreaContour, 1.0f, 1.0f, 1.0f, new Point2D(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(); } } }