嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目

此项目是基于人脸识别的考勤系统开发包括如下模块:

1、人脸识别考勤系统GUI界面设计,包括:

(1)Qt环境(window环境/linux环境) ;

(2)Qt工程创建分析;

(3) Qt基本组件Qwidget QMainWindow,Qdialog,QLineEdit,Qlabel, QPushButton ;

(4)Qt界面布局,设计人脸识别考勤系统界面搭建;

(5)考勤机界面设计 (考勤默认界面, 数据录入界面,数据查询界面)。

2、考勤机界面逻辑与数据库实现,主要包括:

(1)Qt窗口切换

(2)Qt窗口间数据传递;

(3)人脸识别考勤机数据库及数据表的设计

3、人脸识别算法,主要包括:

(1)人脸识别算法分析及程序开发;

(2)opencv环境搭建;

(3)opencv采集人脸图像的程序开发;

(4)seetface人脸识别算法及程序开发。

4、人脸识别算法与Qt界面结合实现,主要包括:

(1)人脸检测及在Qt界面上的显示程序开发;

(2)人脸特征点提取及程序开发;

(3)人脸跟踪在Qt上显示;

(4)人脸信息采集存入数据库的编程;

(5)Qt线程Qthread应用,通过信号实现数据交换。                                                                                                                                              
5、QT开发环境下的人脸识别考勤系统机整合调试,主要包括:

(1)在线程中处理人脸比对编程;

(2)比对数据写入考勤数据库的程序实现;

(3)在Qt界面显示比对结果并且提示考勤成功的程序开发;

(4)项目优化综合调试。     

下述为QT的UI界面。

 

这里就是我们的代码层级结构了。

我们先看main.c

#include "faceproject.h"#include <QApplication>
#include "seeta/FaceDetector.h" //人脸检测
#include "seeta/FaceRecognizer.h"
#include "seeta/FaceLandmarker.h"
#include "opencv.hpp"
#include <QDebug>
#include "QSqlDatabase"
#include <QSqlQuery>
#include <QSqlError>
using namespace  seeta;
using namespace  cv;int main(int argc, char *argv[])
{QApplication a(argc, argv);qRegisterMetaType<Mat>("Mat");qRegisterMetaType<Mat>("Mat&");//打开数据库QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("./data/user.db");if(!db.open()){qDebug()<<db.lastError().text();}//创建一个表格QString createsql = "create table if not exists user (userid varchar(64) primary key,faceid int,username text, partment text, facename text)";QSqlQuery query ;query.exec(createsql);//创建一个表格createsql = "create table if not exists  userrecord (id integer primary key autoincrement, userid varchar(64), cktime datatime)";if(!query.exec(createsql)){qDebug()<<query.lastError().text();}FaceProject w;w.show();return a.exec();
}

功能解析

  • 程序主框架

    • QApplication 是 Qt 桌面应用程序的核心类,用于管理应用的生命周期。
    • FaceProject w; w.show(); 表示创建了一个名为 FaceProject 的主窗口对象,并将其显示。
  • SeetaFace 初始化

    • seeta::FaceDetector, seeta::FaceRecognizer, 和 seeta::FaceLandmarker 分别是 SeetaFace SDK 提供的三大功能模块,用于人脸检测、识别、和关键点标注。虽然这些模块没有在代码中直接调用,但它们被 #include 引入,表明可能在其他地方会使用。
  • OpenCV 的支持

    • cv::Mat 是 OpenCV 中的图像数据结构。
    • qRegisterMetaType<Mat>("Mat")qRegisterMetaType<Mat>("Mat&")cv::Mat 类型注册到 Qt 的元对象系统中,方便在信号与槽机制中传递 OpenCV 的图像对象。
  • SQLite 数据库操作

    • 打开数据库

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./data/user.db");
  • 打开或创建一个 SQLite 数据库文件,路径为相对路径 ./data/user.db

  • 创建表格

    • user:存储用户的基本信息。

