目标
在本教程中,
我们将学习Haar级联对象检测的工作原理。
我们将使用基于Haar Feature的Cascade分类器了解人脸检测和眼睛检测的基础知识。
我们将使用cv::CascadeClassifier类来检测视频流中的对象。特别是,我们将使用以下函数:
cv::CascadeClassifier::load来加载.xml分类器文件。它可以是Haar或LBP分类器
cv::CascadeClassifier::detectMultiScale来执行检测。
理论
使用基于Haar特征的级联分类器的对象检测是Paul Viola和Michael Jones在其论文“使用简单特征的增强级联进行快速对象检测”中于2001年提出的一种有效的对象检测方法。这是一种基于机器学习的方法,其中从许多正负图像中训练级联函数。然后用于检测其他图像中的对象。
在这里,我们将进行人脸检测。最初,该算法需要大量正图像(面部图像)和负图像(无面部图像)来训练分类器。 然后,我们需要从中提取特征。为此,使用下图所示的Haar功能。 它们就像我们的卷积核一样。 每个特征都是通过从黑色矩形下的像素总和中减去白色矩形下的像素总和而获得的单个值。
现在,每个内核的所有可能大小和位置都用于计算许多功能。(试想一下它产生多少计算?即使是一个24x24的窗口也会产生超过160000个特征)。对于每个特征计算,我们需要找到白色和黑色矩形下的像素总和。为了解决这个问题,他们引入了整体图像。无论你的图像有多大,它都会将给定像素的计算减少到仅涉及四个像素的操作。很好,不是吗?它使事情变得更快。
但是在我们计算的所有这些特征中,大多数都不相关。例如,考虑下图。第一行显示了两个良好的特征。选择的第一个特征似乎着眼于眼睛区域通常比鼻子和脸颊区域更暗的性质。选择的第二个特征依赖于眼睛比鼻梁更黑的属性。但是,将相同的窗口应用于脸颊或其他任何地方都是无关紧要的。那么,我们如何从16万多个功能中选择最佳特征?它是由Adaboost实现的。
为此,我们将所有特征应用于所有训练图像。对于每