使用OpenCV中的Haar特征检测图片中的人脸

一、概述

  案例:使用OpenCV的Haar特征数据检测人脸。

  相关API介绍

    1.使用CascadeClassifier类

    2.使用其load方法加载特征文件

    3.使用其detectMultiScale方法在多尺度空间进行检测,其中该参数解释如下:

 /** @brief Detects objects of different sizes in the input image. The detected objects are returned as a list
    of rectangles.

    @param 输入图像类型是CV_8U
    @param 输出矩阵,类型是vector<Rect> objects,其中每一个Rect代表一个人脸矩阵框,因为一副图中有可能包含多个人脸。
    @param 这是多尺度空间下检测人脸的关键参数,其作用是:每次图像减小的比例,比例越小也就越准确,速度也就越慢,反之亦然
    @param minNeighbors 关键参数,其代表的含义是,有多少个框框住了此人脸才算是目标人脸。其值越小误差越大。ps:检测人脸时并不是一下在就检测到一个框,而是会出现多个框框住一个人脸,框住的越多
               则说明此框是人脸的可能性就越大。 @param minSize 目标的最小尺寸,此处最小必须>=24,因为这是特征向量中规定的。 @param maxSize 目标的最大尺寸,最大尺寸最好不要大鱼图片尺寸,常规测试用默认的就行。
*/ CV_WRAP void detectMultiScale( InputArray image, CV_OUT std::vector<Rect>& objects, double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size() );

  实现图像人脸检测的步骤:

    1.imread载入原图

    2.使用cvtColor将图像转为灰度图

    3.使用直方图均衡化均衡灰度图

    4.实例化CascadeClassifier

    5.加载特征文件(load方法)

    6.在多尺度空间检测人脸(detectMultiScale)

    7.得到检测到的人脸并绘制出

    8.输出的Qt的Scene中并显示

    

二、代码演示

 Mat src = imread(filePath);
    if(src.empty()){
        qDebug()<<"图片为空";
        return;
    }

    //人脸识别特征文件路径haar特征文件
    String face_path = "/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_alt.xml";
    CascadeClassifier face_classifier;//初始化
    if(!face_classifier.load(face_path)){//加载特征数据
        qDebug()<<"特征数据加载失败";
        return;
    }

    //gray
    Mat gray;
    cvtColor(src,gray,COLOR_BGR2GRAY);//转灰度图像
    equalizeHist(gray,gray);//直方图均衡化

    vector<Rect> faces;//存储检测到的人脸
    face_classifier.detectMultiScale(gray,faces,1.1,3,0);//在不同的尺度空间检测人脸

    for(size_t i=0;i<faces.size();i++){
       rectangle(src,faces[i],Scalar(0,0,255),1,LINE_8);//将人脸绘制出来
    }


    QImage image = ImageUtils::matToQImage(src);
    QPixmap pixmap = QPixmap::fromImage(image);
    QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap.scaled(this->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
    scene.addItem(item);

 

三、效果图展示

 

posted on 2022-04-06 16:15  飘杨......  阅读(16)  评论(0编辑  收藏  举报