create table if not exists user (userid varchar(64) primary key,faceid int,username text,partment text,facename text
);
  • userid 是用户唯一标识符。
  • faceid 可能存储人脸特征 ID。
  • 其他字段存储用户姓名、部门、和人脸数据文件名等。

userrecord:存储用户的考勤记录。

create table if not exists userrecord (id integer primary key autoincrement,userid varchar(64),cktime datetime
);
  • id 是记录的自增主键。
  • userid 关联用户表的 userid
  • cktime 是记录的时间戳。

错误处理

  • 如果数据库打开失败,输出错误信息:
if(!db.open())
{qDebug()<<db.lastError().text();
}
  • 如果表格创建失败,输出 SQL 错误信息:
if(!query.exec(createsql))
{qDebug()<<query.lastError().text();
}

主窗口启动

  • FaceProject 是一个自定义的类,继承自 QWidget 或其子类。w.show() 表示显示主窗口,return a.exec(); 开始事件循环。

下述就是SeetaFace 人脸识别库的应用的代码段了

seeta::ModelSetting FaceProject::FTSetting = seeta::ModelSetting("./model/fd_2_00.dat",seeta::ModelSetting::CPU,0);

FTSetting 是人脸检测模型的设置,使用 SeetaFace 库加载 fd_2_00.dat 模型,指定使用 CPU 模式。

FaceProject::FaceProject(QWidget *parent): QWidget(parent), ui(new Ui::FaceProject), mFTracker(FTSetting)
{ui->setupUi(this);capture.open(0);if(!capture.isOpened()) {qDebug()<<"open error";}Mat tempImage = imread("./image/background.jpeg"); // 显示的背景tempImage.copyTo(backImage, mark2Image); // 截取除去头像外的背景circ1Image = imread("./image/frontcircle.png");circ2Image = imread("./image/backcircle.png");// 初始化线程--识别(识别完后会收到query信号)mthread = new QThread();connect(this, &FaceProject::sendMat, &mRecognier, &QRecognizer::queryFace);mRecognier.moveToThread(mthread);mthread->start();connect(&mRecognier, &QRecognizer::query, this, &FaceProject::queryResult);startTimer(100); // 启动定时器,每100毫秒执行一次camflag = false;model = new QSqlTableModel();model->setTable("user");model->select();ui->tableView->setModel(model);
}
  • 人脸检测初始化:创建 mFTracker 对象并初始化 SeetaFace 模型(fd_2_00.dat)。
  • 摄像头初始化:使用 OpenCV 打开默认的摄像头设备(capture.open(0))。
  • 图片初始化:加载背景图和两个圆形头像图,用于显示用户头像。
  • 线程和信号连接:初始化识别线程 mthread,并将 sendMat 信号连接到 mRecognier.queryFace 函数,完成异步的人脸识别操作。
QString selectsql = QString("select * from user where faceid=%1").arg(index);
QSqlQuery query;
query.exec(selectsql);
if(query.next()) {QSqlRecord record = query.record();QString numberstr = record.value("userid").toString();QString namestr = record.value("username").toString();QString partstr = record.value("partment").toString();QString facepath = record.value("facename").toString();ui->numberLb->setText(numberstr);ui->nameLb->setText(namestr);ui->partLb->setText(partstr);ui->timeLb->setText(QTime::currentTime().toString("hh:mm:ss"));Mat faceImage = imread(facepath.toUtf8().data());showHeader(faceImage);if (oldid != index && index != -1) {oldid = index;QString insertsql = QString("insert into userrecord(userid, cktime) values('%1','%2')").arg(numberstr).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));if (!query.exec(insertsql)) {qDebug() << query.lastError().text();}}
}
  • 根据检测到的 index 查询数据库中的用户信息(user 表)并显示。
  • 如果找到该用户的记录,会显示用户的 useridusernamepartment 等信息。
  • 将考勤记录插入 userrecord 表中,保存当前时间戳。
void FaceProject::showHeader(Mat &image) {cv::resize(image, image, cv::Size(160, 160));Mat circular;image.copyTo(circular, circ2Image);  // 使用圆形图像遮罩addWeighted(circular, 1, circ1Image, 1, 3, image);  // 将圆形头像图合并到原图QImage image1(image.data, 160, 160, image.step, QImage::Format_RGB888);ui->label_2->setPixmap(QPixmap::fromImage(image1));
}

