嵌入式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
表)并显示。 - 如果找到该用户的记录,会显示用户的
userid
、username
、partment
等信息。 - 将考勤记录插入
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基于人脸识别的考勤系统 项目
此项目是基于人脸识别的考勤系统开发,包括如下模块: 1、人脸识别考勤系统GUI界面设计,包括: (1)Qt环境(window环境/linux环境) ; (2)Qt工程创建分析; &am…...

通过阿里云 Milvus 与 PAI 搭建高效的检索增强对话系统
背景介绍 阿里云向量检索服务Milvus版(简称阿里云Milvus)是一款云上全托管服务,确保了了与开源Milvus的100%兼容性,并支持无缝迁移。在开源版本的基础上增强了可扩展性,能提供大规模 AI 向量数据的相似性检索服务。相…...

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

在本地和远程转储域控制器哈希
更多内网知识课前往无问社区查看http://www.wwlib.cn 无凭据 - ntdsutil 如果您没有凭据,但有权访问 DC,则可以使用 lolbin ntdsutil.exe转储 ntds.dit: powershell "ntdsutil.exe ac i ntds ifm create full c:\temp q q" 我们…...

基于SSM+Vue的心理咨询问诊系统+LW示例参考
1.项目介绍 项目角色:管理员、患者(普通用户)、医师项目模块:医生管理、患者管理、科室管理、咨询管理、预约管理、急救知识、患者病历等测试环境:idea2024、tomcat8.5、maven3、jdk8、nodeV14.16.1、mysql5.7技术栈&…...

基于TMS320X281X/F28335的DSP入门到精通01_如何开始DSP的学习与开发
本部分开始基于《手把手教你学DSP—基于TMS320X281X》,《手把手教你DSP基于MS320F28335 》、《TMS320X281x DSP原理及C程序开发》,另外结合B站视频进行DSP嵌入式的学习。 《手把手教你学DSP—基于TMS320X281X》介绍的相对更为基础和详细,《手…...
Java爬虫获取1688 item_search_img接口详细解析
概述 1688作为中国领先的B2B电商平台,提供了丰富的API接口供开发者获取商品信息。item_search_img接口允许通过图片搜索商品,这对于需要基于图片进行商品查找的应用场景非常有用。本文将详细介绍如何使用Java爬虫技术获取1688的item_search_img接口数据…...
Java 连接 FTP 服务器全解析
Java 连接 FTP 服务器全解析 一、引言 在许多企业级应用和数据处理场景中,与 FTP 服务器进行交互是一项常见且重要的任务。Java 提供了强大的工具和库来实现与 FTP 服务器的连接、文件传输、目录操作等功能。本文将详细介绍如何使用 Java 连接 FTP 服务器…...
字节跳动C++面试题及参考答案(下)
说说B 树 b + 树 B 树: B 树是一种平衡的多路查找树,它的设计目的是为了减少磁盘 I/O 操作,适用于存储大量的数据并进行高效的查找、插入和删除操作。B 树的节点可以有多个子节点(通常称为多路),每个节点包含多个关键字,关键字之间是有序的。 B 树的结构特点包括:根节点…...
Rabbit MQ知识总结
1.什么是Rabbit MQ? Rabbit MQ是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP); 基本概念 消息:消息是在应用程序之间传递的数据单元。可以是简单的文本信息,可以是复杂的对象。队列:队列是消息的容器&am…...
未来将要被淘汰的编程语言
COBOL - 这是一种非常古老的语言,主要用于大型企业系统和政府机构。随着老一代IT工作人员的退休,COBOL程序员变得越来越少。Fortran - 最初用于科学和工程计算,Fortran在特定领域仍然有其应用,但随着更现代的语言(如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,右编号插入公式 2,打开样式面板(ctrlshiftalts) 3,选中MTDisplayEquation样式,右击修改 4,点击格式,弹出下拉列表,点击制表位 5,先选中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 米高度自由落下,我们不考虑真实的物理模型,而是简洁的假定,该小球每次落地后会反弹回原高度的一半;再落下,再反弹;……。 求小球…...
cad学习 day6
平面布置图 文字标注: 材料代码(视口外进行标注) 成品家具(移动家具)、定制家具、洁具、家电电器根据封面设计说明内容进行文字标注sc 缩放代码符号, 打印可以看的清楚 家具尺寸图 家具尺寸标注: 家具尺寸; 过道尺寸; 冰箱、洗衣机、马桶(预览尺寸)D 平面内尺寸置为当前, 视…...
Chrome 浏览器插件获取网页 iframe 中的 window 对象
Chrome 浏览器插件获取网页 iframe 中的 window 对象 前言 之前写了篇《Chrome 浏览器插件获取网页 window 对象》文章,是获取当前页面的 window 对象,但是有些页面是嵌入 iframe 的,特别是系统项目主域一样,那就也需要获取 ifr…...

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

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...