上一期使用opencv自带的库来进行人脸识别。这期使用seetaface来进行人脸特征识别特征识别。可以认识到人,然后把人脸数据保存到数据里

首先在pro文件加入所需要库的路径

QT       += core gui widgets multimedia multimediawidgets sql

CONFIG += c++11

INCLUDEPATH += /opt/opencv4-pc/include
INCLUDEPATH += /opt/opencv4-pc/include/opencv4
LIBS += -L/opt/opencv4-pc/lib -lopencv_world

INCLUDEPATH += /usr/local/seetaface2_x86/include
LIBS += -L/usr/local/seetaface2_x86/lib \
        -lSeetaFaceDetector \
        -lSeetaFaceLandmarker \
        -lSeetaFaceRecognizer \
        -lSeetaNet

SOURCES += main.cpp mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui

QMAKE_RPATHDIR += /opt/opencv4-pc/lib
QMAKE_RPATHDIR += /usr/local/seetaface2_x86/lib

然后头文件加入库,以及变量

#include <opencv2/opencv.hpp>
#include <seeta/FaceDetector.h>
#include <seeta/FaceLandmarker.h>
#include <seeta/FaceRecognizer.h>
#include <seeta/Struct.h>

private:

    seeta::FaceDetector *face_detector;
    seeta::FaceLandmarker *face_landmarker;
    seeta::FaceRecognizer *face_recognizer;

在c文件最上面添加模型

#define FD_MODEL "/home/rzroomi/Desktop/Qt/1/model/fd_2_00.dat"
#define PD_MODEL "/home/rzroomi/Desktop/Qt/1/model/pd_2_00_pts5.dat"
#define FR_MODEL "/home/rzroomi/Desktop/Qt/1/model/fr_2_10.dat"

在c文件的MainWindow::MainWindow(QWidget *parent)加入基本的初始化,预加载模型

    ui->setupUi(this);
    initDB();                                //创建数据库
    cap.open(0);                        //打开摄像头
    if(!cap.isOpened()) {
        return;
    }

    //初始化SeetaFace2,fd_setting是人脸检测模型的配置对象,pd_setting加载关键点模型提取 5 个面部关键点:双眼、鼻尖、双嘴角,fr_setting加载特征提取模型。参数就是上面的路径
    seeta::ModelSetting fd_setting(FD_MODEL);
    seeta::ModelSetting pd_setting(PD_MODEL);
    seeta::ModelSetting fr_setting(FR_MODEL);

    face_detector = new seeta::FaceDetector(fd_setting);
    face_landmarker = new seeta::FaceLandmarker(pd_setting);
    face_recognizer = new seeta::FaceRecognizer(fr_setting);

//人脸识别到时特征筛选,最小的人脸要像素80大小
    face_detector->set(seeta::FaceDetector::PROPERTY_MIN_FACE_SIZE, 80);

    // 获取人脸特征数据,并打印出来
    int real_feat_len = face_recognizer->GetExtractFeatureSize();
    qInfo() << "FR模型实际特征长度:" << real_feat_len;
 

    //启动定时器
    startTimer(30);

添加自定义函数用于封装

SeetaImageData MainWindow::mat2seeta(const cv::Mat &mat)
{
    SeetaImageData img;
    img.width = mat.cols;
    img.height = mat.rows;
    img.channels = mat.channels();
    img.data = const_cast<unsigned char*>(mat.data); // 消除const警告
    return img;
}

主要识别功能在定时器里实时检测+识别

void MainWindow::timerEvent(QTimerEvent *e)
{

//读取图像数据,和上一讲同理

    cv::Mat frame;
    cap.read(frame);
    if(frame.empty()) return;

    // 用上面的自定义函数进行格式转换吧opencv读取到的数据转为seeta的图像格式
    seeta::ImageData seeta_img = mat2seeta(frame);

    // 使用face_detector->detect进行人脸检测
    SeetaFaceInfoArray faces = face_detector->detect(seeta_img);

//当检测到,并且有数据
    if(faces.size > 0) 
    {
        SeetaFaceInfo face = faces.data[0];
        //对人脸画矩形框
        cv::rectangle(frame,
                      cv::Rect(face.pos.x, face.pos.y, face.pos.width, face.pos.height),
                      cv::Scalar(255,0,0), 2);

        //关键点检测,并画出5 个面部关键点:双眼、鼻尖、双嘴角
        int pts_num = face_landmarker->number();  // 获取关键点数量
        SeetaPointF *pts = new SeetaPointF[pts_num];
        face_landmarker->mark(seeta_img, face.pos, pts);  // 输出到数组

        // 画关键点(显式cv::Point,解决歧义)
        for(int i=0; i<pts_num; i++) {
            cv::circle(frame,
                       cv::Point(static_cast<int>(pts[i].x), static_cast<int>(pts[i].y)),
                       3, cv::Scalar(0,0,255), -1);
        }
        delete[] pts;  // 释放数组
    }

    // 显示到QLabel
    cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB);

//把seeta格式转为qt里显示的格式,显示在ui里,和上一讲同理
    QImage qimg(frame.data, frame.cols, frame.rows, frame.step1(), QImage::Format_RGB888);
    ui->videolb->setPixmap(QPixmap::fromImage(qimg).scaled(ui->videolb->size(), Qt::KeepAspectRatio));

}

然后寒假或春招想尝试一下投实习,提前准备一下面试题,巩固一下基础,找到了学习网站

https://blog.csdn.net/Ivan804638781/article/details/110454870?sharetype=blogdetail&shareId=110454870&sharerefer=APP&sharesource=2301_80653890&sharefrom=link

以上就是三天的学习笔记,如有错误请大佬指正。谢谢!!🙏

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