将用户的头像调整为 160x160 大小,并加上圆形遮罩效果。

void FaceProject::showFaceVideo(Mat &image) {cv::resize(image, image, cv::Size(480, 480));cvtColor(image, image, COLOR_BGR2RGB);  // 转换颜色空间QImage vimage(image.data, 480, 480, image.step, QImage::Format_RGB888);ui->label->setPixmap(QPixmap::fromImage(vimage));
}

将摄像头采集到的视频流调整为 480x480 并显示在界面上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/496835.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UGUI简单动画制作

一、最终效果 UI简单动画制作 二、制作过程 1、打开动画制作窗口 2、新建一个动画 3、给一个对象制作动画 4、创建动画控制器进行不同动画变换控制 5、书写脚本&#xff0c;通过按钮来进行不同动画切换 using System.Collections; using System.Collections.Generic; using U…

Windows Powershell实战指南(未完成)

目前只作简单了解&#xff0c;开始吧。 一、初识Powershell 目标 初步认识 Powershell和其集成环境 Ise&#xff0c;学会基本设置 实验 我们从简单的例子开始&#xff1a;希望你能从控制台和ISE的配置中实现相同的结果。然后按照下面五步进行。 &#xff08;1&#xff09;选…

PyQt实战——实现可视化音频播放器(十三)

系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序入口QMainWindow&#xff08;三&…

Java日志框架:log4j、log4j2、logback

文章目录 配置文件相关1. properties测试 2. XMl使用Dom4j解析XML Log4j与Log4j2日志门面 一、Log4j1.1 Logges1.2 Appenders1.3 Layouts1.4 使用1.5 配置文件详解1.5.1 配置根目录1.5.2 配置日志信息输出目的地Appender1.5.3 输出格式设置 二、Log4j22.1 XML配置文件解析2.2 使…

RustDesk内置ID服务器,Key教程

RustDesk内置ID服务器&#xff0c;Key教程 首先需要准备一个域名&#xff0c;并将其指定到你的 rustdesk 服务器 ip 地址上&#xff0c;这里编译采用的是Github Actions &#xff0c;说白了是就workflows&#xff0c;可以创建一些自动化的工作流程&#xff0c;例如代码的检查&a…

OpenHarmony怎么修改DPI密度值?RK3566鸿蒙开发板演示

本文介绍在开源鸿蒙OpenHarmony系统下&#xff0c;修改DPI密度值的方法&#xff0c;触觉智能Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566四核处理器&#xff0c;Laval鸿蒙社区推荐开发板&#xff0c;已适配全新开源鸿蒙OpenHarmony5.0 Release系统&#xff0c;适…

OCR实践-Table-Transformer

前言 书接上文 OCR实践—PaddleOCR Table-Transformer 与 PubTables-1M table-transformer&#xff0c;来自微软&#xff0c;基于Detr&#xff0c;在PubTables1M 数据集上进行训练&#xff0c;模型是在提出数据集同时的工作&#xff0c; paper PubTables-1M: Towards comp…

常见的邮件协议SMTP和POP3

常见的邮件协议包括SMTP和POP3&#xff0c;SMTP用来发送邮件&#xff0c;POP3用来接收邮件信息。 SMTP SMTP 是一种用于发送电子邮件的协议。它的主要作用是将**电子邮件**从邮件客户端&#xff08;如 Outlook、Thunderbird&#xff09;或邮件服务器发送到接收服务器。 SMTP …

UGUI源码分析 --- UI的更新入口

首先所有的UI组件都是添加到画布&#xff08;Canvas&#xff09;显示的&#xff0c;所以首先要从Canvas入手&#xff0c;通过搜索脚本函数以及使用Profiler查看UI的函数的执行&#xff0c;定位到了willRenderCanvases函数 打开UI的文件夹&#xff0c; 通过搜索willRenderCanvas…

Wend看源码-Java-集合学习(Set)

