开始前适用开发板:ESP32-S3 Korvo · 开发框架:ESP-IDF
适用开发板:Korvo S3 · 工程
04.advanced.color_tracking_lvgl· targetesp32s3
前置:摄像头 LVGL 显示
学习时长:约 25 分钟 · 难度:★★★☆☆
学习目标
完成本节后,你将能够:
- 理解 HSL 色彩空间在颜色识别中的优势(相比 RGB)
- 掌握 EasyTracer 颜色追踪算法的使用方法
- 学会在 LVGL 画面上叠加标注框
- 了解色彩空间转换和阈值调整的技巧
1. 这个例子在干嘛
摄像头实时预览 + 颜色目标追踪。用 EasyTracer 算法在 HSL 色彩空间中识别红/绿/蓝色目标,在 LVGL 画面上用黄色矩形框标出目标位置。不需要 AI 模型,纯色彩空间运算,计算量极小。
生活类比:工厂流水线上的颜色分拣传感器——看到红色零件就标记出来。
┌──────────┐ DVP ┌──────────────────────────────┐
│ OV 摄像头 │────────→│ ESP32-S3 │
└──────────┘ RGB565 │ │
│ ┌──────────┐ ┌──────────┐ │
│ │ RGB→HSL │→│ EasyTracer│ │
│ │ 色彩转换 │ │ 阈值匹配 │ │
│ └──────────┘ └────┬─────┘ │
│ ↓ │
│ ┌──────────────────────────┐│
│ │ LVGL Canvas ││
│ │ 摄像头画面 + 黄色标注框 ││
│ └──────────────────────────┘│
└──────────────────────────────┘
2. 为什么用 HSL 而不是 RGB
| 色彩空间 | 优点 | 缺点 |
|---|---|---|
| RGB | 硬件直接输出 | 亮度变化 → R/G/B 都变,同一颜色难定义 |
| HSL | H(色相) 独立于亮度 | 需转换计算 |
| HSV | 类似 HSL | 饱和度定义不同 |
关键理解:在 HSL 中,红色永远在 H=0° 附近,不管灯光亮暗。所以只需要设定 H 的范围就能识别颜色。
HSL 色环:
H=0°(360°) → 红色
H=120° → 绿色
H=240° → 蓝色
识别红色:H ∈ [350°, 10°], S > 50%, L ∈ [20%, 80%]
3. 编译烧录
cd Korvo_Firmware\04.advanced.color_tracking_lvgl
idf.py set-target esp32s3
idf.py build flash monitor
4. 使用步骤
- 烧录后摄像头预览画面出现
- 在镜头前放一个 纯色物体(如红色卡片、绿色积木)
- 识别到后,画面上出现 黄色矩形框 跟踪目标位置
- 移动物体 → 框跟着动
识别效果好的条件
- 目标颜色纯且面积大(> 画面 5%)
- 环境光线均匀(避免强反光)
- 背景与目标颜色差异大
5. 运行现象
| 阶段 | 屏幕 | 串口 |
|---|---|---|
| 启动 | 摄像头预览 | Camera init OK |
| 无目标 | 纯预览画面 | No target |
| 有目标 | 黄色框标注 | Target: x=120 y=80 w=50 h=60 |
| 多目标 | 最大目标标注 | 坐标输出 |
6. 常见问题与排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 不识别 | 目标颜色不够纯 | 用饱和度高的纯色卡片 |
| 不识别 | 光线太暗/太亮 | 调整环境光照 |
| 框乱跳 | 背景有相似颜色 | 换纯色背景 |
| 框乱跳 | HSL 阈值太宽 | 收紧 H/S/L 范围 |
| 画面卡 | 分辨率太高 | 降低摄像头分辨率 |
| 延迟大 | LVGL 刷新频率 | 正常现象,可优化 |
7. 动手改造建议
- 自定义追踪颜色:修改 HSL 阈值范围,追踪黄色/紫色
- 串口输出坐标:目标中心坐标 → 外接舵机做云台跟踪
- 多目标同时追踪:分别设定红/蓝两组阈值
- 面积统计:计算目标占画面比例,判断远近
- 结合 Wi-Fi:识别到目标时 MQTT 报警
8. 知识延伸
- EasyTracer 算法:逐像素扫描 → 色彩空间转换 → 阈值匹配 → 连通区域分析 → 输出外接矩形
- 与 AI 目标检测的对比:颜色追踪速度极快但只能识别颜色,AI 检测(如 YOLO)能识别物体类别但计算量大
- 工业应用:颜色分拣、产品质检、交通信号灯识别
- OpenCV 对比:EasyTracer 功能类似 OpenCV 的
inRange()+findContours(),但更轻量
9. 下一步
| 方向 | 推荐例程 | 说明 |
|---|---|---|
| 人脸识别 | Face Recognition | AI 目标检测 |
| 二维码 | QR Code | 另一种视觉任务 |
| 摄像头基础 | Camera LVGL | 预览入门 |
| P4C5 对比 | P4C5 颜色追踪 | MIPI CSI 版 |
酷世DIY · Kevincoooool