人脸检测

本文介绍OpenCV中人脸检测使用的Haar特征及Adaboost算法原理及代码实现,代码使用EmguCV 3.0编写。


Haar特征

Haar特征简单的来说就是如下图所示的窗口
Haar
Haar特征就是黑色区域的像素和与白色区域的像素和,分别乘以一个权值,求差,得到Haar特征值。权值与面积成反比,保证黑色与白色区域的像素点个数相等。
通过窗口的平移与缩放,可以在一幅图像中获取数目巨大的Haar特征组。
由统计规律得知,在人脸部分与非人脸部分的Haar特征值是有差异的。
基于某一次获得的Haar特征值,对其进行分析,可以获得一个判断,即人脸or非人脸,这就是一个弱分类器。


Adaboost算法

对于Adaboost算法的原理可以参考我的另一篇文章Adaboost算法流程及原理推导。在此处Adaboost算法的作用就是将若分类器进行级联,获得强分类器。


代码实现

代码使用EmguCV 3.0编写,采用C# WPF。

检测函数

public void Process(Mat image, string FacePath, List<System.Drawing.Rectangle> faces, out long time)
{
    Stopwatch watch;  //用于计时
    using (CascadeClassifier face = new CascadeClassifier(FacePath))
    {
        watch = Stopwatch.StartNew();
        using (UMat ugray = new UMat())
        {
            CvInvoke.CvtColor(image, ugray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
            CvInvoke.EqualizeHist(ugray, ugray);
            System.Drawing.Rectangle[] facesDetected = face.DetectMultiScale(
               ugray,
               1.1,
               3,
               new System.Drawing.Size(10, 10));
            faces.AddRange(facesDetected);
        }
        watch.Stop();
    }
    time = watch.ElapsedMilliseconds;
}

调用方法

public MainWindow()
{
    InitializeComponent();

    Mat image = new Mat("Solvay_conference_1927.jpg", LoadImageType.Color);
    long time;
    List<System.Drawing.Rectangle> faces = new List<System.Drawing.Rectangle>();
    Process(image, "haarcascade_frontalface_default.xml", faces, out time);
    foreach (System.Drawing.Rectangle face in faces)
        CvInvoke.Rectangle(image, face, new Bgr(System.Drawing.Color.Red).MCvScalar, 2);

    System.Windows.Controls.Image i = new System.Windows.Controls.Image();
    i.Source = BitmapSourceConvert.ToBitmapSource(image);
    root.Children.Add(i);
    window.Title = time.ToString() + "ms";
}

运行结果

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值