一、项目概述
1.1 项目目标
本项目旨在开发一个基于 STM32 系列微控制器的嵌入式考勤系统,结合 OpenCV 和 Qt 实现自动化考勤管理。系统通过摄像头实时捕捉并识别人脸图像,自动记录考勤信息。OpenCV 将用于图像处理和人脸识别,Qt 将用于开发跨平台图形用户界面(GUI),SQLite 作为轻量级数据库用于存储考勤记录。C++ 是主要的编程语言,STM32 负责系统控制和数据处理。
1.2 问题与价值
传统的考勤方式,如打卡机或人工登记,存在效率低、易出错、管理难度大等问题。通过开发嵌入式考勤系统,可以实现以下价值:
-
自动化考勤:系统能够自动识别和记录人员的出勤情况,减少人工干预,提高效率。
-
数据安全与可靠:通过 SQLite 数据库确保数据存储的安全性和易管理性。
-
跨平台支持:Qt 提供跨平台 GUI,使得系统可以在多种操作系统上运行,如 Linux、Windows、macOS 等。
-
低成本实现:使用 STM32 系列微控制器和开源技术,降低开发和维护成本。
二、系统架构
2.1 系统架构设计
本嵌入式考勤系统的架构包括以下几个主要部分:
-
STM32 微控制器:负责系统的核心控制和数据处理。
-
摄像头模块:用于实时捕捉人员的面部图像。
-
图像处理模块:使用 OpenCV 进行图像预处理和人脸识别。
-
图形用户界面(GUI):基于 Qt 提供用户友好的交互界面。
-
数据库模块:使用 SQLite 存储和管理考勤记录。
-
通信模块(可选):通过 Wi-Fi、蓝牙或其他通信方式进行远程数据传输和管理。
2.2 系统架构图
以下是系统架构的示意图,展示了各个组件之间的交互关系:
捕捉图像 人脸识别 显示考勤信息 存储考勤记录 控制 数据传输 摄像头模块 图像处理模块 图形用户界面 数据库模块 STM32 微控制器 通信模块
三、环境搭建
3.1 所需环境
3.1.1 硬件环境
-
STM32 系列微控制器(如 STM32F4 或 STM32H7 系列)
-
摄像头模块(可以选择 OV7670 或其他兼容的摄像头模块)
-
电源、存储设备(如 SD 卡模块)
3.1.2 软件环境
-
STM32CubeMX:用于 STM32 微控制器的配置和代码生成工具。
-
STM32CubeIDE:集成开发环境(IDE),用于编写和调试嵌入式代码。
-
OpenCV:用于图像处理和人脸识别(在主机端运行)。
-
Qt:用于开发跨平台 GUI 应用。
-
SQLite:用于存储考勤记录的轻量级数据库。
-
C++ 编译器(如 GCC):用于编译 C++ 代码。
-
Python(可选):用于开发中的辅助脚本和工具。
3.2 环境安装与配置
3.2.1 STM32CubeMX 和 STM32CubeIDE 安装
-
从 STMicroelectronics 官方网站下载并安装 STM32CubeMX 和 STM32CubeIDE。
-
使用 STM32CubeMX 配置 STM32 微控制器的时钟、引脚、外设(如摄像头接口、串口通信等)。
-
生成代码并在 STM32CubeIDE 中打开项目。
3.2.2 摄像头模块配置
-
连接摄像头模块到 STM32 微控制器的适当接口(如 DCMI 接口)。
-
在 STM32CubeMX 中启用 DCMI(数字摄像机接口)外设,并配置相关引脚和时钟源。
-
配置 DMA(直接存储器访问)以加快图像数据的传输速度,确保图像数据可以及时传输到内存中进行处理。
-
在 STM32CubeIDE 中编写代码,初始化摄像头模块并捕捉图像。可以使用 HAL 库提供的 API 函数来控制 DCMI 和 DMA。
3.2.3 安装 OpenCV 和 Qt
由于 STM32 本身的计算能力有限,图像处理和人脸识别的部分通常会在主机端(如 PC)运行。因此,我们需要在主机端安装 OpenCV 和 Qt。
3.2.3.1 安装 OpenCV
-
更新系统:
bashsudo apt-get updatesudo apt-get upgrade
-
安装 OpenCV 依赖库:
bashsudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
-
下载并编译 OpenCV:
bashgit clone https://github.com/opencv/opencv.git cd opencv mkdir build cd build cmake .. make -j4 sudo make install sudo ldconfig
3.2.3.2 安装 Qt
-
安装 Qt 开发环境:
bashsudo apt-get install qt5-default
-
测试 Qt 安装:
bashqtcreator
如果 Qt Creator 启动成功,则说明安装完成。
3.2.4 配置 SQLite
-
在主机端或 ARM 设备上安装 SQLite:
bashsudo apt-get install sqlite3 libsqlite3-dev
-
在 Qt 项目中添加 SQLite 支持:
在
pro
文件中添加以下内容:bashQT += sql
-
在代码中实现 SQLite 数据库的初始化、表的创建和数据的插入操作。
3.3 示范代码
以下是 STM32 微控制器与主机端的通信示范代码,以及主机端使用 OpenCV 进行图像处理和人脸识别的代码示例。
3.3.1 STM32 端代码(捕捉图像并传输)
cpp
#include "main.h"
#include "dcmi.h"
#include "dma.h"
#include "usart.h"
// 初始化摄像头和其他外设
void System_Init(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_DCMI_Init();
MX_USART2_UART_Init();
}
// 捕捉图像并通过串口发送到主机
void Capture_And_Transmit(void) {
uint8_t image_buffer[IMAGE_SIZE];
// 启动 DCMI 捕获
HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)image_buffer, IMAGE_SIZE / 4);
// 等待图像捕获完成
HAL_DCMI_Stop(&hdcmi);
// 通过串口发送图像数据到主机
HAL_UART_Transmit(&huart2, image_buffer, IMAGE_SIZE, HAL_MAX_DELAY);
}
int main(void) {
System_Init();
while (1) {
Capture_And_Transmit();
HAL_Delay(1000); // 延时1秒
}
}
3.3.2 主机端代码(使用 OpenCV 和 Qt 进行图像处理)
cpp
#include <opencv2/opencv.hpp>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QDebug>
void processImage(const cv::Mat& image) {
// 使用 OpenCV 进行图像处理和人脸识别
cv::CascadeClassifier face_cascade;
face_cascade.load("haarcascade_frontalface_default.xml");
std::vector<cv::Rect> faces;
face_cascade.detectMultiScale(image, faces);
for (auto& face : faces) {
cv::rectangle(image, face, cv::Scalar(255, 0, 0), 2);
}
// 显示图像
cv::imshow("Face Detection", image);
cv::waitKey(0);
}
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QMainWindow window;
// 连接到 SQLite 数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("attendance.db");
if (!db.open()) {
qDebug() << "无法连接到数据库!";
return -1;
}
// 创建考勤记录表(如果不存在)
QSqlQuery query;
query.exec("CREATE TABLE IF NOT EXISTS attendance ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name TEXT, "
"timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)");
// 假设从 STM32 通过串口接收到图像数据
cv::Mat received_image = cv::imread("received_image.jpg", cv::IMREAD_GRAYSCALE);
if (!received_image.empty()) {
// 处理图像并进行人脸识别
processImage(received_image);
// 假设识别到了某个用户
QString recognizedUser = "John Doe"; // 这里可以根据实际情况从识别结果中获取名字
// 将考勤记录插入数据库
query.prepare("INSERT INTO attendance (name) VALUES (:name)");
query.bindValue(":name", recognizedUser);
if (!query.exec()) {
qDebug() << "插入考勤记录失败:" << query.lastError();
} else {
qDebug() << "考勤记录已插入数据库";
}
} else {
qDebug() << "接收到的图像为空,无法进行处理";
}
window.show();
return app.exec();
}
3.4 关键代码解析
3.4.1 STM32 端代码解析
-
System_Init(): 该函数用于初始化 STM32 微控制器的各种外设,包括 DCMI(数字摄像机接口)、DMA、UART(串口)等。
-
Capture_And_Transmit(): 该函数首先通过 DCMI 和 DMA 捕获图像数据,并将其存入图像缓冲区。然后,通过 UART 将图像数据发送到主机端。
-
HAL_Delay(1000): 简单的延时函数,用于模拟每秒捕获一次图像。
3.4.2 主机端代码解析
-
processImage(): 该函数使用 OpenCV 加载的 Haar 特征分类器对图像进行人脸检测,并在检测到的人脸区域绘制矩形框。
-
QSqlDatabase: 该类用于连接 SQLite 数据库,并执行 SQL 查询。主要用于存储和管理考勤记录。
-
QSqlQuery: 用于执行 SQL 查询,包括创建表、插入数据等操作。
-
cv::Mat: OpenCV 中用于存储图像数据的矩阵对象。
cv::imread()
用于读取图像文件,cv::imshow()
用于显示图像。 -
QApplication 和 QMainWindow: 用于创建和管理 Qt 应用程序的主窗口。
四、项目总结
4.1 主要功能
本项目实现了一个基于 STM32 微控制器的嵌入式考勤系统,结合 OpenCV 和 Qt 实现了以下功能:
-
图像捕捉:通过 STM32 微控制器和摄像头模块实时捕捉图像。
-
图像处理与人脸识别:使用 OpenCV 在主机端进行图像处理与人脸识别。
-
考勤记录存储:使用 SQLite 数据库存储识别到的考勤记录。
-
用户界面:使用 Qt 提供了跨平台的图形用户界面,方便用户查看考勤