9浏览
查看: 9|回复: 0

[Micropython] 强强联合:ESP32-P4 × LVGL × MicroPython × ESP-DL

[复制链接]
FireBeetle 2 ESP32-P4 是一款搭载 ESP32-P4R32 芯片的高性能微控制器开发板,支持单精度 FPU 浮点运算与 AI 指令扩展,边缘 AI 处理能力十分出色,搭配 LVGL-MicroPython 与 ESP-DL,可以实现丰富的 AI 视觉交互效果。本篇笔记分享基于 LVGL-Micropython 和 ESP-DL 实现猫咪检测并实时显示在屏幕上的示例。
1、开发板速览
  • 双核RISC-V 360MHz + 单核RISC-V 40MHz处理器,提供强劲的计算能力
  • 支持单精度 FPU 和 AI 扩展,具有强大的边缘AI能力
  • 768KB L2MEM + 32MB PSRAM + 16MB FLASH,为数据、指令、代码提供高性能、大容量的存储
  • 板载MIPI-DSI接口,最高支持720p@88fps 或 1080p@30fps图像显示
  • 板载MIPI-CSI接口,最高支持720p@88fps 或 1080p@30fps图像采集
  • 集成ESP32-C6模组,支持WiFi6、Bluetooth 5通讯
  • 集成丰富易用的扩展接口:USB OTG 2.0高速、MIC、TF卡槽

2、LVGL_MicroPython 固件
Micropython官方已支持ESP32-P4,Kevin维护的LVGL-Micropython也已支持ESP32-P4,但是DSI驱动还有点问题。
我对源码进行了修改,并集成添加了 ESP-DL 支持,成功编译出 LVGL-Micropython + ESP-DL 一体化固件。
编译过程较为繁琐,这里直接提供编译好的固件,省去自行编译的麻烦。(固件放在QQ群文件中)
3、示例代码
LVGL-Micropython 的屏幕与触摸驱动配置较为繁琐,我已将其封装为screen.py驱动模块,通过该模块可快速完成显示屏和触摸功能的初始化,大幅简化开发流程。
以往基于 Micropython + ESP-DL 的固件虽可实现人脸检测、猫咪检测等功能,但检测结果的屏幕显示实现起来比较麻烦,使用新版一体化固件则可以轻松解决这一问题。
使用时先将命名为 screen.py 的屏幕驱动文件上传到开发板根目录,再编写猫咪检测主程序,参考代码如下:
  1. import screen
  2. import time, gc
  3. import lvgl as lv
  4. import fs_driver
  5. from espdl import CatDetector
  6. from jpeg import Decoder, Encoder
  7. decoder = Decoder()
  8. # 捕获并处理图像
  9. img = open("cat.jpg", "rb").read()  # 捕获原始图像(通常是JPEG格式)
  10. wh = decoder.get_img_info(img)  # 获取图像的宽度和高度
  11. # 获取图像的宽度和高度
  12. width, height = wh
  13. encoder = Encoder(width=width, height=height, pixel_format="RGB888")
  14. face_detector = CatDetector(width=width, height=height)
  15. fs_drv = lv.fs_drv_t()
  16. fs_driver.fs_register(fs_drv, 'S')
  17. scrn = lv.screen_active()
  18. scrn.set_style_bg_color(lv.color_hex(0x000000), 0)
  19. obj = lv.image(scrn)
  20. obj.set_src("S:cat.jpg")
  21. # 将图片居中
  22. #obj.center()
  23. framebuffer = decoder.decode(img)  # 转换为RGB888格式
  24. # 将memoryview转换为bytearray以便修改
  25. framebuffer = bytearray(framebuffer)
  26. # 运行人脸检测
  27. results = face_detector.run(framebuffer)
  28. # 创建列表存储所有线条对象
  29. face_lines = []
  30. if results:
  31.     # 在图像上绘制人脸边框
  32.     for i, face in enumerate(results):
  33.         print(face)
  34.         x1, y1, x2, y2 = face['box']
  35.         
  36.         # 使用动态变量名:face_line_0, face_line_1, ...
  37.         face_line = lv.line(scrn)
  38.         face_lines.append(face_line)  # 保存引用防止被GC回收
  39.         
  40.         # 创建样式
  41.         style = lv.style_t()
  42.         style.init()
  43.         style.set_line_color(lv.palette_main(lv.PALETTE.RED))
  44.         style.set_line_width(6)
  45.         style.set_line_rounded(True)
  46.         face_line.add_style(style, 0)
  47.         
  48.         # 正确的矩形框点顺序(需要闭合)
  49.         points = [
  50.             {"x": x1, "y": y1},  # 左上
  51.             {"x": x2, "y": y1},  # 右上
  52.             {"x": x2, "y": y2},  # 右下
  53.             {"x": x1, "y": y2},  # 左下
  54.             {"x": x1, "y": y1}   # 回到左上(闭合)
  55.         ]
  56.         
  57.         face_line.set_points(points, len(points))
  58.         #face_line.center()
复制代码

受图像解码性能影响,显示速度相对较慢。

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

本版积分规则

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

硬件清单

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

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

mail