2025-2-9 23:47:00 [显示全部楼层]
245浏览
查看: 245|回复: 0

[K10项目分享] 基于行空板K10平台的人脸考勤系统

[复制链接]
本帖最后由 Sven.Zhang 于 2025-2-9 23:50 编辑

一、系统概述        
本系统旨在利用行空板 K10 强大的运算能力和丰富的接口,结合人脸识别技术,实现公司员工的高效、准确考勤管理。通过该系统,可自动识别员工身份并记录考勤时间,大大提高考勤效率,减少人工统计的繁琐工作和可能出现的错误。

二、硬件部分
行空板 K10:作为核心处理单元,运行人脸识别算法和考勤数据管理程序。
摄像头:用于采集员工面部图像,推荐使用高清 USB 摄像头,确保图像质量清晰,满足人脸识别的精度要求。
显示屏:利用行空板K10自带LCD 显示屏,实时显示考勤结果和操作提示,方便员工确认考勤情况。
网络模块:行空板 K10 支持 Wi-Fi 和以太网连接,通过网络将考勤数据上传至服务器进行存储和管理。

三、行空板K10介绍        
行空板K10是一款专为快速体验和学习人工智能而设计的开发学习板,100%采用国产芯片,知识产权自主可控,符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源,教学过程中无需额外连接其他设备,便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等人工智能项目。

四、接口&器件说明

五、项目原理及程序流程图项目原理
(1)通过人脸识别写入数据,然后进行上下班的考勤签到;
(2)实现的技术内容包含人脸识别、语音识别、机器学习等等;
(3)实时显示环境的温湿度信息和光照强度信息在屏幕上。
流程图

六、项目实现过程

程序截图

主程序

七、项目制作心得

本项目制作的背景是基于目前人脸识别领域,可以通过这个系统实现上下班的打卡,学校员工签到,或者是学生签到等等,可以很好的提高考勤的准确率和效率。
调试照片


