当前位置: 首页 > news >正文

嵌入式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 并显示在界面上。

相关文章:

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

此项目是基于人脸识别的考勤系统开发&#xff0c;包括如下模块&#xff1a; 1、人脸识别考勤系统GUI界面设计&#xff0c;包括&#xff1a; &#xff08;1&#xff09;Qt环境(window环境/linux环境) &#xff1b; &#xff08;2&#xff09;Qt工程创建分析&#xff1b; &am…...

通过阿里云 Milvus 与 PAI 搭建高效的检索增强对话系统

背景介绍 阿里云向量检索服务Milvus版&#xff08;简称阿里云Milvus&#xff09;是一款云上全托管服务&#xff0c;确保了了与开源Milvus的100%兼容性&#xff0c;并支持无缝迁移。在开源版本的基础上增强了可扩展性&#xff0c;能提供大规模 AI 向量数据的相似性检索服务。相…...

评估大语言模型在药物基因组学问答任务中的表现:PGxQA

​这篇文献主要介绍了一个名为PGxQA的资源&#xff0c;用于评估大语言模型&#xff08;LLM&#xff09;在药物基因组学问答任务中的表现。 研究背景 药物基因组学&#xff08;Pharmacogenomics, PGx&#xff09;是精准医学中最有前景的领域之一&#xff0c;通过基因指导的治疗…...

在本地和远程转储域控制器哈希

更多内网知识课前往无问社区查看http://www.wwlib.cn 无凭据 - ntdsutil 如果您没有凭据&#xff0c;但有权访问 DC&#xff0c;则可以使用 lolbin ntdsutil.exe转储 ntds.dit&#xff1a; powershell "ntdsutil.exe ac i ntds ifm create full c:\temp q q" 我们…...

基于SSM+Vue的心理咨询问诊系统+LW示例参考

1.项目介绍 项目角色&#xff1a;管理员、患者&#xff08;普通用户&#xff09;、医师项目模块&#xff1a;医生管理、患者管理、科室管理、咨询管理、预约管理、急救知识、患者病历等测试环境&#xff1a;idea2024、tomcat8.5、maven3、jdk8、nodeV14.16.1、mysql5.7技术栈&…...

基于TMS320X281X/F28335的DSP入门到精通01_如何开始DSP的学习与开发

本部分开始基于《手把手教你学DSP—基于TMS320X281X》&#xff0c;《手把手教你DSP基于MS320F28335 》、《TMS320X281x DSP原理及C程序开发》&#xff0c;另外结合B站视频进行DSP嵌入式的学习。 《手把手教你学DSP—基于TMS320X281X》介绍的相对更为基础和详细&#xff0c;《手…...

Java爬虫获取1688 item_search_img接口详细解析

概述 1688作为中国领先的B2B电商平台&#xff0c;提供了丰富的API接口供开发者获取商品信息。item_search_img接口允许通过图片搜索商品&#xff0c;这对于需要基于图片进行商品查找的应用场景非常有用。本文将详细介绍如何使用Java爬虫技术获取1688的item_search_img接口数据…...

Java 连接 FTP 服务器全解析

Java 连接 FTP 服务器全解析 一、引言 在许多企业级应用和数据处理场景中&#xff0c;与 FTP 服务器进行交互是一项常见且重要的任务。Java 提供了强大的工具和库来实现与 FTP 服务器的连接、文件传输、目录操作等功能。本文将详细介绍如何使用 Java 连接 FTP 服务器&#xf…...

字节跳动C++面试题及参考答案(下)

说说B 树 b + 树 B 树: B 树是一种平衡的多路查找树,它的设计目的是为了减少磁盘 I/O 操作,适用于存储大量的数据并进行高效的查找、插入和删除操作。B 树的节点可以有多个子节点(通常称为多路),每个节点包含多个关键字,关键字之间是有序的。 B 树的结构特点包括:根节点…...

