[C#][原创]利用Accord.NET做人脸检测

自己封装的类:

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);

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1623863129

你的打赏是我写文章最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值