行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板100%采用国产芯片知识产权自主可控符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源教学过程中无需额外连接其他设备便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等AI人工智能项目。主要特点集成摄像头内置算法可进行离线图像检测集成麦克风内置算法可进行离线语音识别集成扬声器内置算法可进行离线语音合成2.8寸彩色屏幕数据展示更清晰集成度高利于教学接口丰富兼容软件多扩展性好主打人工智能模块人脸检测相关说明辅助屏幕显示相关积木LED控制模块知识点行空板 K10 人脸检测一、什么是行空板人脸检测行空板 K10 内置 ESP32-S3 AI 硬件加速 NPU搭配板载摄像头依托unihiker_k10.h内置 AI 视觉库本地离线完成人脸检测不需要联网、不需要云端运算设备单独就能识别画面里是否存在人脸、输出人脸坐标。区别于人脸识别人脸检测只找 “人脸区域”不区分是谁人脸识别会比对人脸特征区分不同人。核心硬件基础主控ESP32-S3 内置 AI 加速器专门处理图像识别算法外设板载前置摄像头实时采集画面输出载体K10 彩色显示屏、RGB 彩灯、扬声器、按键存储TF 卡可保存人脸截图、训练模型。二、核心基础功能1、离线实时检测摄像头持续刷新画面AI 实时框选画面内所有人脸输出人脸左上角、右下角坐标能获取人脸宽度、高度。2、画面可视化标记画布直接绘制红色矩形框把识别到的人脸圈出来直观展示检测结果。3、状态联动反馈检测到人脸 / 无人脸可联动硬件RGB 彩灯有人脸亮绿灯、无人脸亮红灯音频检测到人脸播放提示音屏幕文字实时打印「检测到人脸」「未识别人脸」4、配套拓展功能人脸抓拍检测到人脸自动保存截图到 TF 卡延时计数持续 3 秒检测到人脸再触发动作过滤瞬间路过干扰多人脸识别支持同时识别画面内多张人脸。三、底层运行逻辑摄像头采集图像数据流NPU 硬件加速运行轻量化人脸检测模型算法输出人脸矩形坐标数据程序读取坐标在屏幕画布绘制方框循环持续采集 推理实现实时动态追踪人脸。四、两种编程实现方式Mind方式 1图形化积木新手首选无编译报错扩展库加载「AI 视觉 - 人脸检测」积木逻辑初始化摄像头、AI 人脸检测循环采集画面判断是否检测到人脸分支有人脸→画框、亮绿灯、播放提示音无人脸→清框、红灯优势不用处理库冲突、无多重定义报错课堂教学首选。方式 2C/C 代码进阶自主开发依托unihiker_k10.h内置 AI 接口核心流程初始化摄像头 AI 模块 k10.initAI()循环调用人脸检测函数获取人脸数组判断人脸数量大于 0遍历所有人脸坐标画布绘制矩形框标记人脸联动灯光、音频、存储。五、典型落地应用场景1、人脸门禁提醒装置检测到人脸自动亮绿灯、播放欢迎音效无人时红灯待机可拓展继电器控制门锁。2、课堂人脸考勤记录仪持续检测画面内人脸检测到人脸自动抓拍保存照片到 TF 卡记录到场人员画面。3、桌面智能护眼监测检测人脸距离屏幕过近时屏幕弹出提示文字、蜂鸣器报警提醒保持观看距离。4、智能人体感应灯光识别到人脸自动开启 RGB 氛围灯人脸离开几秒后自动关灯。5、互动趣味装置对准屏幕人脸触发特效、播放音乐人脸消失特效关闭。六、使用优缺点优势完全离线本地运行不用 WiFi、不用物联网平台断网也能用ESP32-S3 硬件 AI 加速画面流畅不卡顿不占用 CPU配套 K10 屏幕、灯光、音频、TF 卡全套硬件拓展简单Mind 图形化 代码双模式零基础、进阶学员都适配接口高度封装不用学习复杂 AI 算法直接调用现成函数。局限仅支持人脸检测原生不自带人脸比对区分不同人如需人脸识别需要额外训练模型光线过暗、侧脸、遮挡口罩会降低识别准确率高帧率连续抓拍会小幅占用内存多 AI 任务人脸 物体识别同时运行会卡顿抓拍图片默认覆盖存储如需多图存档需要自定义命名逻辑。七、实操关键注意事项光线充足暗光环境识别率大幅下降建议室内正常灯光下实验人脸正对摄像头侧脸、低头、口罩遮挡容易漏检硬件初始化顺序必须先k10.begin()、初始化摄像头再开启 AI 人脸检测不要叠加多余图形库TFT_eSPI避免多重定义编译报错循环内减少delay()阻塞延时否则人脸画面卡顿、检测失效抓拍保存照片需提前执行k10.initSDFile()初始化 TF 卡。【花雕动手做】行空板 K10 系列实验之人脸检测的人脸识别门禁提示器实验开源代码// 引入行空板K10综合硬件驱动库封装屏幕、按键、RGB彩灯、摄像头、画布等外设接口#includeunihiker_k10.h// 引入ESP32-S3离线AI视觉库提供人脸录入、人脸比对识别、AI模式切换相关函数#includeAIRecognition.h// 提前声明A/B按键中断回调函数setup绑定按键时编译器可识别函数voidonButtonBPressed();voidonButtonAPressed();// 硬件对象实例化 // 行空板K10主控全局对象所有基础硬件操作均通过该对象调用UNIHIKER_K10 k10;// 屏幕旋转参数2正向正常显示可修改0/1/2/3切换画面翻转uint8_tscreen_dir2;// AI人脸识别专用对象负责人脸模型初始化、录入、比对识别指令下发AIRecognition ai;// 音频播放对象用于识别到家人时播放欢迎提示旋律Music music;// 全局状态标记变量 boolstartRecogFlagfalse;// 人脸识别总开关false待机不识别true开启实时人脸比对boolplayFlagfalse;// 音乐单次播放标记防止loop循环反复重复播放欢迎音乐floatnowFaceID0;// 存储当前识别成功的人脸专属编号ID录入第一张人脸ID1第二张2unsignedlongfaceLostTimer0;// 人脸丢失计时戳记录最后一次识别到人脸的系统时间用于延时缓冲constunsignedlongFACE_KEEP_DELAY3000;// 人脸消失缓冲时长3000ms3秒短暂遮挡不会立刻退出识别/** * brief 统一绘制待机界面函数 * desc 开机、人脸超时退出识别、录入人脸完成后均调用简化重复代码 * 功能清空屏幕、打印操作提示文字、关闭全部RGB氛围灯 */voidshowStandbyUI(){// 清空画布所有原有文字画面k10.canvas-canvasClear();// 绘制红色24号中英文字体标题坐标X0 Y0透明度50开启自动换行k10.canvas-canvasText( 人脸识别门禁,0,0,0xFF0000,k10.canvas-eCNAndENFont24,50,true);// 白色操作指引文字坐标X0 Y35k10.canvas-canvasText(A键录入人脸 B键识别,0,35,0xFFFFFF,k10.canvas-eCNAndENFont24,50,true);// 将画布缓存内容刷新到实体屏幕显示k10.canvas-updateCanvas();// -1代表控制全部RGB灯珠0x000000黑色关闭所有彩灯k10.rgb-write(-1,0x000000);}/** * brief 上电初始化函数仅开机运行1次 * 执行顺序主板硬件初始化→屏幕→AI加速器→摄像头→按键绑定→切换人脸AI模式→加载待机界面 */voidsetup(){// 初始化行空板底层总线、IO、供电等全部硬件k10.begin();// 根据screen_dir参数初始化显示屏驱动k10.initScreen(screen_dir);// 初始化ESP32-S3内置NPU AI硬件加速器加载AI推理底层资源ai.initAi();// 初始化摄像头后台画面渲染功能支持摄像头画面投屏到屏幕k10.initBgCamerImage();// 初始化阶段临时关闭摄像头画面避免画面干扰初始化流程k10.setBgCamerImage(false);// 创建画布缓存绘图先存入缓存再统一刷新消除屏幕闪烁k10.creatCanvas();// 临时切换AI为无识别模式清空上一轮残留AI模型防止模式冲突ai.switchAiMode(ai.NoMode);// 给A、B物理按键绑定按下中断回调函数按键触发不受delay阻塞k10.buttonB-setPressedCallback(onButtonBPressed);k10.buttonA-setPressedCallback(onButtonAPressed);// 开启摄像头实时画面投屏屏幕持续显示镜头取景画面k10.setBgCamerImage(true);// 切换AI工作模式为人脸识别模式同时支持人脸录入人脸特征比对ai.switchAiMode(ai.Face);// 设置RGB彩灯全局亮度round(3)亮度等级低光线柔和不刺眼k10.rgb-brightness(round(3));// 开机完成硬件初始化直接加载待机界面无报警、无识别逻辑showStandbyUI();}/** * brief 主循环函数上电后无限循环执行 * 核心逻辑分待机状态、识别中状态识别中区分「识别到家人」「人脸短暂丢失」「人脸超时消失」三类场景 */voidloop(){// 判断总开关未按下B开启识别直接终止本次循环保持待机界面不做任何识别运算if(!startRecogFlag){return;}// ai.isRecognized()true匹配到已录入的人脸false无人脸/陌生人脸boolhasFaceai.isRecognized();// 获取系统开机至今累计运行毫秒数用于无阻塞计时不卡顿画面unsignedlongnowTimemillis();// 场景1摄像头识别到已录入的合法家人人脸 if(hasFace){faceLostTimernowTime;// 刷新人脸计时戳只要人脸在镜头内就持续重置缓冲倒计时nowFaceIDai.getRecognitionID();// 读取当前匹配到的人脸编号ID// 清空画布擦除上一轮陌生人/待机文字k10.canvas-canvasClear();// 打印当前识别到的人脸ID数字k10.canvas-canvasText(检测人脸 ID:String(nowFaceID),0,0,0x00FF00,k10.canvas-eCNAndENFont24,50,true);// 匹配ID1老爷人脸专属提示if(nowFaceID1.0){k10.canvas-canvasText(欢迎老爷回家,0,40,0x00FF00,k10.canvas-eCNAndENFont24,50,true);k10.rgb-write(-1,0x00FF00);// 全彩灯常亮绿色// 仅第一次识别到人脸播放一次欢迎音乐循环内不会重复播放if(!playFlag){music.playMusic(DADADADUM);playFlagtrue;}}// 匹配ID2小姐人脸专属提示elseif(nowFaceID2.0){k10.canvas-canvasText(欢迎小姐回家,0,40,0x00FF00,k10.canvas-eCNAndENFont24,50,true);k10.rgb-write(-1,0x00FF00);// 全彩灯常亮绿色if(!playFlag){music.playMusic(DADADADUM);playFlagtrue;}}// 刷新画布把欢迎文字显示到屏幕k10.canvas-updateCanvas();}// 场景2摄像头未识别到录入人脸人脸离开/遮挡/陌生人 else{// 判断人脸丢失时长是否小于3秒缓冲阈值if(nowTime-faceLostTimerFACE_KEEP_DELAY){// 3秒内短暂遮挡、转头、挡脸不切换界面直接跳出本次循环保持上一轮欢迎画面return;}// 人脸完全离开镜头超过3秒关闭识别总开关退出识别模式startRecogFlagfalse;playFlagfalse;// 重置音乐标记下次重新识别家人时会再次播放欢迎旋律showStandbyUI();// 调用待机界面函数回到初始安静界面无任何报警提示}}/** * brief A按键按下回调函数执行人脸录入学习功能 * 操作流程显示采集提示→下发录入指令→等待3秒采集人脸特征→提示录入完成→1.2秒后自动切回待机 */voidonButtonAPressed(){k10.canvas-canvasClear();// 蓝色采集提示文字提醒用户正对摄像头k10.canvas-canvasText(采集人脸中请正对镜头,0,0,0x0066FF,k10.canvas-eCNAndENFont24,50,true);k10.canvas-updateCanvas();ai.sendFaceCmd(ENROLL);// 下发AI录入指令采集当前人脸特征本地存储分配IDdelay(3000);// 阻塞3秒给AI充足时间完成人脸特征采集k10.canvas-canvasClear();// 绿色文字提示录入成功k10.canvas-canvasText(人脸录入完成,0,0,0x00FF00,k10.canvas-eCNAndENFont24,50,true);k10.canvas-canvasText(按B键开启门禁识别,0,35,0xFFFFFF,k10.canvas-eCNAndENFont24,50,true);k10.canvas-updateCanvas();delay(1200);// 停留1.2秒让用户看清录入成功提示showStandbyUI();// 录入结束自动返回待机界面}/** * brief B按键按下回调函数开启实时人脸识别比对模式 * 操作流程开启识别总开关→重置人脸丢失计时→下发识别指令→弹出识别启动提示 */voidonButtonBPressed(){startRecogFlagtrue;// 打开识别总开关loop循环开始执行人脸检测逻辑faceLostTimermillis();// 初始化人脸丢失计时按下B瞬间开始计算3秒缓冲ai.sendFaceCmd(RECOGNIZE);// 下发AI识别指令持续比对镜头人脸和本地录入人脸库k10.canvas-canvasClear();k10.canvas-canvasText(门禁识别已启动,0,0,0x0066FF,k10.canvas-eCNAndENFont24,50,true);k10.canvas-canvasText(正在实时识别人脸,0,35,0xFFFFFF,k10.canvas-eCNAndENFont24,50,true);k10.canvas-updateCanvas();delay(1000);// 提示界面停留1秒之后进入loop实时人脸识别}代码解读一、头文件与前置声明// 行空板K10硬件总库屏幕、按键、RGB、摄像头、画布全部底层驱动#includeunihiker_k10.h// AI视觉库ESP32-S3内置NPU人脸检测、人脸录入、人脸比对功能#includeAIRecognition.h// 提前声明按键回调函数setup绑定按键时编译器识别函数voidonButtonBPressed();voidonButtonAPressed();二、全局硬件对象UNIHIKER_K10 k10;// 主控对象所有硬件操作入口uint8_tscreen_dir2;// 屏幕方向2正向正常显示AIRecognition ai;// AI人脸识别专用对象Music music;// 音频播放对象识别到家人播放提示音三、全局状态控制变量boolstartRecogFlagfalse;// 识别总开关false待机不识别true开启人脸比对boolplayFlagfalse;// 音乐防重复标记只在第一次识别到人脸播放音乐floatnowFaceID0;// 存储识别成功的人脸编号录入第一张人脸ID1第二张2unsignedlongfaceLostTimer0;// 人脸丢失计时戳记录最后一次识别到人脸的系统时间constunsignedlongFACE_KEEP_DELAY3000;// 人脸缓冲3秒短暂遮挡不退出识别四、封装函数待机界面 showStandbyUI ()作用统一管理开机、人脸超时、录入完成后的初始界面复用代码不用重复写绘图逻辑。voidshowStandbyUI(){k10.canvas-canvasClear();// 清空屏幕所有文字画面// 红色标题文字k10.canvas-canvasText( 人脸识别门禁,0,0,0xFF0000,k10.canvas-eCNAndENFont24,50,true);// 白色操作指引A录入、B启动识别k10.canvas-canvasText(A键录入人脸 B键识别,0,35,0xFFFFFF,k10.canvas-eCNAndENFont24,50,true);k10.canvas-updateCanvas();// 刷新画布到屏幕k10.rgb-write(-1,0x000000);// -1代表全部RGB灯0x000000关闭彩灯}五、setup () 上电初始化仅运行 1 次执行顺序硬件初始化 → AI 初始化 → 摄像头初始化 → 绑定按键 → 切换人脸 AI 模式 → 加载待机界面voidsetup(){k10.begin();// 初始化主板全部底层硬件k10.initScreen(screen_dir);// 初始化显示屏ai.initAi();// 开启ESP32-S3内置AI加速器NPUk10.initBgCamerImage();// 初始化摄像头画面投屏功能k10.setBgCamerImage(false);// 初始化阶段临时关闭摄像头画面k10.creatCanvas();// 创建画布缓存消除屏幕闪烁ai.switchAiMode(ai.NoMode);// 清空上一轮AI模型避免冲突// 绑定A、B按键中断回调按下按键立刻执行对应函数不受delay阻塞k10.buttonB-setPressedCallback(onButtonBPressed);k10.buttonA-setPressedCallback(onButtonAPressed);k10.setBgCamerImage(true);// 开启摄像头实时画面投屏ai.switchAiMode(ai.Face);// 切换AI模式为人脸识别支持录入比对k10.rgb-brightness(round(3));// 设置RGB亮度数值越小灯光越柔和showStandbyUI();// 开机直接显示待机界面无识别、无报警}六、loop () 主循环上电无限循环核心业务逻辑逻辑分层待机拦截 → 识别到人脸 → 人脸丢失分两种情况短暂遮挡 / 超时离开voidloop(){// 1. 识别总开关关闭保持待机直接跳出循环不执行任何识别运算if(!startRecogFlag){return;}boolhasFaceai.isRecognized();// 判断是否匹配到已录入人脸unsignedlongnowTimemillis();// 获取系统运行毫秒数无阻塞计时// 场景1识别到录入的家人人脸 if(hasFace){faceLostTimernowTime;// 持续刷新计时只要人脸在镜头内就重置3秒倒计时nowFaceIDai.getRecognitionID();// 读取人脸IDk10.canvas-canvasClear();k10.canvas-canvasText(检测人脸 ID:String(nowFaceID),0,0,0x00FF00,k10.canvas-eCNAndENFont24,50,true);// ID1 老爷专属欢迎提示if(nowFaceID1.0){k10.canvas-canvasText(欢迎老爷回家,0,40,0x00FF00,k10.canvas-eCNAndENFont24,50,true);k10.rgb-write(-1,0x00FF00);// 绿灯常亮if(!playFlag){// 仅第一次识别播放音乐防止循环重复播放music.playMusic(DADADADUM);playFlagtrue;}}// ID2 小姐专属欢迎提示elseif(nowFaceID2.0){k10.canvas-canvasText(欢迎小姐回家,0,40,0x00FF00,k10.canvas-eCNAndENFont24,50,true);k10.rgb-write(-1,0x00FF00);if(!playFlag){music.playMusic(DADADADUM);playFlagtrue;}}k10.canvas-updateCanvas();}// 场景2未识别到人脸遮挡/离开/陌生人 else{// 子场景1人脸消失不足3秒属于短暂遮挡保持当前欢迎画面不切换界面if(nowTime-faceLostTimerFACE_KEEP_DELAY){return;}// 子场景2人脸完全离开超过3秒自动退出识别模式startRecogFlagfalse;// 关闭识别总开关playFlagfalse;// 重置音乐标记下次识别重新播放showStandbyUI();// 切回干净待机界面无任何报警提示}}七、A 按键回调函数人脸录入功能 onButtonAPressed ()voidonButtonAPressed(){k10.canvas-canvasClear();k10.canvas-canvasText(采集人脸中请正对镜头,0,0,0x0066FF,k10.canvas-eCNAndENFont24,50,true);k10.canvas-updateCanvas();ai.sendFaceCmd(ENROLL);// 下发AI录入指令采集人脸特征自动分配IDdelay(3000);// 阻塞3秒给AI充足时间完成人脸采集k10.canvas-canvasClear();k10.canvas-canvasText(人脸录入完成,0,0,0x00FF00,k10.canvas-eCNAndENFont24,50,true);k10.canvas-canvasText(按B键开启门禁识别,0,35,0xFFFFFF,k10.canvas-eCNAndENFont24,50,true);k10.canvas-updateCanvas();delay(1200);// 停留1.2秒让用户看清录入成功提示showStandbyUI();// 录入结束自动返回待机界面}八、B 按键回调函数开启人脸识别 onButtonBPressed ()voidonButtonBPressed(){startRecogFlagtrue;// 打开识别总开关loop开始执行人脸检测faceLostTimermillis();// 初始化人脸丢失计时启动3秒缓冲倒计时ai.sendFaceCmd(RECOGNIZE);// 下发AI比对指令实时匹配人脸库k10.canvas-canvasClear();k10.canvas-canvasText(门禁识别已启动,0,0,0x0066FF,k10.canvas-eCNAndENFont24,50,true);k10.canvas-canvasText(正在实时识别人脸,0,35,0xFFFFFF,k10.canvas-eCNAndENFont24,50,true);k10.canvas-updateCanvas();delay(1000);// 启动提示界面停留1秒之后进入实时识别}九、整体运行流程总结开机直接待机屏幕只显示操作指引彩灯熄灭无识别、无报警文字按 A 键录入人脸3 秒采集完成1.2 秒后自动回到待机按 B 键启动人脸识别工作模式摄像头实时比对人脸识别到 ID1 老爷 / ID2 小姐屏幕显示专属欢迎文字、绿灯常亮、仅播放一次欢迎音乐人脸短暂遮挡、转头、挡脸3 秒内画面不跳转持续保留欢迎界面人脸完全离开镜头超过 3 秒自动关闭识别切回干净待机界面无红灯、无陌生人警告如需再次识别必须重新按下 B 键启动识别。Mind图形编程仅供参考实际测试的人脸图片来源网络实验场景图与视频记录