#include "mainwindow.h"
#include "customtabstyle.h"
#include "ui_mainwindow.h"
#include "stdio.h"
#include "puttext.h"
#include <direct.h>
#include <iostream>
#include <vector>
#include <QTextCodec>
#include <QDebug>
#include <QTabBar>
#include <QMessageBox>
#include <QFile>
#include <QDateTime>
#include <fstream>
#include <opencv2/face/facerec.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
using namespace cv::face;
RNG g_rng(12345);
Ptr<FaceRecognizer> model;
QStringList List_number,List_name;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
//初始化数据库,为开启数据库做准备
hostName = "localhost"; // 主机名
dbName = "employee_information"; // 数据库名称
userName = "root"; // 用户名
password = "199827"; // 密码
dbconn = QSqlDatabase::addDatabase("QMYSQL");
dbconn.setHostName(hostName);
dbconn.setDatabaseName(dbName);
dbconn.setUserName(userName);
dbconn.setPassword(password);
ui->setupUi(this);
pic_num=1;
setWindowTitle("人脸考勤系统");
// model = FisherFaceRecognizer::create();
model = LBPHFaceRecognizer::create();
model->read("D:\\OpenCV\\orl\\MyFaceLBPHModel.xml");
// QWidget *Tab2 = new QWidget();
// ui->tabWidget->addTab(Tab2, "考勤记录");
ui->tabWidget->tabBar()->setStyle(new CustomTabStyle);
timer_1=new QTimer(this);timer_2=new QTimer(this);
connect(timer_1,SIGNAL(timeout()),this,SLOT(ReadFrame_1()));
connect(timer_2,SIGNAL(timeout()),this,SLOT(ReadFrame_2()));
connect(ui->uiButton_1, SIGNAL(clicked()), this, SLOT(OpenCameraClicked()));//打开摄像头
connect(ui->uiButton_2, SIGNAL(clicked()), this, SLOT(CloseCameraClicked()));//关闭摄像头
connect(ui->uiButton_3, SIGNAL(clicked()), this, SLOT(FaceStorageClicked()));//保存人脸图像
connect(ui->uiButton_4, SIGNAL(clicked()), this, SLOT(InformationSeveClicked()));//员工信息保存
connect(ui->uiButton_5, SIGNAL(clicked()), this, SLOT(OpenSecondaryCamera()));//打开在副页的摄像头画面
}
int Predict(Mat src_image) //识别图片
{
Mat face_test;
int predict = 0;
//截取的ROI人脸尺寸调整
if (src_image.rows >= 120)
{
//改变图像大小,使用双线性差值
resize(src_image, face_test, Size(92, 112));
}
//判断是否正确检测ROI
if (!face_test.empty())
{
//测试图像应该是灰度图
predict = model->predict(face_test);
}
cout << predict << endl;//输出预测值
return predict;
}
void MainWindow::ReadFrame_1()
{
QDateTime dateTime(QDateTime::currentDateTime());
QString qStrtime = dateTime.toString("YYYY-MM-DD HH:MM:SS");
CascadeClassifier cascada;
cascada.load("D://OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml"); //获取图像帧
capture.read(frame);//获取摄像头对象
flip(frame, frame, 1);//镜像翻转
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);//转灰度化,减少运算
equalizeHist(frame_gray, frame_gray);//变换后的图像进行直方图均值化,处理直方图均衡化,用于提高图像的质量
cascada.detectMultiScale(frame_gray, faces, 1.1, 4, 0, Size(70, 70), Size(1000, 1000));//找出图像中人脸,并保存在faces数组中
QString b = QString("%1").arg(faces.size());//faces.size()是int型转为string型输出
qDebug()<<"检测到人脸个数:"+b;
for (unsigned int i = 0; i < faces.size(); i++)//该循环目的是有几张脸就画几个框
{
rectangle(frame, faces[i], Scalar(255, 0, 0), 2, 8, 0);//用来画矩形框的,scalar:框的颜色
}
Mat* pImage_roi = new Mat[faces.size()];//定义人脸数组
Point text_lb;//文本写在的位置
QString str="";//记录名字
for (unsigned int i = 0; i < faces.size(); i++)
{
pImage_roi[i] = frame_gray(faces[i]); //将所有的脸部保存起来保存灰度化过后的人脸
// cv::resize( pImage_roi[i], face, Size(92, 112),0,0,INTER_LINEAR);
text_lb = Point(faces[i].x, faces[i].y);
if (pImage_roi[i].empty())
continue;
int a=Predict(pImage_roi[i]);
for(int s=0;s<List_number.size();s++){
if(a==List_number[s]){
str=List_name[s];
break;
}else{
str="UNKNOWN";
}
}
// switch (Predict(pImage_roi[i])) //对每张脸都识别
// {
// case 35:str = "张正刚"; break;
// case 36:str = "张正刚"; break;
// case 37:str = "IU"; break;
// case 38:ch = "sunrongxing"; break;
// default: str = "UNKNOWN"; break;
// }
Scalar color = Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));//所取的颜色任意值
rectangle(frame, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), color, 1, 8);//放入缓存
// const char *ch=str.toLocal8Bit().data();
// QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");
// QTextCodec *gbk = QTextCodec::codecForName("GBK");
// QString strUnicode= utf8->toUnicode(str.toLocal8Bit().data());//1.utf-8 -> unicode
// QByteArray gb_bytes= gbk->fromUnicode(strUnicode); //2. unicode -> gbk, 得到QByteArray
// ch=gb_bytes.data();
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
char* ch;
QByteArray ba = str.toLocal8Bit();
ch=ba.data();
putTextZH(frame, ch, Point(100, 100), Scalar(255, 0, 0), 30);//添加文字
//这里还有一个任务,需要把打卡时间和工号存到表内。
//if(dbconn.open())
//{
// qDebug() << "数据库连接成功!";
// QSqlQuery query(dbconn);
// QString sqlStr = "";
// sqlStr += QString("INSERT INTO employee_information.employee_attendance_record(Job_number,name,Attendance_time,status,remarks) VALUES('%1','%2',%3,'%4','%5')")
// .arg();
// query.exec(sqlStr);
// dbconn.close();
//}
//else
//{
// qDebug() << "数据库连接失败!";
// QMessageBox::information(NULL, "Warning", "数据库连接失败!");
// return ;
//}
}
delete[]pImage_roi;
// imshow("face", frame);
// waitKey(200);
/*
//将抓取到的帧,转换为QImage格式,QImage::Format_RGB888使用24位RGB格式(8-8-8)存储图像
//此时没有使用rgbSwapped()交换所有像素的红色和蓝色分量的值,底色偏蓝
QImage image = QImage((const uchar*)frame.data,frame.cols, frame.rows,QImage::Format_RGB888);
//将图片显示到label上
ui->label->setPixmap(QPixmap::fromImage(image));
*/
//将视频显示到label上
QImage image = QImage((const uchar*)frame.data,frame.cols,frame.rows,QImage::Format_RGB888).rgbSwapped();
ui->label->setPixmap(QPixmap::fromImage(image));
}
void MainWindow::ReadFrame_2(){
if(capture.isOpened()){
CascadeClassifier cascada;
cascada.load("D://OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml"); //获�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源介绍】 这个项目属于个人毕业设计高分作品,可用于课程设计、大作业等。 基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip 【备注】 该项目是个人毕设/课设/大作业项目,代码都经过本地调试测试,功能ok才上传,高分作品,可快速上手运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 欢迎下载使用,也欢迎交流学习~
资源推荐
资源详情
资源评论
收起资源包目录
基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip (12个子文件)
说明.md 49B
mainwindow.h 1024B
opencvdemo.pro 1KB
customtabstyle.cpp 4KB
mainwindow.cpp 19KB
puttext.h 387B
app.ico 4KB
main.cpp 695B
puttext.cpp 4KB
mainwindow.ui 10KB
opencvdemo.pro.user 22KB
customtabstyle.h 463B
共 12 条
- 1
资源评论
- m0_606095592024-04-06简直是宝藏资源,实用价值很高,支持!
- Blacklip100862024-02-27资源内容总结地很全面,值得借鉴,对我来说很有用,解决了我的燃眉之急。
- A_Jian_60322024-01-28资源很赞,希望多一些这类资源。z同学的编程之路2024-02-20嗯嗯,您的问题解决了哈?感谢好评,还有问题请私信沟通
- m0_517534232024-01-22资源使用价值高,内容详实,给了我很多新想法,感谢大佬分享~z同学的编程之路2024-02-20不客气,对你有用就行
z同学的编程之路
- 粉丝: 1805
- 资源: 2129
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功