基于SeetaFace的人脸识别考勤系统
集成OpenCV库,实现图像采集和人脸检测功能。实现查询显示人脸数据和考勤数据的功能,从Qt SQL数据库中检索人脸信息和考勤记录,并在服务器端界面上显示。基于Qt框架的客户端和服务器端应用程序将结合OpenCV和SeetaFace库实现人脸检测、识别和管理。使用Qt框架构建服务器端应用程序,利用Qt的网络模块实现接收客户端数据和发送识别结果的功能。将检测到的人脸区域图像保存在Qt的Rect容器中
·
实现方案
基于Qt框架的客户端和服务器端应用程序将结合OpenCV和SeetaFace库实现人脸检测、识别和管理。
客户端应用程序:
使用Qt框架构建客户端应用程序,利用Qt的网络模块实现局域网下的网络通信。
集成OpenCV库,实现图像采集和人脸检测功能。通过摄像头或图像文件采集图像,并使用SeetaFace进行人脸检测。
将检测到的人脸区域图像保存在Qt的Rect容器中,并以固定频率将人脸数据发送到服务器端。
接收服务器端发送的识别结果,并将识别结果显示在客户端界面上。
服务器端应用程序:
使用Qt框架构建服务器端应用程序,利用Qt的网络模块实现接收客户端数据和发送识别结果的功能。
集成SeetaFace模块,实现人脸注册和识别功能。将注册的人脸信息保存到Qt SQL数据库中,并利用SeetaFace进行人脸识别。
接收客户端发送过来的人脸数据,进行人脸识别,并将识别结果发送回客户端。
实现查询显示人脸数据和考勤数据的功能,从Qt SQL数据库中检索人脸信息和考勤记录,并在服务器端界面上显示。
提供管理界面,包括注册人脸、删除人脸、查询考勤记录等功能。
界面设计

客户端部分代码
#include "facedetect.h"
#include "ui_facedetect.h"
using namespace cv;
using namespace std;
FaceDetect::FaceDetect(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::FaceDetect)
{
ui->setupUi(this);
//打开摄像头
cap.open(0);
//启动定时器事件
startTimer(40);
//导入级联分类器
cascade.load("D:/QM/Desktop/FaceDetect/opencv452/etc/haarcascades/haarcascade_frontalface_alt2.xml");
//QTcpSocket当断开连接的时候disconnected信号,连接成功会发送connected
connect(&socket, &QTcpSocket::disconnected, this, &FaceDetect::start_connect);
connect(&socket, &QTcpSocket::connected, this, &FaceDetect::stop_connect);
//定时器连接服务器
connect(&timer, &QTimer::timeout ,this, &FaceDetect::timer_connect);
//启动定时器
timer.start(5000);//每5s钟连接一次,直到连接成功就不在连接
}
FaceDetect::~FaceDetect()
{
delete ui;
}
//采集图像显示在界面上,并绘制矩形框
void FaceDetect::timerEvent(QTimerEvent *e)
{
Mat capImg; //摄像头采集数据
//Mat grayImg; //灰度图像数据
vector<Rect> faceRects; //Rect容器
Rect rect; //矩形框
//没有正常打开摄像头则返回
if(!cap.grab()) return;
//获取一帧数据
cap.read(capImg);
//读取失败则返回
if(capImg.data == nullptr) return;
//转成灰度图像
//cvtColor(capImg, grayImg, COLOR_BGR2GRAY);
//用级联分类器检测人脸数据并将其保存到容器中
cascade.detectMultiScale(capImg, faceRects);
//绘制矩形框
if(faceRects.size() > 0)
{
rect = faceRects.at(0);
rectangle(capImg, rect, Scalar(0,0,127));
}
//转换图像格式并显示在界面上
//cvtColor(capImg, capImg, COLOR_BGR2RGB);
QImage qimg(capImg.data, capImg.cols, capImg.rows, capImg.step1(), QImage::Format_BGR888);
QPixmap qpm = QPixmap::fromImage(qimg);
ui->capView->setPixmap(qpm);
}
void FaceDetect::start_connect()
{
timer.start(5000);
cout << "start connecting" << endl;
}
void FaceDetect::stop_connect()
{
timer.stop();
cout << "stop connecting" << endl;
}
void FaceDetect::timer_connect()
{
socket.connectToHost("192.168.137.120", 6666);
cout << "try connecting" << endl;
}
服务器端部分代码
#include "facedetectserver.h"
#include "ui_facedetectserver.h"
#include<iostream>
using namespace std;
FaceDetectServer::FaceDetectServer(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::FaceDetectServer)
{
ui->setupUi(this);
//QTcpServer当有客户端连会发送newconnection
connect(&server, &QTcpServer::newConnection, this, &FaceDetectServer::accept_client);
//监听,启动服务器
server.listen(QHostAddress::Any, 6666);
}
FaceDetectServer::~FaceDetectServer()
{
delete ui;
}
void FaceDetectServer::accept_client()
{
//获取与客户端通信的套接字
s_socket = server.nextPendingConnection();
//当客户端有数据到达会发送readyRead信号
connect(s_socket, &QTcpSocket::readyRead, this, &FaceDetectServer::read_data);
}
void FaceDetectServer::read_data()
{
//读取所有的数据
QString msg = s_socket->readAll();
string str = msg.toStdString();
cout << str << endl;
}
更多推荐
所有评论(0)