本次项目制作也是了解了行空板K10的很多硬件资源,包括温湿度传感器、光照传感器、以及ESP32主控制器、还有WIFI模块、蓝牙模块等等,后续还会继续基于相关的硬件进行其他项目的开发。

  1. /*!
  2. * MindPlus
  3. * esp32s3bit
  4. *
  5. */
  6. #include "asr.h"
  7. #include <SimpleList.h>
  8. #include "unihiker_k10.h"
  9. #include "AIRecognition.h"
  10. #include "Arduino_image_cache.h"
  11. // 动态变量
  12. volatile float     mind_n_KaoQin, mind_n_XueXiRenLian, mind_n_ID;
  13. SimpleList<String> mind_l_KaoQinJiLu;
  14. // 函数声明
  15. void DF_ShiBieRenLian();
  16. void onButtonAPressed();
  17. void onButtonBPressed();
  18. // 创建对象
  19. UNIHIKER_K10  k10;
  20. uint8_t       screen_dir=2;
  21. AIRecognition ai;
  22. ASR           asr;
  23. AHT20         aht20;
  24. // 主程序开始
  25. void setup() {
  26.         k10.begin();
  27.         k10.initScreen(screen_dir);
  28.         ai.initAi();
  29.         k10.initBgCamerImage();
  30.         k10.setBgCamerImage(false);
  31.         k10.creatCanvas();
  32.         ai.switchAiMode(ai.NoMode);
  33.         asr.asrInit(CONTINUOUS, CN_MODE, 6000);
  34.         while(asr._asrState == 0){delay(100);}
  35.         asr.setAsrSpeed(2);
  36.         k10.buttonA->setPressedCallback(onButtonAPressed);
  37.         k10.buttonB->setPressedCallback(onButtonBPressed);
  38.         k10.setBgCamerImage(true);
  39.         ai.switchAiMode(ai.Face);
  40.         asr.addASRCommand(0+1, "kao qin");
  41.         mind_l_KaoQinJiLu.clear();
  42.         mind_n_KaoQin = 0;
  43.         mind_n_XueXiRenLian = 0;
  44. }
  45. void loop() {
  46.         k10.canvas->canvasClear();
  47.         k10.canvas->canvasText(aht20.getData(AHT20::eAHT20TempC), 8, 0xFF0000);
  48.         k10.canvas->canvasText(aht20.getData(AHT20::eAHT20HumiRH), 9, 0xFF0000);
  49.         k10.canvas->canvasText(k10.readALS(), 10, 0xFF0000);
  50.         k10.canvas->canvasText("直接识别", 11, 0x0000FF);
  51.         k10.canvas->canvasText("人脸签到", 12, 0x0000FF);
  52.         k10.canvas->canvasText("学习人脸请按A键", 13, 0x0000FF);
  53.         k10.canvas->updateCanvas();
  54.         if ((mind_n_XueXiRenLian==1)) {
  55.                 ai.sendFaceCmd(ENROLL);
  56.         }
  57.         if ((ai.isDetectContent(AIRecognition::Face) && (mind_n_XueXiRenLian==0))) {
  58.                 DF_ShiBieRenLian();
  59.         }
  60.         if (asr.isWakeUp()) {
  61.                 if (asr.isDetectCmdID(0+1)) {
  62.                         mind_n_KaoQin = (random(1, mind_l_KaoQinJiLu.size()+1));
  63.                         k10.setScreenBackground(0xFFFFFF);
  64.                         if ((mind_n_KaoQin==1)) {
  65.                                 k10.canvas->canvasDrawBitmap(0,0,100,100,image_data1);
  66.                         }
  67.                         if ((mind_n_KaoQin==2)) {
  68.                                 k10.canvas->canvasDrawBitmap(0,0,100,100,image_data2);
  69.                         }
  70.                         if ((mind_n_KaoQin==3)) {
  71.                                 k10.canvas->canvasDrawBitmap(0,0,100,100,image_data3);
  72.                         }
  73.                         if ((mind_n_KaoQin==4)) {
  74.                                 k10.canvas->canvasDrawBitmap(0,0,100,100,image_data4);
  75.                         }
  76.                         if ((mind_n_KaoQin==5)) {
  77.                                 k10.canvas->canvasDrawBitmap(0,0,100,100,image_data5);
  78.                         }
  79.                         k10.canvas->canvasText((String(mind_l_KaoQinJiLu[mind_n_KaoQin-1]) + String("汇报项目")), 8, 0x0000FF);
  80.                         k10.canvas->updateCanvas();
  81.                         asr.speak((String(mind_l_KaoQinJiLu[mind_n_KaoQin-1]) + String("汇报项目")));
  82.                         delay(3000);
  83.                 }
  84.         }
  85. }
  86. // 自定义函数
  87. void DF_ShiBieRenLian() {
  88.         ai.sendFaceCmd(RECOGNIZE);
  89.         while (!ai.isRecognized()) {}
  90.         mind_n_ID = ai.getRecognitionID();
  91.         k10.canvas->canvasText((String("人脸ID:") + String(mind_n_ID)), 1, 0x0000FF);
  92.         k10.canvas->updateCanvas();
  93.         if ((mind_n_ID==-1)) {
  94.                 k10.rgb->write(-1, 0xFF0000);
  95.                 asr.speak("请重新学习人脸");
  96.         }
  97.         else {
  98.                 if ((mind_n_ID==1)) {
  99.                         k10.rgb->write(-1, 0x00FF00);
  100.                         asr.speak("李超已考勤!");
  101.                         if ((!mind_l_KaoQinJiLu.contains("李超"))) {
  102.                                 mind_l_KaoQinJiLu.push_back("李超");
  103.                         }
  104.                 }
  105.                 if ((mind_n_ID==2)) {
  106.                         k10.rgb->write(-1, 0x00FF00);
  107.                         asr.speak("王强已考勤!");
  108.                         if ((!mind_l_KaoQinJiLu.contains("王强"))) {
  109.                                 mind_l_KaoQinJiLu.push_back("王强");
  110.                         }
  111.                 }
  112.                 if ((mind_n_ID==3)) {
  113.                         k10.rgb->write(-1, 0x00FF00);
  114.                         asr.speak("张敏已考勤!");
  115.                         if ((!mind_l_KaoQinJiLu.contains("张敏"))) {
  116.                                 mind_l_KaoQinJiLu.push_back("张敏");
  117.                         }
  118.                 }
  119.                 if ((mind_n_ID==4)) {
  120.                         k10.rgb->write(-1, 0x00FF00);
  121.                         asr.speak("罗龙已考勤!");
  122.                         if ((!mind_l_KaoQinJiLu.contains("罗龙"))) {
  123.                                 mind_l_KaoQinJiLu.push_back("罗龙");
  124.                         }
  125.                 }
  126.                 if ((mind_n_ID==5)) {
  127.                         k10.rgb->write(-1, 0x00FF00);
  128.                         asr.speak("林敏已考勤!");
  129.                         if ((!mind_l_KaoQinJiLu.contains("林敏"))) {
  130.                                 mind_l_KaoQinJiLu.push_back("林敏");
  131.                         }
  132.                 }
  133.         }
  134.         delay(2000);
  135.         k10.rgb->write(-1, 0x000000);
  136. }
  137. // 事件回调函数
  138. void onButtonAPressed() {
  139.         k10.rgb->write(-1, 0xFFFF00);
  140.         mind_n_XueXiRenLian = 1;
  141.         delay(2000);
  142.         mind_n_XueXiRenLian = 0;
  143.         asr.speak("已完****脸学习!");
  144.         k10.rgb->write(-1, 0x000000);
  145. }
  146. void onButtonBPressed() {
  147.         k10.rgb->write(-1, 0x0000FF);
  148.         ai.sendFaceCmd(DELETEALL);
  149.         delay(1000);
  150.         k10.rgb->write(-1, 0x000000);
  151. }
复制代码



基于行空板K10的人脸考勤系统.rar

738.81 KB, 下载次数: 35

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail