opencv3/c++ Haar特征与Viola-Joines人脸检测

在人脸检测中,Viola-Jones人脸检测算法是一个经典的算法,由Viola.P.和 Jones.M在2001年的CVPR上提出。主要通过利用Haar特征结合adaboost算法进行训练,然后建立级连分类器分类。优点是速度快,正脸检测高效;缺点是对侧脸检测不够稳健。

Haar特征

由Viola和Jones根据Haar小波的方法开发(由Rainer Lienhart改进为Haar-like特征,用于目标检测)。Haar特征的作用有点类似卷积核,即通过下图中的矩形窗口,将检测窗口中的黑色矩形下的像素之和中减去白色矩形下的像素之和,结果作为特征值。然后遍历所有像素得到的即为Haar特征。
这里写图片描述
这样不同的矩形窗口可以获得不同的图像特征:
这里写图片描述
而在人脸图像中会有一些基本的共性:眼睛、眉毛、鼻子和嘴巴的位置相对固定,鼻子比周围亮等等。这样,Viola-Joines算法就通过Haar特征获得了人脸的共有属性。

产生的问题

按上述方法获得Haar特征会产生两个问题:

  • 运算量问题;
  • 特征选择问题;
运算量问题:

在获得Haar特征的时候,一个图像中可选择矩形窗口有大有小。若每个矩形窗口都用遍历所有像素再求和,那么就会产生巨大的运算量(一个24x24的窗口也会产生超过160000个特性)。这里采用的解决办法是引入积分图像,参见积分图像

特征选择问题:

特征选择问题即如何从如此多的Haar特征中选择最佳特征。这里采用Adaboost算法。在训练数据(包含人脸的和不包含人脸的图像)中对于每个特征,找到正确分类的最佳阈值,然后选择错误率最小的特征。每次分类之后,增加错误分类的图像的权重,然后执行相同的过程,计算新的错误率及新的权重。直到达到所需的准确度、错误率或找到所需数量的特征为止。opencv中最终选择的特征有6000个左右。

另外,在图像中,大部分图像是非人脸区域。为减少检测时间这里引入了分类器级联。即不在检测窗口上应用全部的6000个特征,而是分为不同的阶段逐一应用。那些非人脸的部分在开始阶段就会被丢弃;这样,可以花费更多时间检查可能的人脸区域。
如图,200个特征即能达到95%的准确度(横轴为假阳性率FPR,纵轴为真阳性率TPR):
这里写图片描述

OpenCV中的应用:

利用OpenCV自带的haarcascade_frontalface_alt.xml文件进行简单的人脸识别。haarcascade_frontalface_alt.xml文件位于opencv安装目录下的…/data/haarcascades/中。
示例:

#include "opencv2/opencv.hpp"   
#include "opencv2/objdetect/objdetect.hpp"   

using namespace std;   
using namespace cv;   

int main( int argc, char** argv )
{   
    Mat src;
    CascadeClassifier face_cascade;
    src =imread("E:/image/image/faces.jpg",1);
    if (src.empty())
    {
        printf("can not load the image...\n");
        return -1;
    }
    if( !face_cascade.load("haarcascade_frontalface_alt.xml") )
    {    
        printf("can not load the file...\n");
        return -1;
    }
    vector<Rect> faces;   
    Mat gray_image; 
    cvtColor( src, gray_image, CV_BGR2GRAY );  
    //直方图均衡化  
    equalizeHist( gray_image, gray_image );   
    face_cascade.detectMultiScale( gray_image, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(1, 1) );   
    //框选出脸部区域
    for (int i = 0; i < faces.size(); i++)
    {
        RNG rng(i);
        Scalar color = Scalar(rng.uniform(0,255), rng.uniform(0,255), 20);
        rectangle(src, faces[static_cast<int>(i)], color, 2, 8, 0);
    } 
    imshow("face", src );   
    waitKey(0);
    return 0;
}   

这里写图片描述


Robust Real-Time Face Detection

OpenCV:Face Detection using Haar Cascades

Wikipedia:Haar-like feature

An Extended Set of Haar-like Features for Rapid Object Detection

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值