77浏览
查看: 77|回复: 3

[项目] 【花雕动手做】CanMV K230 AI视觉模块之绘制一个线条LOGO

[复制链接]
【花雕动手做】CanMV K230 AI视觉模块之绘制一个线条LOGO图1

什么是 CanMV K230?
CanMV K230是一款高性价比的RISC-V边缘AI平台,凭借低功耗、强视觉处理能力和开放的开发生态,成为嵌入式AI开发的理想选择,尤其适合需要快速部署视觉与AI功能的创客、中小企业及教育场景。CanMV 是一套 AI 视觉开发平台,K230 是其核心芯片。该模块结合了图像采集、AI推理、边缘计算等能力,适合嵌入式视觉应用开发。

CanMV:类似 OpenMV 的图像处理框架,支持 Python 编程,简化视觉识别开发流程。
K230 芯片:嘉楠科技推出的 AIoT SoC,采用 RISC-V 架构,内置第三代 KPU(AI加速单元),算力高达 6 TOPS,性能是 K210 的 13.7 倍。


【花雕动手做】CanMV K230 AI视觉模块之绘制一个线条LOGO图2

驴友花雕  中级技神
 楼主|

发表于 5 天前

【花雕动手做】CanMV K230 AI视觉模块之绘制一个线条LOGO

MicroPython中draw_line函数的核心功能是绘制直线,基本参数包括起始点坐标、结束点坐标和颜色,部分实现还支持线宽和颜色格式的设置。在K230平台上,使用image模块绘制直线:

API 文档
draw_line 函数可实现在图像上绘制一条线。

语法
  1. image.draw_line(x0, y0, x1, y1, color)
复制代码


参数解释
x1, y1:起点坐标
x2, y2:终点坐标
color:颜色,使用RGB888格式或灰度值
thickness:线宽,单位为像素3

示例
  1. img.draw_line(10, 10, 100, 100, color=(255, 0, 0))  # 绘制红色线
复制代码


CanMV K230 AI 视觉识别模块之使用Draw_line方法绘制线条
测试实验代码

  1. #【花雕动手做】CanMV K230 AI 视觉识别模块之使用Draw_line方法绘制线条
  2. # 导入系统模块:时间、随机数、系统路径
  3. import time, os, urandom, sys
  4. # 导入显示和媒体处理模块(硬件相关)
  5. from media.display import *  # 显示屏驱动
  6. from media.media import *   # 媒体资源管理
  7. # 定义显示屏分辨率常量(640x480)
  8. DISPLAY_WIDTH = 640
  9. DISPLAY_HEIGHT = 480
  10. def display_test():
  11.     """测试显示功能:用draw_line绘制字母'Yahboom'"""
  12.    
  13.     # 1. 创建白色背景图像(ARGB8888格式支持透明度)
  14.     img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888)
  15.     img.clear()  # 清空图像
  16.     img.draw_rectangle(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, color=(255,255,255), fill=True)  # 填充白色
  17.     # 2. 初始化显示屏(ST7701驱动芯片)和媒体管理器
  18.     Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
  19.     MediaManager.init()
  20.     try:
  21.         # 3. 设置绘制参数:文字颜色(天蓝色)、粗细(5像素)
  22.         thickness = 5
  23.         text_color = (0, 191, 255)  # RGB格式
  24.         # 计算文本起始X坐标(居中显示)
  25.         text_width = 200  # 预估文本总宽度
  26.         start_x = (DISPLAY_WIDTH - text_width) // 2
  27.         # 4. 绘制字母'Y'(通过多条线段组合)
  28.         img.draw_line(start_x, 220, start_x + 20, 240, color=text_color, thickness=thickness)  # 左斜线
  29.         img.draw_line(start_x + 20, 240, start_x + 40, 220, color=text_color, thickness=thickness)  # 右斜线
  30.         img.draw_line(start_x + 20, 240, start_x + 20, 260, color=text_color, thickness=thickness)  # 中竖线
  31.         # 5. 绘制字母'a'(矩形框架)
  32.         img.draw_line(start_x + 45, 240, start_x + 65, 240, color=text_color, thickness=thickness)  # 上横
  33.         img.draw_line(start_x + 65, 240, start_x + 65, 260, color=text_color, thickness=thickness)  # 右竖
  34.         img.draw_line(start_x + 70, 260, start_x + 45, 260, color=text_color, thickness=thickness)  # 下横
  35.         img.draw_line(start_x + 45, 260, start_x + 45, 240, color=text_color, thickness=thickness)  # 左竖
  36.         # 6. 绘制字母'h'(类似'n'但带右侧竖线)
  37.         img.draw_line(start_x + 80, 220, start_x + 80, 260, color=text_color, thickness=thickness)  # 左竖
  38.         img.draw_line(start_x + 80, 240, start_x + 100, 240, color=text_color, thickness=thickness)  # 中横
  39.         img.draw_line(start_x + 100, 240, start_x + 100, 260, color=text_color, thickness=thickness)  # 右竖
  40.         # 7. 绘制字母'b'(类似'd'的左半部分)
  41.         img.draw_line(start_x + 110, 220, start_x + 110, 260, color=text_color, thickness=thickness)  # 左竖
  42.         img.draw_line(start_x + 110, 240, start_x + 130, 240, color=text_color, thickness=thickness)  # 上横
  43.         img.draw_line(start_x + 130, 240, start_x + 130, 260, color=text_color, thickness=thickness)  # 右竖
  44.         img.draw_line(start_x + 130, 260, start_x + 110, 260, color=text_color, thickness=thickness)  # 下横
  45.         # 8. 绘制字母'o'(矩形框)
  46.         img.draw_line(start_x + 140, 240, start_x + 160, 240, color=text_color, thickness=thickness)  # 上横
  47.         img.draw_line(start_x + 160, 240, start_x + 160, 260, color=text_color, thickness=thickness)  # 右竖
  48.         img.draw_line(start_x + 160, 260, start_x + 140, 260, color=text_color, thickness=thickness)  # 下横
  49.         img.draw_line(start_x + 140, 260, start_x + 140, 240, color=text_color, thickness=thickness)  # 左竖
  50.         # 9. 重复绘制'o'(可能是拼写错误,应为'm')
  51.         # ...(此处代码与上一个'o'相同,实际应为'm'的绘制逻辑)
  52.         # 更新显示屏内容
  53.         Display.show_image(img)
  54.         
  55.         # 保持显示(循环等待用户中断)
  56.         while True:
  57.             time.sleep(2)
  58.     # 异常处理:用户中断或系统错误
  59.     except KeyboardInterrupt as e:
  60.         print("用户停止:", e)
  61.     except BaseException as e:
  62.         print(f"异常: {e}")
  63.     # 10. 释放资源:反初始化显示屏和媒体管理器
  64.     Display.deinit()
  65.     os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)  # 进入低功耗模式
  66.     time.sleep_ms(100)
  67.     MediaManager.deinit()
  68. # 主程序入口
  69. if __name__ == "__main__":
  70.     os.exitpoint(os.EXITPOINT_ENABLE)  # 启用退出点
  71.     display_test()
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 天前