Rabbit MQ知识总结

1.什么是Rabbit MQ&#xff1f; Rabbit MQ是一个开源的消息代理软件&#xff0c;它实现了高级消息队列协议(AMQP); 基本概念 消息&#xff1a;消息是在应用程序之间传递的数据单元。可以是简单的文本信息&#xff0c;可以是复杂的对象。队列&#xff1a;队列是消息的容器&am…...

未来将要被淘汰的编程语言

COBOL - 这是一种非常古老的语言&#xff0c;主要用于大型企业系统和政府机构。随着老一代IT工作人员的退休&#xff0c;COBOL程序员变得越来越少。Fortran - 最初用于科学和工程计算&#xff0c;Fortran在特定领域仍然有其应用&#xff0c;但随着更现代的语言&#xff08;如Py…...

GO环境安装和配置

安装go环境 wget https://go.dev/dl/go1.22.4.linux-amd64.tar.gz -P /usr/local或者去官网下载安装包 tar -xzf go1.23.4.linux-amd64.tar.gz sudo mv go /usr/local export GOROOT/usr/local/go export GOPATH$HOME/go export PATH$PATH:/usr/local/go/bin source ~/.bashr…...

面试题整理(四)

1.Max transition,leakage优化,hold time ,setup time violation修复的顺序是? 答:先把max transition修复掉,如果max transition有violation,意味着其超出了查找表范围之外,所以计算得到的delay都不是很准的。 其次是把setup修复了,因为setup相对来说,需要减少cell…...

mathtype中如何在公式和序号之间加点

1&#xff0c;右编号插入公式 2&#xff0c;打开样式面板&#xff08;ctrlshiftalts&#xff09; 3&#xff0c;选中MTDisplayEquation样式&#xff0c;右击修改 4&#xff0c;点击格式&#xff0c;弹出下拉列表&#xff0c;点击制表位 5&#xff0c;先选中34.67字符&#…...

【电源专题】电源芯片的PG(Power Good)管脚是什么?

在看电源芯片规格书时,你会发现有一些电源芯片有PG管脚。如下ti.com.cn/product/cn/tps56637?qgpn=tps56637规格书所示: 对应的描述是:Open Drain Power Good Indicator, it is asserted low if output voltage is out of PG threshold due to over-voltage, under…...

C/C++圣诞树

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C…...

牛客--求小球落地5次后所经历的路程和第5次反弹的高度,称砝码

求小球落地5次后所经历的路程和第5次反弹的高度 描述 假设有一个小球从 hh 米高度自由落下&#xff0c;我们不考虑真实的物理模型&#xff0c;而是简洁的假定&#xff0c;该小球每次落地后会反弹回原高度的一半&#xff1b;再落下&#xff0c;再反弹&#xff1b;……。 求小球…...

cad学习 day6

平面布置图 文字标注: 材料代码(视口外进行标注) 成品家具(移动家具)、定制家具、洁具、家电电器根据封面设计说明内容进行文字标注sc 缩放代码符号, 打印可以看的清楚 家具尺寸图 家具尺寸标注: 家具尺寸; 过道尺寸; 冰箱、洗衣机、马桶(预览尺寸)D 平面内尺寸置为当前, 视…...

Chrome 浏览器插件获取网页 iframe 中的 window 对象

Chrome 浏览器插件获取网页 iframe 中的 window 对象 前言 之前写了篇《Chrome 浏览器插件获取网页 window 对象》文章&#xff0c;是获取当前页面的 window 对象&#xff0c;但是有些页面是嵌入 iframe 的&#xff0c;特别是系统项目主域一样&#xff0c;那就也需要获取 ifr…...

免费线上签字小程序,开启便捷电子签名

