自己封装的类:
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);