基于QT与百度AI的人脸识别考勤系统实战(附完整源码)

张开发
2026/5/19 10:05:58 15 分钟阅读
基于QT与百度AI的人脸识别考勤系统实战(附完整源码)
1. 项目背景与需求分析最近在给实验室搭建考勤系统时发现市面上的商业解决方案要么太贵要么隐私性存疑。于是决定用QT和百度AI人脸识别接口自己开发一套本地化考勤系统。这个方案特别适合20人以下的小团队成本不到100元只需要一个普通摄像头却能实现专业级的人脸打卡功能。整个系统采用C/S架构分为三个核心模块服务器端运行在Linux系统上负责摄像头数据采集和TCP/IP通信客户端基于QT开发的图形界面实现图像显示和人脸识别交互AI服务通过百度云人脸识别API完成特征比对实测下来这套系统识别准确率能达到98%以上光照条件良好时从开发到部署最快2小时就能跑通。下面我会手把手带你实现每个关键环节文末也会提供完整源码。2. 开发环境搭建2.1 硬件准备清单任意型号USB摄像头推荐罗技C920实测兼容性最好运行Ubuntu 22.04的电脑或虚拟机服务器端安装Windows/Linux的开发机客户端开发用提示虚拟机使用时需要特别注意USB设备直通设置VMware中要勾选连接新的USB设备时自动将其转发到此虚拟机2.2 软件依赖安装服务器端Ubuntusudo apt update sudo apt install -y gcc make v4l-utils cheese libjpeg-dev客户端QT开发环境下载QT 6.4安装包社区版即可安装时勾选以下组件Qt CreatorQt 6.4.0 → MSVC 2019 64-bitDeveloper and Designer Tools → CMake, Ninja验证安装qmake --version # 应输出类似QMake version 3.13. 服务器端开发实战3.1 摄像头驱动开发核心是使用V4L2框架采集视频流关键数据结构如下struct buffer { void *start; size_t length; }; // 初始化摄像头 int camera_init(const char* dev) { int fd open(dev, O_RDWR); if(fd 0) { perror(打开设备失败); return -1; } struct v4l2_capability cap; ioctl(fd, VIDIOC_QUERYCAP, cap); // 设置采集格式 struct v4l2_format fmt {0}; fmt.type V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.width 640; fmt.fmt.pix.height 480; fmt.fmt.pix.pixelformat V4L2_PIX_FMT_MJPEG; ioctl(fd, VIDIOC_S_FMT, fmt); return fd; }常见踩坑点设备权限问题确保当前用户在video组sudo usermod -aG video $USER多摄像头选择通过/dev/video*序号区分格式不支持优先尝试MJPEG格式3.2 TCP服务端实现建立双通道通信模型控制通道端口65431传输指令和状态数据通道端口65432传输视频流关键代码片段// 创建epoll实例 int epfd epoll_create1(0); struct epoll_event ev, events[MAX_EVENTS]; // 添加TCP socket到epoll ev.events EPOLLIN; ev.data.fd sockfd; epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, ev); while(1) { int nfds epoll_wait(epfd, events, MAX_EVENTS, -1); for(int i 0; i nfds; i) { if(events[i].data.fd sockfd) { // 处理新连接 int connfd accept(sockfd, (struct sockaddr*)cliaddr, len); ev.data.fd connfd; epoll_ctl(epfd, EPOLL_CTL_ADD, connfd, ev); } else { // 处理数据 process_data(events[i].data.fd); } } }4. QT客户端开发详解4.1 UI界面设计技巧使用QT Designer快速搭建界面主窗口布局采用QGridLayout视频显示区使用QLabel QPixmap控制按钮组使用QButtonGroup管理关键属性设置// 视频显示标签优化 ui-videoLabel-setAlignment(Qt::AlignCenter); ui-videoLabel-setStyleSheet(background-color: black;); ui-videoLabel-setMinimumSize(640, 480); // 按钮样式美化 QString btnStyle QPushButton { background-color: #4CAF50; border: none; color: white; padding: 8px 16px; border-radius: 4px; }; ui-loginBtn-setStyleSheet(btnStyle);4.2 网络通信模块封装QTcpSocket实现可靠传输class NetworkManager : public QObject { Q_OBJECT public: explicit NetworkManager(QObject *parent nullptr); void connectToServer(const QString ip, quint16 port); void sendFrame(const QByteArray frameData); signals: void frameReceived(QImage image); void errorOccurred(const QString msg); private slots: void onReadyRead(); private: QTcpSocket *socket; qint32 blockSize; };数据分包处理逻辑先发送4字节数据长度网络字节序再发送实际图像数据接收端按相同协议解析5. 百度AI接口集成5.1 申请API密钥登录百度智能云控制台进入人脸识别服务创建应用后获取API Key和Secret Key重要免费版QPS限制为2次/秒适合小规模使用。如需更高并发需要购买套餐。5.2 人脸识别核心实现封装QNetworkAccessManager调用REST APIvoid FaceAPI::searchFace(const QImage image, const QString groupId) { // 转换图像为Base64 QByteArray imageData; QBuffer buffer(imageData); buffer.open(QIODevice::WriteOnly); image.save(buffer, JPEG); // 构造请求体 QJsonObject json; json[image] QString(imageData.toBase64()); json[image_type] BASE64; json[group_id_list] groupId; // 发送请求 QNetworkRequest request; request.setUrl(QUrl(API_ENDPOINT ?access_token accessToken)); request.setHeader(QNetworkRequest::ContentTypeHeader, application/json); networkManager-post(request, QJsonDocument(json).toJson()); }响应数据处理示例void FaceAPI::handleReply(QNetworkReply *reply) { QJsonDocument doc QJsonDocument::fromJson(reply-readAll()); QJsonObject obj doc.object(); if(obj.contains(error_code)) { emit errorOccurred(obj[error_msg].toString()); return; } QJsonArray users obj[result][user_list].toArray(); if(!users.isEmpty()) { QJsonObject user users[0].toObject(); QString userId user[user_id].toString(); double score user[score].toDouble(); if(score 80) { emit faceMatched(userId, score); } } }6. 系统联调与优化6.1 性能优化技巧视频流压缩服务端使用libjpeg-turbo压缩帧tjCompress2(handle, (unsigned char*)frame, width, 0, height, TJPF_RGB, jpegBuf, jpegSize, TJSAMP_420, 75, 0);智能帧率控制无人状态1帧/秒检测到人脸提升到15帧/秒本地缓存策略最近10次打卡记录保存在SQLite6.2 常见问题排查百度API返回222202错误检查图像质量建议分辨率不低于480p确保人脸占比在30%-80%之间客户端卡顿// 在recv槽函数中加入延迟控制 static qint64 lastTime 0; qint64 now QDateTime::currentMSecsSinceEpoch(); if(now - lastTime 33) return; // 30fps控制 lastTime now;跨平台兼容性问题Windows下路径使用双反斜杠Linux下检查/dev/video*权限7. 进阶功能扩展7.1 考勤报表生成使用QChart实现可视化QBarSeries *series new QBarSeries(); QBarSet *set new QBarSet(打卡统计); *set morningCount afternoonCount eveningCount; series-append(set); QChart *chart new QChart(); chart-addSeries(series); chart-setTitle(月度考勤统计); chart-setAnimationOptions(QChart::SeriesAnimations); QChartView *chartView new QChartView(chart); chartView-setRenderHint(QPainter::Antialiasing);7.2 活体检测增强集成百度活体检测APIjson[face_field] quality,faceliveness; json[liveness_control] NORMAL;响应数据解析double liveness result[face_liveness].toDouble(); if(liveness 0.8) { emit livenessCheckFailed(); }7.3 多语言支持使用QT Linguist工具在代码中用tr()包裹字符串QMessageBox::information(this, tr(Success), tr(Attendance recorded));生成TS文件lupdate project.pro -ts zh_CN.ts en_US.ts用Linguist编辑翻译发布QM文件lrelease *.ts8. 完整项目部署指南服务端部署gcc server.c -o server -ljpeg -lv4l2 nohup ./server server.log 21 客户端打包Windows使用windeployqt工具windeployqt --compiler-runtime attendance.exeLinux制作AppImage包linuxdeployqt attendance.desktop -appimage开机自启动systemd服务配置示例[Unit] DescriptionAttendance Server Afternetwork.target [Service] ExecStart/usr/local/bin/attendance_server Restartalways Userattendance [Install] WantedBymulti-user.target项目源码已托管在GitCode包含完整文档和示例配置文件。在实际部署时建议先在内网测试环境运行24小时验证稳定性再迁移到生产环境。

更多文章