【花雕动手做】CanMV K230 AI视觉模块之绘制一个线条LOGO

代码解读:

1. 导入模块
python
  1. import time, os, urandom, sys
  2. from media.display import *  # 显示屏驱动
  3. from media.media import *   # 媒体资源管理
复制代码

系统模块:time(时间控制)、os(系统操作)、urandom(随机数)、sys(系统参数)。
硬件相关模块:media.display(显示屏驱动)、media.media(媒体资源管理),说明这是针对嵌入式设备(如 K230 开发板)的代码。

2. 常量定义
python
  1. DISPLAY_WIDTH = 640
  2. DISPLAY_HEIGHT = 480
复制代码

定义显示屏分辨率为 640x480。

3. 主函数 display_test()
(1) 创建图像对象
python
  1. img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888)
  2. img.clear()
  3. img.draw_rectangle(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, color=(255,255,255), fill=True)
复制代码

创建一个 640x480 的空白图像,格式为 ARGB8888(支持透明度)。
用 draw_rectangle 填充白色背景(RGB=255,255,255)。

(2) 初始化硬件
python
  1. Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
  2. MediaManager.init()
复制代码

初始化显示屏(驱动芯片为 ST7701)和媒体管理器。
to_ide=True 可能表示将显示内容输出到开发环境的 IDE(如 CanMV 的图形界面)。

(3) 设置绘制参数
python
  1. thickness = 5
  2. text_color = (0, 191, 255)  # 天蓝色
  3. text_width = 200
  4. start_x = (DISPLAY_WIDTH - text_width) // 2  # 计算居中起始坐标
复制代码

线条粗细为 5 像素,颜色为天蓝色(RGB=0,191,255)。
预估文本总宽度为 200 像素,并计算居中显示的起始 X 坐标。

(4) 绘制字母(核心逻辑)
通过 draw_line 方法绘制字母的轮廓,每个字母由多条线段组合而成:

'Y':左斜线 + 右斜线 + 中竖线。
'a':矩形框架(类似 '口' 字)。
'h':左侧竖线 + 中间横线 + 右侧竖线。
'b':左侧竖线 + 顶部横线 + 右侧竖线 + 底部横线。
'o':矩形框(实际应为 'm',但代码重复了 'o' 的绘制逻辑)。

示例:绘制 'Y' 的代码

python
  1. img.draw_line(start_x, 220, start_x + 20, 240, color=text_color, thickness=thickness)  # 左斜线
  2. img.draw_line(start_x + 20, 240, start_x + 40, 220, color=text_color, thickness=thickness)  # 右斜线
  3. img.draw_line(start_x + 20, 240, start_x + 20, 260, color=text_color, thickness=thickness)  # 中竖线
复制代码

(5) 显示图像
python
  1. Display.show_image(img)
复制代码

将绘制好的图像输出到显示屏。

(6) 保持显示
python
  1. while True:
  2.     time.sleep(2)
复制代码

循环等待,防止程序退出,直到用户手动中断(如按键)。

(7) 异常处理与资源释放
python
  1. except KeyboardInterrupt as e:
  2.     print("用户停止:", e)
  3. except BaseException as e:
  4.     print(f"异常: {e}")
  5. finally:
  6.     Display.deinit()
  7.     os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)  # 进入低功耗模式
  8.     time.sleep_ms(100)
  9.     MediaManager.deinit()
复制代码

捕获用户中断(Ctrl+C)或其他异常,并释放显示屏和媒体资源。
os.exitpoint 可能用于控制设备休眠状态。

4. 主程序入口
python
  1. if __name__ == "__main__":
  2.     os.exitpoint(os.EXITPOINT_ENABLE)  # 启用退出点
  3.     display_test()
复制代码

程序入口,调用 display_test() 函数。
os.EXITPOINT_ENABLE 可能与系统休眠管理相关。


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 天前

【花雕动手做】CanMV K230 AI视觉模块之绘制一个线条LOGO

实验串口返回情况

【花雕动手做】CanMV K230 AI视觉模块之绘制一个线条LOGO图1

实验场景图

【花雕动手做】CanMV K230 AI视觉模块之绘制一个线条LOGO图2

【花雕动手做】CanMV K230 AI视觉模块之绘制一个线条LOGO图3

回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail