#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_pca;
Ptr<FaceRecognizer> model_lbph;
Ptr<FaceRecognizer> model_fisher;
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();
ui->tabWidget->tabBar()->setStyle(new CustomTabStyle);
ui->tabWidget->setCurrentIndex(0);
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()));//打开在副页的摄像头画面
connect(ui->query_button,SIGNAL(clicked()),this,SLOT(queryButtonClicked()));
}
int Predict(Mat src_image) //识别图片
{
Mat face_test;
int predict = -1;
//截取的ROI人脸尺寸调整
if (src_image.rows >= 120)
{
//改变图像大小,使用双线性差值
resize(src_image, face_test, Size(92, 112));
}
//判断是否正确检测ROI
if (!face_test.empty())
{
double pre=(model_pca->predict(face_test)+model_lbph->predict(face_test)+model_fisher->predict(face_test))/3;
//测试图像应该是灰度图
predict = qRound(pre);
}
cout << predict << endl;//输出预测值
return predict;
}
void MainWindow::ReadFrame_1()
{
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, 1, 0, Size(70, 70), Size(1000, 1000));//找出图像中人脸,并保存在faces数组中
QString b = QString("%1").arg(faces.size());//faces.size()是int型转为string型输出
for (unsigned int i = 0; i < faces.size(); i++)//该循环目的是有几张脸就画几个框
{
rectangle(frame, faces[i], Scalar(255,0,0),1,4, 0);//用来画矩形框的,scalar:框的颜色
}
Mat* pImage_roi = new Mat[faces.size()];//定义人脸数组
Point text_lb;//文本写在的位置
for (unsigned int i = 0; i < faces.size(); i++)
{
pImage_roi[i] = frame_gray(faces[i]); //将所有的脸部保存起来保存灰度化过后的人脸
text_lb = Point(faces[i].x, faces[i].y);
if (pImage_roi[i].empty())
continue;
QString pre_str=QString::number(Predict(pImage_roi[i]));
current_time= QDateTime::currentDateTime();
if(List_number.indexOf(pre_str)!=-1){
str=List_name.at(List_number.indexOf(pre_str));
if(current_time.toTime_t()-employee_last_attendance_time.at(List_number.indexOf(pre_str)).toTime_t()>300){
if(dbconn.open())
{
QSqlQuery query(dbconn);
QString sql_str = "";
QString status_="";
if(current_time.time().hour()>6&¤t_time.time().hour()<=9){
status_="上班打卡";
}else if(current_time.time().hour()>=17&¤t_time.time().hour()<22){
status_="下班打卡";
}else{
status_="异常打卡";
}
QString StrCurrentTime = current_time.toString("yyyy/MM/dd hh:mm:ss.zzz");
qDebug()<<StrCurrentTime;
sql_str += QString("INSERT INTO employee_information.employee_attendance_record(Job_number,name,Attendance_time,status,remarks) VALUES('%1','%2','%3','%4','%5')")
.arg(QString("s"+pre_str),str,StrCurrentTime,status_,"无");
bool flag=query.exec(sql_str);
if(flag){
qDebug()<<"Successful clock in";
//QMessageBox::information(NULL,"Welcome",QString("工号:s"+pre_str+",姓名:"+List_name.at(List_number.indexOf(pre_str))+"考勤成功!"));
QMessageBox *box = new QMessageBox(QMessageBox::Information,"Welcome",QString("工号:s"+pre_str+",姓名:"+List_name.at(List_number.indexOf(pre_str))+"考勤成功!"));
QTimer::singleShot(2000,box,SLOT(accept()));
box->exec();
query.clear();
query.exec(" SELECT Job_number,max(Attendance_time) from employee_details_information natural join employee_attendance_record group by Job_number;");
employee_last_attendance_time.clear();
while (query.next()) {
employee_last_attendance_time.append(query.value(1).toDateTime());
}
}else {
qDebug()<<"Failed to punch in";
}
dbconn.close();
}
}
}else if(!List_number.contains(pre_str)){
str="UNKNOWN";
}
Scalar color = Scalar(0,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);//放入缓存
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
char* ch;
QByteArray ba = str.toLocal8Bit();
ch=ba.data();
putTextZH(frame, ch, text_lb, color, 20);//添加文字
//这里还有一个任务,需要把打卡时间和工号存到表内。
}
delete[]pImage_roi;
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_alt.xml"); //加载分类器
capture.read(frame);//获取摄像头对象
flip(frame, frame, 1);//镜像翻转
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);//转灰度化,减少运算
cascada.detectMultiScale(frame_gray, faces_2, 1.1, 4, 0, Size(70, 70), Size(1000, 1000));//将得到的灰度图存入faces_2数组中,方便下面调用
QImage image = QImage((const uchar*)f
没有合适的资源?快使用搜索试试~ 我知道了~
毕业设计之人脸考勤机的实现,使用了QT+opencv
共14个文件
cpp:5个
h:4个
user:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 42 浏览量
2023-09-03
13:36:42
上传
评论
收藏 23KB ZIP 举报
温馨提示
毕业设计之人脸考勤机的实现,使用了QT+opencv
资源推荐
资源详情
资源评论
收起资源包目录
毕业设计之人脸考勤机的实现,使用了QT+opencv.zip (14个子文件)
opencv_demo-main
mainwindow.h 1KB
opencvdemo.pro 1KB
customtabstyle.cpp 4KB
mysqlquerymodel.cpp 2KB
mysqlquerymodel.h 739B
mainwindow.cpp 29KB
opencvdemo.pro.user.a26028f 22KB
puttext.h 387B
app.ico 4KB
main.cpp 546B
puttext.cpp 4KB
mainwindow.ui 12KB
opencvdemo.pro.user 23KB
customtabstyle.h 463B
共 14 条
- 1
资源评论
c++服务器开发
- 粉丝: 3045
- 资源: 4463
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功