【Opencv图像处理】利用联级分类器实现人脸检测

CascadeClassifier人脸识别

  • 基本理论
  • C++代码
  • 结果展示

基本理论

使用基于Haar特征的级联分类器进行对象检测是Paul Viola和Michael Jones在2001年的论文"使用简单特征的增强级联的快速对象检测"中提出的一种有效的对象检测方法。这是一种基于机器学习的方法,其中级联函数是从许多正负图像中训练的。然后,它用于检测其他图像中的对象。

C++代码

使用 cv::CascadeClassifier 类来检测视频流中的对象。具体而言,我们将使用以下函数:
cv::CascadeClassifier::load 以加载.xml分类器文件。它可以是 Haar 或 LBP 分类器
cv::CascadeClassifier::detMultiScale 来执行检测。

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
#include<opencv2/objdetect.hpp>//对象检测头文件
void main()
{
    VideoCapture cap(0);
    Mat img;
    time_t start, end;
    char str[20];

    while(true)
    {
        time(&start);
        cap.read(img);
        CascadeClassifier faceCascade;/*用于对象检测的级联分类器类*/
        faceCascade.load("D:\\QT\\Opencv\\Resources\\haarcascade_frontalface_default.xml");//从文件加载分类器(已经训练好的模型)
        if(faceCascade.empty()) cout<<"XML file is empty"<<endl;

        vector<Rect> faces;//  save Rect vector
        faceCascade.detectMultiScale(img, faces, 1.1, 10);//在输入图像中检测不同大小的对象。检测到的对象将以矩形列表的形式返回。
        for(int i=0; i<faces.size(); i++)
        {
            rectangle(img, faces[i].tl(), faces[i].br(), Scalar(255,255,0), 3);//绘制矩形
        }
        time(&end);
        double seconds = difftime (end, start);
        auto fps  = 1 / seconds;
        string FPSstring("FPS:");
        sprintf_s(str, "%.2f", fps);
        FPSstring += str;
        putText(img, FPSstring, Point(5,20),FONT_HERSHEY_SIMPLEX,0.5,Scalar(255,0,0));
        imshow("Image", img);
        waitKey(1);//增加延时
    }

结果展示

【Opencv图像处理】利用联级分类器实现人脸检测_第1张图片

你可能感兴趣的:(Opencv,图像处理,opencv,c++)