12.15~12.17学习笔记
/初始化SeetaFace2,fd_setting是人脸检测模型的配置对象,pd_setting加载关键点模型提取 5 个面部关键点:双眼、鼻尖、双嘴角,fr_setting加载特征提取模型。// 获取关键点数量。// 用上面的自定义函数进行格式转换吧opencv读取到的数据转为seeta的图像格式。//关键点检测,并画出5 个面部关键点:双眼、鼻尖、双嘴角。// 使用face_detector-
上一期使用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));}
然后寒假或春招想尝试一下投实习,提前准备一下面试题,巩固一下基础,找到了学习网站
以上就是三天的学习笔记,如有错误请大佬指正。谢谢!!🙏
更多推荐
所有评论(0)