OpenCV学习笔记(10):人脸检测

1. 前言

OpenCV实现人脸检测主要是采用了adaboost分类算法,这种算法是属于机器学习范畴,需要使用海量图片进行训练,得到一个分类文件,然后根据该文件中的参数进行人脸检测。由于训练过程比较复杂,我们在此不再累述,直接使用官方发布的XML文件即可。

OpenCV的Windows版Release包中提供了两类分类文件,位于路径 opencv/build/etc/下,其中haarcascades文件夹对应基于haar特征的分类器,lbpcascades文件夹对应基于lbp特征的分类器。
OpenCV学习笔记(10):人脸检测_第1张图片

2. CascadeClassifier类

CascadeClassifier类是一个用于做目标检测的类,其实不止是人脸检测,OpenCV还提供了眼睛、微笑、银器、光盘等物体的识别,区别仅在于加载了不同的XML文件,理论上,只要分类文件足够给力,待测目标都能够按分类被检测,而人脸只是其中常见应用之一。

CascadeClassifier类的构成十分简单,只有十几个成员函数,而真正用于检测的,只有detectMultiScale函数,该函数有3个重载,我们通常使用最简单的一个

void cv::CascadeClassifier::detectMultiScale (      
        InputArray image,
        std::vector& objects,
        double  scaleFactor = 1.1,
        int     minNeighbors = 3,
        int     flags = 0,
        Size    minSize = Size(),
        Size    maxSize = Size() 
    )   

其中——

InputArray image

输入待检测的图像,可以是色图,也可以是灰度图,其实内部会进行灰度化处理

std::vector& objects

输出检测结果,有可能有多个,所以输出是一个vector泛型

double  scaleFactor = 1.1

图像缩放系数,这个采用默认值即可

int  minNeighbors = 3

最小邻近矩阵大小,这样也采用默认值即可

int  flags = 0

兼容早期检测算法的标记,默认值0表示不使用早期版本,如果使用的是OpenCV3.0之前的版本,建议使用1

Size    minSize = Size()
Size    maxSize = Size()

所检测目标的最小和最大尺寸,这个需要根据自己的实际情况进行调整

3. 一个简单的人脸检测程序

#include
#include
using namespace std;
using namespace cv;

int main(){
    Mat src = imread("test.png", IMREAD_COLOR);
    CascadeClassifier ccf;
    vector faceBox;
    if (!ccf.load("haarcascade_frontalface_default.xml")){
        cerr << "ERROR:Load XML file failed!" << endl;
    }
    ccf.detectMultiScale(src, faceBox, 1.1, 3, 0, Size(30, 30), Size(200, 200));
    for (vector::const_iterator iter = faceBox.begin(); iter != faceBox.end(); iter++){
        rectangle(src, *iter, Scalar(0, 255, 255), 3, 0);
    }
    imshow("face", src);
    waitKey(0);
    return 0;
}

结果

OpenCV学习笔记(10):人脸检测_第2张图片

4. 总结

OpenCV采用的人脸检测算法比较早期,无论检测精度还是运算速度,都已经过时。人脸检测算法目前做的已经相当成熟,很多开源API都能达到较好的性能,如Face++。而商业级人脸检测算法结合专用的硬件产品更是能达到惊人的效果,比如最新的iPhone X的FaceID,相当强悍。

你可能感兴趣的:(OpenCV)