Sven.Zhang 发表于 2025-2-9 23:47:00

基于行空板K10平台的人脸考勤系统

本帖最后由 Sven.Zhang 于 2025-2-9 23:50 编辑

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

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

三、行空板K10介绍      
行空板K10是一款专为快速体验和学习人工智能而设计的开发学习板,100%采用国产芯片,知识产权自主可控,符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源,教学过程中无需额外连接其他设备,便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等人工智能项目。
https://makelogimg.dfrobot.com.cn/makelog/5ffdbb97bddfc41c32938880/9cc6e9fb1d20f8cbbb82e0680958c58b.png
四、接口&器件说明
https://makelogimg.dfrobot.com.cn/makelog/5ffdbb97bddfc41c32938880/857035a2d10e3ef1ac1a58c58b063f9f.png
五、项目原理及程序流程图项目原理
(1)通过人脸识别写入数据,然后进行上下班的考勤签到;
(2)实现的技术内容包含人脸识别、语音识别、机器学习等等;
(3)实时显示环境的温湿度信息和光照强度信息在屏幕上。
流程图
https://makelogimg.dfrobot.com.cn/makelog/5ffdbb97bddfc41c32938880/2aeb66c42eaf632ff0d86cae771f7370.png
六、项目实现过程
https://makelogimg.dfrobot.com.cn/makelog/5ffdbb97bddfc41c32938880/5b3594e1d7c0bfc21d3321a961fede3a.png
程序截图
https://makelogimg.dfrobot.com.cn/makelog/5ffdbb97bddfc41c32938880/eb192f91c0a639fac8eae183d0fd95be.pnghttps://makelogimg.dfrobot.com.cn/makelog/5ffdbb97bddfc41c32938880/02d15dc8fd3749b0803702bcdd861163.pnghttps://makelogimg.dfrobot.com.cn/makelog/5ffdbb97bddfc41c32938880/831ab8506dfa8ac0136a7a978cace77c.png
主程序
https://makelogimg.dfrobot.com.cn/makelog/5ffdbb97bddfc41c32938880/3a59db2a7d9895eb8bfca040a5ba65f8.pnghttps://makelogimg.dfrobot.com.cn/makelog/5ffdbb97bddfc41c32938880/1137c7e8ff82efdb7a8905696e8a8929.png
七、项目制作心得

本项目制作的背景是基于目前人脸识别领域,可以通过这个系统实现上下班的打卡,学校员工签到,或者是学生签到等等,可以很好的提高考勤的准确率和效率。
调试照片
https://makelogimg.dfrobot.com.cn/makelog/5ffdbb97bddfc41c32938880/5f019913e1d5e3f34891913f70de07cd.jpghttps://makelogimg.dfrobot.com.cn/makelog/5ffdbb97bddfc41c32938880/509c166feb78a7ec400c555fb73957b2.jpg

本次项目制作也是了解了行空板K10的很多硬件资源,包括温湿度传感器、光照传感器、以及ESP32主控制器、还有WIFI模块、蓝牙模块等等,后续还会继续基于相关的硬件进行其他项目的开发。
https://www.bilibili.com/video/BV172NDeGEyP/?spm_id_from=333.1387.homepage.video_card.click&vd_source=36a5e80924b86c1da5bda6a818519b7f
/*!
* MindPlus
* esp32s3bit
*
*/
#include "asr.h"
#include <SimpleList.h>
#include "unihiker_k10.h"
#include "AIRecognition.h"
#include "arduino_image_cache.h"

// 动态变量
volatile float   mind_n_KaoQin, mind_n_XueXiRenLian, mind_n_ID;
SimpleList<String> mind_l_KaoQinJiLu;
// 函数声明
void DF_ShiBieRenLian();
void onButtonAPressed();
void onButtonBPressed();
// 创建对象
UNIHIKER_K10k10;
uint8_t       screen_dir=2;
AIRecognition ai;
ASR         asr;
AHT20         aht20;


