|
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 的屏幕驱动文件上传到开发板根目录,再编写猫咪检测主程序,参考代码如下:
- import screen
- import time, gc
- import lvgl as lv
- import fs_driver
- from espdl import CatDetector
- from jpeg import Decoder, Encoder
-
- decoder = Decoder()
- # 捕获并处理图像
- img = open("cat.jpg", "rb").read() # 捕获原始图像(通常是JPEG格式)
- wh = decoder.get_img_info(img) # 获取图像的宽度和高度
- # 获取图像的宽度和高度
- width, height = wh
- encoder = Encoder(width=width, height=height, pixel_format="RGB888")
- face_detector = CatDetector(width=width, height=height)
- fs_drv = lv.fs_drv_t()
- fs_driver.fs_register(fs_drv, 'S')
- scrn = lv.screen_active()
- scrn.set_style_bg_color(lv.color_hex(0x000000), 0)
- obj = lv.image(scrn)
- obj.set_src("S:cat.jpg")
- # 将图片居中
- #obj.center()
- framebuffer = decoder.decode(img) # 转换为RGB888格式
- # 将memoryview转换为bytearray以便修改
- framebuffer = bytearray(framebuffer)
- # 运行人脸检测
- results = face_detector.run(framebuffer)
-
- # 创建列表存储所有线条对象
- face_lines = []
-
- if results:
- # 在图像上绘制人脸边框
- for i, face in enumerate(results):
- print(face)
- x1, y1, x2, y2 = face['box']
-
- # 使用动态变量名:face_line_0, face_line_1, ...
- face_line = lv.line(scrn)
- face_lines.append(face_line) # 保存引用防止被GC回收
-
- # 创建样式
- style = lv.style_t()
- style.init()
- style.set_line_color(lv.palette_main(lv.PALETTE.RED))
- style.set_line_width(6)
- style.set_line_rounded(True)
- face_line.add_style(style, 0)
-
- # 正确的矩形框点顺序(需要闭合)
- points = [
- {"x": x1, "y": y1}, # 左上
- {"x": x2, "y": y1}, # 右上
- {"x": x2, "y": y2}, # 右下
- {"x": x1, "y": y2}, # 左下
- {"x": x1, "y": y1} # 回到左上(闭合)
- ]
-
- face_line.set_points(points, len(points))
- #face_line.center()
复制代码
受图像解码性能影响,显示速度相对较慢。
|