【花雕动手做】K10系列实验之猫狗脸检测动态宠物氛围灯

2026-06-21711
AI 快速预览详细 收起
行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板,集成摄像头、麦克风、扬声器及多种传感器。通过本项目,孩子可以轻松实现猫狗脸检测并制作动态宠物氛围灯,无需额外设备。该板适用于中小学信息科技课程中的编程学习、物联网及人工智能教学,帮助孩子在动手实践中掌握AI技术。
【花雕动手做】K10系列实验之猫狗脸检测动态宠物氛围灯图1

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

主要特点
集成摄像头&内置算法,可进行离线图像检测
集成麦克风&内置算法,可进行离线语音识别
集成扬声器&内置算法,可进行离线语音合成
2.8寸彩色屏幕,数据展示更清晰
集成度高,利于教学
接口丰富,兼容软件多,扩展性好

【花雕动手做】K10系列实验之猫狗脸检测动态宠物氛围灯图2


创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(8)
驴友花雕
驴友花雕
作者




驴友花雕
驴友花雕
作者
实验场景图与视频记录





驴友花雕
驴友花雕
作者
代码解读
一、头文件与全局对象
[code]// 行空板K10硬件驱动库:屏幕、画布、RGB、摄像头全套外设接口
#include "unihiker_k10.h"
// AI离线视觉库:猫狗检测、面部坐标读取、AI模式切换
#include "AIRecognition.h"
// 主板主控对象,所有硬件操作统一调用k10
UNIHIKER_K10 k10;
// 屏幕竖直正向显示,猫狗检测必须竖屏摆放
uint8_t screen_dir=2;
// AI识别专用对象,处理猫狗检测算法
AIRecognition ai;
// ===================== 灯光、计时全局变量 =====================
unsigned long petLostTimer = 0; // 记录宠物最后一次出现的时间戳,用于3秒延时熄灯
const unsigned long PET_OFF_DELAY = 3000; // 常量:宠物消失3秒后关闭灯光
unsigned long breathTimer = 0; // 控制呼吸灯刷新间隔,无阻塞不卡顿画面
int breathVal = 30; // 灯光最低基础亮度,保证识别瞬间就能看见灯光
bool breathDir = true; // 呼吸渐变方向:true亮度增加,false亮度降低
bool petExist = false; // 状态标记:true画面有猫狗,false无宠物[/code]
二、自定义绘图函数
1. showPetDataUI () 显示宠物识别数据
[code]void showPetDataUI()
{
k10.canvas->canvasClear(); // 每次刷新先清空画布,解决文字重叠bug
// 读取猫狗面部四项核心数据
int len = ai.getCatData(AIRecognition::Length);
int wid = ai.getCatData(AIRecognition::Width);
int cx = ai.getCatData(AIRecognition::CenterX);
int cy = ai.getCatData(AIRecognition::CenterY);
// 分多行、不同彩色文字展示宠物尺寸与坐标
k10.canvas->canvasText("===== 宠物检测数据 =====", 4, 0xFFFFFF);
k10.canvas->canvasText("宠物脸长:" + String(len), 6, 0xFFFFCC);
k10.canvas->canvasText("宠物脸宽:" + String(wid), 7, 0x99FF99);
k10.canvas->canvasText("中心X坐标:" + String(cx), 8, 0xCCCCFF);
k10.canvas->canvasText("中心Y坐标:" + String(cy), 9, 0x66FFFF);
k10.canvas->updateCanvas(); // 刷新画布到屏幕
}[/code]
2. clearPetUI () 无宠物空白界面
[code]void clearPetUI()
{
k10.canvas->canvasClear();
k10.canvas->canvasText("等待猫狗进入画面...", 6, 0xAAAAAA);
k10.canvas->updateCanvas();
}[/code]
宠物离开 3 秒后清空所有数据文字,界面干净。
三、setup () 上电初始化(仅运行 1 次)
[code]void setup() {
k10.begin(); // 初始化主板全部底层硬件
k10.initScreen(screen_dir); // 初始化屏幕,设置竖屏方向
ai.initAi(); // 启动ESP32-S3内置NPU AI加速器,加载猫狗检测模型
k10.initBgCamerImage(); // 初始化摄像头投屏功能
k10.setBgCamerImage(false); // 初始化阶段临时关闭摄像头画面
k10.creatCanvas(); // 创建绘图缓存,消除屏幕闪烁
ai.switchAiMode(ai.NoMode); // 清空旧AI模式,防止冲突黑屏
k10.setScreenBackground(0x000000); // 屏幕底层黑色背景
k10.setBgCamerImage(true); // 开启摄像头实时画面投屏
ai.switchAiMode(ai.Cat); // 切换AI为猫狗脸部检测模式
k10.rgb->brightness(5); // RGB亮度0~10,设置适中亮度
k10.rgb->write(-1, 0x000000); // 开机默认灯光熄灭
clearPetUI(); // 开机显示等待宠物界面
}[/code]
四、loop () 主循环(核心识别 + 灯光逻辑)
[code]void loop() {
unsigned long nowTime = millis(); // 获取系统运行毫秒,无阻塞计时
// 判断画面内是否存在猫/狗脸部
petExist = ai.isDetectContent(AIRecognition::Cat);
// 分支1:画面检测到猫狗
if (petExist)
{
petLostTimer = nowTime; // 持续刷新消失计时,只要宠物在画面就重置3秒倒计时
showPetDataUI(); // 刷新宠物长宽、坐标数据界面
// 每100ms更新一次灯光亮度,柔和呼吸渐变
if (nowTime - breathTimer > 100)
{
breathTimer = nowTime;
// 亮度自动增减,区间30~200,不会过暗、不会刺眼
if (breathDir)
{
breathVal += 8;
if (breathVal >= 200) breathDir = false;
}
else
{
breathVal -= 8;
if (breathVal <= 30) breathDir = true;
}
// 专属青色氛围灯:红蓝通道同步随亮度变化,形成青蓝流水呼吸
uint32_t petColor = breathVal | (breathVal << 16);
k10.rgb->write(-1, petColor);
}
}
// 分支2:画面无猫狗
else
{
// 宠物离开满3秒,执行熄灯+清空界面
if (nowTime - petLostTimer > PET_OFF_DELAY)
{
k10.rgb->write(-1, 0x000000); // 全部RGB灯熄灭
clearPetUI();
}
// 离开不足3秒:灯光保持当前状态,不立即熄灭
}
}
[/code]
运行完整流程
开机:屏幕显示「等待猫狗进入画面...」,RGB 彩灯全灭;
镜头出现猫 / 狗:
屏幕实时刷新宠物脸长、脸宽、脸部中心 XY 坐标;
RGB 青色灯光持续明暗呼吸渐变;
只要宠物在画面,3 秒倒计时持续重置,灯光不会熄灭;
宠物移出镜头:
前 3 秒灯光继续保持呼吸效果,不立刻关灯;
满 3 秒后 RGB 完全熄灭,屏幕清空宠物数据,回到等待界面;
再次出现宠物:立刻重新点亮呼吸灯,刷新识别数据。
核心亮点
无阻塞millis()计时,不使用delay,画面、灯光刷新流畅;
3 秒延时熄灯缓冲,宠物短暂跑出画面不会频繁开关灯;
专属青色呼吸渐变灯光,亮度区间限制,视觉柔和;
每次绘图自动清空画布,彻底解决文字重叠;
纯离线猫狗 AI 检测,无需联网,识别猫、狗通用。
驴友花雕
驴友花雕
作者
【花雕动手做】行空板 K10 系列实验之猫狗脸检测的动态宠物氛围灯
实验开源代码
[code]#include "unihiker_k10.h"
#include "AIRecognition.h"
// 全局硬件对象
UNIHIKER_K10 k10;
uint8_t screen_dir=2;
AIRecognition ai;
// 全局状态变量
unsigned long petLostTimer = 0; // 宠物离开计时戳
const unsigned long PET_OFF_DELAY = 3000; // 宠物离开3秒熄灯
unsigned long breathTimer = 0; // 呼吸灯刷新计时
int breathVal = 30; // 灯光基础亮度(最低可见亮度)
bool breathDir = true; // 呼吸渐变方向:true变亮 false变暗
bool petExist = false; // 当前画面是否存在宠物
/**
* @brief 清空画布,刷新宠物数据界面
*/
void showPetDataUI()
{
k10.canvas->canvasClear();
// 读取宠物面部数据
int len = ai.getCatData(AIRecognition::Length);
int wid = ai.getCatData(AIRecognition::Width);
int cx = ai.getCatData(AIRecognition::CenterX);
int cy = ai.getCatData(AIRecognition::CenterY);
k10.canvas->canvasText("===== 宠物检测数据 =====", 4, 0xFFFFFF);
k10.canvas->canvasText("宠物脸长:" + String(len), 6, 0xFFFFCC);
k10.canvas->canvasText("宠物脸宽:" + String(wid), 7, 0x99FF99);
k10.canvas->canvasText("中心X坐标:" + String(cx), 8, 0xCCCCFF);
k10.canvas->canvasText("中心Y坐标:" + String(cy), 9, 0x66FFFF);
k10.canvas->updateCanvas();
}
/**
* @brief 无宠物界面,清空所有文字
*/
void clearPetUI()
{
k10.canvas->canvasClear();
k10.canvas->canvasText("等待猫狗进入画面...", 6, 0xAAAAAA);
k10.canvas->updateCanvas();
}
void setup() {
k10.begin();
k10.initScreen(screen_dir);
ai.initAi();
k10.initBgCamerImage();
k10.setBgCamerImage(false);
k10.creatCanvas();
ai.switchAiMode(ai.NoMode);
k10.setScreenBackground(0x000000);
k10.setBgCamerImage(true);
ai.switchAiMode(ai.Cat);
// RGB亮度设置,K10有效范围0~10
k10.rgb->brightness(5);
// 初始灯光熄灭
k10.rgb->write(-1, 0x000000);
clearPetUI();
}
void loop() {
unsigned long nowTime = millis();
// 判断是否检测到猫狗
petExist = ai.isDetectContent(AIRecognition::Cat);
if (petExist)
{
// 刷新宠物存在计时,重置3秒熄灭倒计时
petLostTimer = nowTime;
// 刷新宠物数据界面
showPetDataUI();
// 呼吸灯渐变逻辑,每100ms刷新一次亮度
if (nowTime - breathTimer > 100)
{
breathTimer = nowTime;
// 亮度区间30~200,避免过暗/刺眼
if (breathDir)
{
breathVal += 8;
if (breathVal >= 200) breathDir = false;
}
else
{
breathVal -= 8;
if (breathVal <= 30) breathDir = true;
}
// 专属青色呼吸灯 0x00FFFF
uint32_t petColor = breathVal | (breathVal << 16);
k10.rgb->write(-1, petColor);
}
}
else
{
// 宠物不在画面,判断离开是否满3秒
if (nowTime - petLostTimer > PET_OFF_DELAY)
{
// 3秒超时,灯光熄灭、清空数据界面
k10.rgb->write(-1, 0x000000);
clearPetUI();
}
}
}[/code]
驴友花雕
驴友花雕
作者
宠物检测的几张案例图片



