
自己封装的类:
using Accord.Vision.Detection; using Accord.Vision.Detection.Cascades; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace FIRC {
///请尊重原创,保留作者信息
//Author:云未归来
//Time:20190922 public class FaceDetectionManager { HaarCascade cascade =null; HaarObjectDetector detector=null;
~FaceDetectionManager() { } public FaceDetectionManager(int minSize = 30, float scalingFactor = 1.5f, bool useParallelProcessing=true) { cascade =new FaceHaarCascade(); detector= new HaarObjectDetector(cascade, minSize); detector.SearchMode = ObjectDetectorSearchMode.NoOverlap; detector.ScalingMode = ObjectDetectorScalingMode.SmallerToGreater; detector.ScalingFactor = scalingFactor; detector.UseParallelProcessing = useParallelProcessing; } /// <summary> /// 获取图片中所有人的脸的位置信息 /// </summary> /// <param name="bmp"></param> /// <returns></returns> public Rectangle[] GetFacePosition(Bitmap bmp) { return detector.ProcessFrame(bmp); } /// <summary> /// 获取图片中所有的脸 /// </summary> /// <param name="bmp"></param> /// <param name="rect"></param> /// <returns></returns> public List<Bitmap> GetFaceBitmap(Bitmap bmp,Rectangle[] rect) { if (bmp == null) return null; if (rect == null || rect.Length == 0) return null; List<Bitmap> list = new List<Bitmap>(); for(int i=0;i<rect.Length;i++) { list.Add(bmp.Clone(rect[i],bmp.PixelFormat)); } return list; } /// <summary> /// 剪裁图片,算法实际用的clone函数解决问题 /// </summary> /// <param name="bmp"></param> /// <param name="rect"></param> /// <returns></returns> public Bitmap CutImage(Bitmap bmp,Rectangle rect) { Bitmap outBitmap=new Bitmap(rect.Width,rect.Height); using(Graphics g=Graphics.FromImage(outBitmap)) { g.DrawImage(bmp,rect); } return outBitmap; } /// <summary> /// 将脸区域绘制出来 /// </summary> /// <param name="bmp"></param> /// <param name="rect"></param> /// <param name="penWidth"></param> /// <param name="color"></param> /// <returns></returns> public Bitmap DrawFace(Bitmap bmp,Rectangle[] rect,Color color,float penWidth=3f) { if(bmp==null) return null; if(rect==null || rect.Length==0) return bmp; Graphics g = Graphics.FromImage(bmp); Brush brush=new SolidBrush(color); Pen pen=new Pen(brush,penWidth); g.DrawRectangles(pen, rect); g.Dispose(); pen.Dispose(); brush.Dispose(); return bmp; } } } 调用:
string filepath = "你的图片路径";
FaceDetectionManager fdm = new FaceDetectionManager(); var rects= fdm.GetFacePosition(new Bitmap(filepath)); pictureBox1.Image= fdm.DrawFace(new Bitmap(filepath), rects,Color.Red);