将D:\opencv-4.6.0\OpenCV_4.6.0-Build\install\etc\haarcascades   中的上述连个文件放入 build-opencvFace下

1. Mat

Mat faceROI = imgGray(Rect  rect);   截取rect 位置大小的内容   

Rect    成员变量  x,y,width,height

2. CascadeClassifier   级联分类器

load(string xmlPath);   加载xml

detectMultiScale(

        Mat img,

        vector<Rect> vectors,        // 存入检测到的(输出结果)

        double scaleFactor = 1.1,        //缩放系数  

        int minNeighbors = 3,

        int flags,

        Size minsize = Size(),

        Size maxsize = Size(),

)

Mat img   输入图像   必须是灰度图CV_8UC1

vector <Rect> 输出结果

scaleFactor   缩放系数    Haar 检测器用固定大小窗口扫描原图;想要检测大小不同人脸,

                                        就不断把图像缩小。

minNeightbors  邻域过滤   同一个人脸位置,会产生多个重叠候选框

flags    0 | CASCADE_SCALE_IMAGE       缩放图像做检测

minSize   小于 30x30 像素的人脸跳过,过滤微小噪声

maxSize  超过尺寸的物体直接无视

3. opencv   四舍五入取整

cvRound(double radius);

4. 画椭圆、椭圆弧

ellipse(

        cv::Mat imgSrc,             //在imgSrc 上画  

        cv::Point center,                    // 中心坐标

        cv::Size size,                        // 椭圆的长半轴 短半轴

        double angle,                        // 旋转角度   

        double startAngle,                // 圆弧起始角度

        doble endAngle,                //圆弧终止角度 

        const cv::Scalar& color,                //椭圆颜色

        int thickness = 1,           // 线条宽度

        int lineType = LINE_8,        // 线条类型

        int shift = 0                // 坐标小数位数

);

5. circle

circle(

        cv::Mat imgSrc,    // 在imgSrc上画

        cv::Point center,        // 中心坐标

        int radius,        // 半径

        const cv::Scalar& color,    //颜色

        int tickness = 1,        // 线宽

        int lineType = cv::LINE_8,        // 线类型

        int shift = 0        // 小数位数

);

// 初始化级联分类器
CascadeClassifier face_detector;
CascadeClassifier eye_detector;

string fDetectorModelPath = "haarcascade_frontface_alt.xml";
string eDetectorModelPAth = "haarcascade_eye_tree_eyeglasses.xml";

face_detector.load(fDetectorModelPath);
eye_detector.load(eDetectorModelPath;

// 图片预处理   彩色转灰色
Mat imgSrc = myImg;
Mat imgGray;
cvtColor(imgSrc, imgGray, COLOR_RGB2GRAY);
equalizeHist(imgGray, imgGray);   // 直方图均衡化   增强单通道灰度图像对比度  
                                    减少颜色对人脸识别造成的干扰

// 执行多尺度人脸检测
vector<Rect> faces;
face_detector.detectMultiScale(imgGray, faces, 1.1, 3, 0| CASCADE_SCALE_IMAGE, Size(30, 30));

for(int i = 0 ; i < faces.size(); ++i){
    Point center = Point(
        faces[i].x + faces[i].width/2.0,
        faces[i].y + faces[i].height/2.0
    );

    ellipse(imgSrc, center, Size(faces[i].size()), 0, 0, 360, Scalar(225,0,255), 4 , 8 , 0);

    Mat faceROI = imgGray(faces[i]);
    vector<Rect> eyes; 
    eye_detector(facesROI, eyes, 1.1, 3, 0 | CASCADE_SCALE_IMAGE, Size(30,30));
    for(int j = 0; j < eyes.size(); ++j){
        Point eye_center = Point(
            faces[i].x + eyes[j].x + eyes[j].width/2.0,
            faces[i].y + eyes[j].y + eyes[j].height/2.0
        )
        
        int radius = (eyes[j].width + eyes[j].height)*0.25;        

        circle(imgSrc, eye_center, radius, Scalar(225,0,225), 4 , 8 , 0);
    }
}

QImage img = QImage((const unsigned char*)imgSrc.data, imgSrc.cols, imgSrc.rows, static_cast<int>(imgSrc.step), QImage::Format_RGB888);

face.h

#ifndef FACE_H
#define FACE_H

#include <QWidget>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;
namespace Ui {
class Face;
}

class Face : public QWidget
{
    Q_OBJECT

public:
    explicit Face(QWidget *parent = nullptr);
    ~Face();

    void initmainwindow();
    void imgShow();
    void imgProc();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Face *ui;

    Mat myImg;
    QImage myQImg;
};

#endif // FACE_H

face.cpp

#include "face.h"
#include "ui_face.h"

Face::Face(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Face)
{
    ui->setupUi(this);

    initmainwindow();
}

Face::~Face()
{
    delete ui;
}

void Face::initmainwindow()
{
    QString imgPath = "2.webp";
    Mat imgData = imread(imgPath.toStdString());
    cvtColor(imgData, imgData, COLOR_BGR2RGB);
    myImg = imgData;

    myQImg = QImage((const unsigned char*)imgData.data, imgData.cols, imgData.rows, static_cast<int>(imgData.step), QImage::Format_RGB888);
    imgShow();
}

void Face::imgShow()
{
    ui->label->setPixmap(QPixmap::fromImage(myQImg));
}

void Face::imgProc()
{
    //1.  初始化级联分类器
    CascadeClassifier face_detector;
    CascadeClassifier eye_detector;

    // 人眼模型
    string eDetectorXml = "haarcascade_eye_tree_eyeglasses.xml";
    // 人脸模型
    string fDetectorXml = "haarcascade_frontalface_alt.xml";

    face_detector.load(fDetectorXml);   // 向级联分类器加载 模型
    eye_detector.load(eDetectorXml);

    //2.  图片预处理
    Mat imgSrc = myImg;
    Mat imgGray;
    cvtColor(imgSrc, imgGray, COLOR_RGB2GRAY);  //彩色转灰色
    equalizeHist(imgGray, imgGray);  // 直方图均衡化  增强单通道灰度图像对比度   减少颜色对人脸识别造成的干扰

    //3.  执行多尺度人脸检测
    vector<Rect> faces;
    face_detector.detectMultiScale(imgGray,faces, 1.1, 3, 0|CASCADE_SCALE_IMAGE , Size(30,30));     // 

    for(int i = 0; i < faces.size() ; ++i){
        Point center = Point(faces[i].x + faces[i].width/2.0, faces[i].y + faces[i].height/2.0);
        ellipse(imgSrc,center,Size(faces[i].size()),0, 0, 360,Scalar(255,0,255),4,8,0);

        Mat faceROI = imgGray(faces[i]);

        //  人眼检测
        vector<Rect> eyes;
        eye_detector.detectMultiScale(faceROI,eyes,1.1,3,0|CASCADE_SCALE_IMAGE, Size(30,30));

        for(int j = 0; j <eyes.size(); ++j){

            Point eye_center = Point(
                        faces[i].x + eyes[j].x + eyes[j].width/2.0,
                        faces[i].y + eyes[j].y + eyes[j].height/2.0
            );

            int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);
            circle(imgSrc, eye_center, radius, Scalar(233,233,0),4,8,0);
        }
    }

    myQImg = QImage((const unsigned char*)imgSrc.data, imgSrc.cols, imgSrc.rows, (static_cast<int>(imgSrc.step)), QImage::Format_RGB888);
    imgShow();
}

void Face::on_pushButton_clicked()
{
    imgProc();
}

face.ui

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