概述 Wend看源码-Java-集合学习(List)-CSDN博客 在上一篇文章中&#xff0c;我们深入探讨了Java集合框架的父类以及List集合的细节。接下来&#xff0c;本文将重点阐述Java中的Set集合&#xff0c;包括其内部的数据结构以及核心方法的详尽说明。 Set 集合 图1 java-Set类型数据…

双闭环直流调速系统

一 设计要求 1、原始条件 主要参数&#xff1a;直流电机PN 22KW&#xff0c;额定电压UN220V&#xff0c; 额定电流IN106A&#xff0c;nN 1500r/min&#xff0c;电枢绕组电阻Ra 0.11Ω&#xff0c;主电路总电阻R0.32Ω&#xff0c;磁极对数P2&#xff0c; Ks22&#xff0c;GD2…

word无法创建工作文件,检查临时环境变量。

word无法创建工作文件&#xff0c;检查临时环境变量。 word preview版本&#xff0c;关联打开文件出现报错。word无法创建工作文件&#xff0c;检查临时环境变量。 打开注册表&#xff0c;删除键 Word Preview: HKCR\CLSID{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE} PowerPoint …

Excel将混乱的多行做成1列

目标是将数据按从左到右&#xff0c;再从上到下排成一列。 公式法 首先用textjoin函数将文本包起来&#xff0c;做成一个超长文本。 然后用公式 截取文本 Mid(m1,n,3)&#xff0c;意思就是对m1单元格&#xff0c;从第n个字符开始&#xff0c;截取3个字符出来。 这个公式如何自…

深入解析MySQL索引结构:从数组到B+树的演变与优化

前言&#xff1a; 在数据库查询中&#xff0c;索引是一种关键的性能优化工具。然而&#xff0c;索引的失效可能导致查询效率大幅下降。为了更好地理解索引的工作原理及规避其失效&#xff0c;深入了解索引结构的演变过程尤为重要。 MySQL 的索引数据结构从简单到复杂&#xff0…

怎么把多个PDF合并到一起-免费实用PDF编辑处理工具分享

>>更多PDF文件处理应用技巧请前往 96缔盟PDF处理器 主页 查阅&#xff01; 序言 我之前的文章也有介绍过如何使用96缔盟PDF处理器对PDF文件合并或者批量合并的介绍&#xff0c;但是当时是使用DMPDFUtilTool1.0版本进行的&#xff0c;当时的功能尚不完善&#xff0c;还不支…

medical meadow medical flashcards

“medalpaca/medical_meadow_medical_flashcards” 是一个在 Hugging Face 数据集平台上可用的数据集。这个数据集主要面向医学领域&#xff0c;包含了大量的医学知识卡片&#xff0c;这些卡片由医学生创建和更新&#xff0c;旨在帮助学习和记忆重要的医学概念。以下是关于这个…

新品:SA628F39大功率全双工音频传输模块

SA628F39是一款高集成度的8W大功率全双工无线数据语音一体通话模块&#xff0c;专为高效、稳定的远程通信设计。该模块内置高速微控制器、高性能射频芯片、功率放大器、ESD静电保护和硬件看门狗芯片&#xff0c;具备反接保护、过流过压保护和防死机保护等多重安全功能&#xff…

moviepy将图片序列制作成视频并加载字幕 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…

面试突击-JAVA集合类(持续更新...)

前言 这篇文档非常适合面试突击人群&#xff0c;java集合类是面试高频问点&#xff0c;阅读完此文章可以直接应对面试官一切问题&#xff0c;最终吊打面试官。 概览 Java 集合&#xff0c;也叫作容器&#xff0c;主要是由两大接口派生而来&#xff1a;一个是 Collection接口&am…

如何计算相位差

如何计算相位差 假设我们有两个同频率的正弦信号&#xff1a; 这里两个信号的角频率w2πf是相同的&#xff0c;根据同频正弦信号相位差的计算方法&#xff0c;直接用两个信号的相位相减。 再来看利用波形图计算相位差的例子&#xff1a; 另一种计算方式&#xff1a;