实现方案

基于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;
}

更多推荐