// 主程序开始
void setup() {
      k10.begin();
      k10.initScreen(screen_dir);
      ai.initAi();
      k10.initBgCamerImage();
      k10.setBgCamerImage(false);
      k10.creatCanvas();
      ai.switchAiMode(ai.NoMode);
      asr.asrInit(CONTINUOUS, CN_MODE, 6000);
      while(asr._asrState == 0){delay(100);}
      asr.setAsrSpeed(2);
      k10.buttonA->setPressedCallback(onButtonAPressed);
      k10.buttonB->setPressedCallback(onButtonBPressed);
      k10.setBgCamerImage(true);
      ai.switchAiMode(ai.Face);
      asr.addASRCommand(0+1, "kao qin");
      mind_l_KaoQinJiLu.clear();
      mind_n_KaoQin = 0;
      mind_n_XueXiRenLian = 0;
}
void loop() {
      k10.canvas->canvasClear();
      k10.canvas->canvasText(aht20.getData(AHT20::eAHT20TempC), 8, 0xFF0000);
      k10.canvas->canvasText(aht20.getData(AHT20::eAHT20HumiRH), 9, 0xFF0000);
      k10.canvas->canvasText(k10.readALS(), 10, 0xFF0000);
      k10.canvas->canvasText("直接识别", 11, 0x0000FF);
      k10.canvas->canvasText("人脸签到", 12, 0x0000FF);
      k10.canvas->canvasText("学习人脸请按A键", 13, 0x0000FF);
      k10.canvas->updateCanvas();
      if ((mind_n_XueXiRenLian==1)) {
                ai.sendFaceCmd(ENROLL);
      }
      if ((ai.isDetectContent(AIRecognition::Face) && (mind_n_XueXiRenLian==0))) {
                DF_ShiBieRenLian();
      }
      if (asr.isWakeUp()) {
                if (asr.isDetectCmdID(0+1)) {
                        mind_n_KaoQin = (random(1, mind_l_KaoQinJiLu.size()+1));
                        k10.setScreenBackground(0xFFFFFF);
                        if ((mind_n_KaoQin==1)) {
                              k10.canvas->canvasDrawBitmap(0,0,100,100,image_data1);
                        }
                        if ((mind_n_KaoQin==2)) {
                              k10.canvas->canvasDrawBitmap(0,0,100,100,image_data2);
                        }
                        if ((mind_n_KaoQin==3)) {
                              k10.canvas->canvasDrawBitmap(0,0,100,100,image_data3);
                        }
                        if ((mind_n_KaoQin==4)) {
                              k10.canvas->canvasDrawBitmap(0,0,100,100,image_data4);
                        }
                        if ((mind_n_KaoQin==5)) {
                              k10.canvas->canvasDrawBitmap(0,0,100,100,image_data5);
                        }
                        k10.canvas->canvasText((String(mind_l_KaoQinJiLu) + String("汇报项目")), 8, 0x0000FF);
                        k10.canvas->updateCanvas();
                        asr.speak((String(mind_l_KaoQinJiLu) + String("汇报项目")));
                        delay(3000);
                }
      }
}


// 自定义函数
void DF_ShiBieRenLian() {
      ai.sendFaceCmd(RECOGNIZE);
      while (!ai.isRecognized()) {}
      mind_n_ID = ai.getRecognitionID();
      k10.canvas->canvasText((String("人脸ID:") + String(mind_n_ID)), 1, 0x0000FF);
      k10.canvas->updateCanvas();
      if ((mind_n_ID==-1)) {
                k10.rgb->write(-1, 0xFF0000);
                asr.speak("请重新学习人脸");
      }
      else {
                if ((mind_n_ID==1)) {
                        k10.rgb->write(-1, 0x00FF00);
                        asr.speak("李超已考勤!");
                        if ((!mind_l_KaoQinJiLu.contains("李超"))) {
                              mind_l_KaoQinJiLu.push_back("李超");
                        }
                }
                if ((mind_n_ID==2)) {
                        k10.rgb->write(-1, 0x00FF00);
                        asr.speak("王强已考勤!");
                        if ((!mind_l_KaoQinJiLu.contains("王强"))) {
                              mind_l_KaoQinJiLu.push_back("王强");
                        }
                }
                if ((mind_n_ID==3)) {
                        k10.rgb->write(-1, 0x00FF00);
                        asr.speak("张敏已考勤!");
                        if ((!mind_l_KaoQinJiLu.contains("张敏"))) {
                              mind_l_KaoQinJiLu.push_back("张敏");
                        }
                }
                if ((mind_n_ID==4)) {
                        k10.rgb->write(-1, 0x00FF00);
                        asr.speak("罗龙已考勤!");
                        if ((!mind_l_KaoQinJiLu.contains("罗龙"))) {
                              mind_l_KaoQinJiLu.push_back("罗龙");
                        }
                }
                if ((mind_n_ID==5)) {
                        k10.rgb->write(-1, 0x00FF00);
                        asr.speak("林敏已考勤!");
                        if ((!mind_l_KaoQinJiLu.contains("林敏"))) {
                              mind_l_KaoQinJiLu.push_back("林敏");
                        }
                }
      }
      delay(2000);
      k10.rgb->write(-1, 0x000000);
}

// 事件回调函数
void onButtonAPressed() {
      k10.rgb->write(-1, 0xFFFF00);
      mind_n_XueXiRenLian = 1;
      delay(2000);
      mind_n_XueXiRenLian = 0;
      asr.speak("已完****脸学习!");
      k10.rgb->write(-1, 0x000000);
}
void onButtonBPressed() {
      k10.rgb->write(-1, 0x0000FF);
      ai.sendFaceCmd(DELETEALL);
      delay(1000);
      k10.rgb->write(-1, 0x000000);
}



页: [1]
查看完整版本: 基于行空板K10平台的人脸考勤系统