本文介绍OpenCV中人脸检测使用的Haar特征及Adaboost算法原理及代码实现,代码使用EmguCV 3.0编写。
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";
}