虽如今数字化飞速发展的时代&#xff0c;但线上签名小程序的开发制作却并非易事。需要攻克诸多技术难题&#xff0c;例如确保签名的真实性与唯一性&#xff0c;防止签名被伪造或篡改。 要精准地捕捉用户手写签名的笔迹特征&#xff0c;无论是笔画的粗细、轻重&#xff0c;还是…...

IT运维的365天--021 服务器上的dns设置后不起作用

之前在内网搭建了一个和外网同域名的网站&#xff0c;开发同事今天告诉我&#xff0c;程序调试发现可能服务器不能正常访问自己内网的网站内容。于是&#xff0c;今天的故事开始了。 前面的文章在下面列出&#xff0c;当然不看也问题不大&#xff0c;今天的主题是&#xff1a;…...

深信服企业级数据备份与恢复系统(整机裸机恢复)

概述 深信服企业级数据备份与恢复系统可实现无需搭建目标环境&#xff0c;目标机可以是没有操作系统的物理主机或虚拟机&#xff0c;实现异构环境下的裸机恢复。 深信服企业级数据备份与恢复系统支持的多种连接恢复方式&#xff1a; 1. PXE连接恢复&#xff1a;PXE连接需要做…...

Tool之Excalidraw:Excalidraw(开源的虚拟手绘风格白板)的简介、安装和使用方法、艾米莉应用之详细攻略

Tool之Excalidraw&#xff1a;Excalidraw(开源的虚拟手绘风格白板)的简介、安装和使用方法、艾米莉应用之详细攻略 目录 Excalidraw 简介 1、Excalidraw 的主要特点&#xff1a; Excalidraw 安装和使用方法 1、Excalidraw的安装 T1、使用 npm 安装&#xff1a; T2、使用 …...

OPPO C++面试题及参考答案

五层协议每层包含的协议 在计算机网络的五层协议体系结构&#xff08;自下而上为物理层、数据链路层、网络层、传输层和应用层&#xff09;中&#xff0c;各层包含多种协议。 物理层主要负责在物理介质上传输原始的比特流&#xff0c;包括像 RJ - 45 接口标准等物理接口规范&am…...

Unity中LineRenderer使用MeshCollider方法参考

运行时&#xff0c;如果一个物体不添加Collider组件就没有办法被鼠标点击&#xff0c;LineRenderer由于其Mesh会随着摄像机朝向变化&#xff0c;如果要通过添加MeshCollider来使其能够与鼠标交互&#xff0c;就需要不断同步更新其MeshCollider网格。 代码参考如下&#xff1a; …...

BERT模型入门(1)BERT的基本概念

文章目录 BERT是Bidirectional Encoder Representations from Transformers的首字母简写&#xff0c;中文意思是&#xff1a;Transformer的双向编码器表示。它是谷歌发布的最先进的嵌入模型。BERT在许多NLP任务中提供了更好的结果&#xff0c;如问答、文本生成、句子分类等&…...

致命错误: Class ‘ZipArchive‘ not found

银河麒麟V10处理 本人在安装过程遇到的坑&#xff0c;就是不要使用太低版本的 1、安装cmake 确认是否安装 cmake --version 如果没安装的话按照如下步骤处理下&#xff08;如果想要其他版本点击cmake官网下载&#xff09; wget https://github.com/Kitware/CMake/release…...

二手车交易平台开发:安全与效率的双重挑战

3.1系统体系结构 系统的体系结构非常重要&#xff0c;往往决定了系统的质量和生命周期。针对不同的系统可以采用不同的系统体系结构。本系统为二手车交易平台系统&#xff0c;属于开放式的平台&#xff0c;所以在体系结构中采用B/s。B/s结构抛弃了固定客户端要求&#xff0c;采…...

vector题目

118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 求解题目时候&#xff0c;我们可以将其看作近似的二维数组。 行为vector<vector<int>>,数组的每个数据类型为vector<int>。 列为vector<int>,数组的每个数据类型为int。 通过观察我们可以发现…...

测试测试测试测试测试测试测试测试测试测试

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…...