驴友花雕
驴友花雕
作者
知识点:行空板 K10 猫狗脸检测
一、基础硬件与底层原理
1. 硬件支撑
行空板 K10 搭载ESP32-S3 主控,内置专用 NPU 硬件 AI 加速器,搭配板载 200 万像素前置摄像头,无需外接模块、无需联网,本地离线运行猫狗检测算法,纯边缘端计算,无网络延迟、不消耗流量。
配套输出外设:2.8 寸彩色 LCD(实时显示摄像头画面 + 识别框)、RGB 氛围灯、A/B 物理按键、TF 卡存储(可抓拍宠物照片)、扬声器。
2. 算法定位
猫狗检测是 K10 内置四大原生视觉 AI 模型之一,其余三种:人脸检测、移动检测、二维码识别。
识别目标:画面内猫、狗的脸部区域均可识别;
区分逻辑:仅检测宠物脸部存在,无法区分具体品种、无法给猫狗分配独立 ID(和人脸录入识别有本质区别);
运行要求:设备竖直放置(Type-C 接口朝上),横屏摆放会大幅降低识别成功率,甚至完全检测不到目标。
二、猫狗检测完整核心功能
1. 实时画面框选可视化
检测到猫 / 狗脸部时,屏幕摄像头画面会自动叠加绿色矩形识别框圈出宠物脸,直观展示识别区域;移动检测、二维码模式无识别框,仅人脸、猫狗检测支持框选标记。
2. 完整宠物面部数据读取
检测到猫狗后,可实时读取宠物脸全部坐标与尺寸参数,图形化 / 代码均可调用:
基础尺寸:脸部宽度 Width、高度 Length;
坐标信息:脸部中心点 X、中心点 Y;
五官关键点:左眼 XY、右眼 XY、鼻子 XY、左右嘴角 XY。
可基于坐标实现跟随效果、屏幕贴纸、灯光跟随等交互。
3. 状态判断接口
提供专用判断函数,快速判定画面是否存在猫狗:
Mind + 图形化:「是否检测到猫狗」积木,返回布尔值;
Arduino C 代码:ai.isDetectContent(AIRecognition::Cat);
MicroPython:data['cat_flag'],1 = 检测到猫狗,0 = 无目标。
4. 可联动全板载外设做交互
检测触发后可联动所有硬件开发趣味项目:
RGB 彩灯:检测到宠物自动亮对应颜色呼吸灯、闪烁倒计时;
自动抓拍:识别稳定 2 秒自动拍照存入 TF 卡,实现宠物自动相机;
语音播报:检测到猫狗喇叭播放 “发现小猫 / 小狗”;
屏幕交互:显示宠物坐标、弹窗提示、叠加卡通贴纸;
物联网:WiFi 上传宠物到访记录到上位机 / 小程序。

驴友花雕
驴友花雕
作者
辅助:屏幕显示相关积木

LED控制模块

驴友花雕
驴友花雕
作者
主打:人工智能模块

猫狗脸检测相关说明

- 没有更多了 -