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

[项目] 【花雕动手做】CanMV K230 AI视觉模块之绘制一个圆形图案

[复制链接]
【花雕动手做】CanMV K230 AI视觉模块之绘制一个圆形图案图3

【花雕动手做】CanMV K230 AI视觉模块之绘制一个圆形图案图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视觉模块之绘制一个圆形图案图2

【花雕动手做】CanMV K230 AI视觉模块之绘制一个圆形图案图4

驴友花雕  中级技神
 楼主|

发表于 5 天前

【花雕动手做】CanMV K230 AI视觉模块之绘制一个圆形图案

API 文档
draw_circle
  1. image.draw_circle(x, y, radius[, color[, thickness=1[, fill=False]]])
复制代码

在图像上绘制一个圆形。参数可以分别传入 x, y, radius,也可以作为元组 (x, y, radius) 一起传递。

color: 表示颜色的 RGB888 元组,适用于灰度或 RGB565 图像,默认为白色。对于灰度图像,还可以传递像素值(范围 0-255);对于 RGB565 图像,可以传递字节翻转的 RGB565 值。
thickness: 控制圆形边框的像素宽度,默认为 1。
fill: 设置为 True 时,将填充圆形内部,默认为 False。

该方法返回图像对象,允许通过链式调用其他方法。

【花雕动手做】CanMV K230 AI 视觉识别模块之使用draw_circle方法绘制圆形
测试实验代码

  1. # 【花雕动手做】CanMV K230 AI 视觉识别模块之使用draw_circle方法绘制圆形
  2. # 导入系统基础模块
  3. import time, os, urandom, sys, math  # 时间、操作系统、随机数、系统、数学运算
  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.     """
  12.     测试显示功能的函数
  13.     功能:绘制一个复杂的圆形图案(类似汽车轮毂设计)
  14.     """
  15.    
  16.     # ========== 初始化阶段 ==========
  17.     # 创建主背景图像(ARGB8888格式支持透明度)
  18.     img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888)
  19.     img.clear()  # 清空图像
  20.     # 绘制白色背景(覆盖整个显示区域)
  21.     img.draw_rectangle(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, color=(255,255,255), fill=True)
  22.     # 初始化显示器(使用ST7701驱动芯片)
  23.     Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
  24.     # 初始化媒体管理器
  25.     MediaManager.init()
  26.     try:
  27.         # ========== 绘制主图案 ==========
  28.         # 1. 主轮廓(双层同心圆)
  29.         img.draw_circle(320, 240, 150, color=(50, 50, 50), thickness=8)  # 外圈(灰色,线宽8)
  30.         img.draw_circle(320, 240, 130, color=(80, 80, 80), thickness=5)  # 内圈(浅灰,线宽5)
  31.         # 2. 中心轮毂(三层结构)
  32.         img.draw_circle(320, 240, 40, color=(100, 100, 100), fill=True)   # 填充灰色圆盘
  33.         img.draw_circle(320, 240, 40, color=(50, 50, 50), thickness=3)    # 轮毂边框(深灰)
  34.         img.draw_circle(320, 240, 15, color=(30, 30, 30), fill=True)      # 轮毂中心(黑色)
  35.         # 3. 辐条(8根均匀分布)
  36.         for i in range(8):
  37.             # 计算每根辐条的角度(360度均分)
  38.             angle = i * (360 / 8)
  39.             # 计算外端点坐标(130半径处)
  40.             x_outer = int(320 + 130 * math.cos(math.radians(angle)))
  41.             y_outer = int(240 + 130 * math.sin(math.radians(angle)))
  42.             # 计算内端点坐标(40半径处)
  43.             x_inner = int(320 + 40 * math.cos(math.radians(angle)))
  44.             y_inner = int(240 + 40 * math.sin(math.radians(angle)))
  45.             # 绘制辐条两端的小圆点(装饰效果)
  46.             img.draw_circle(x_outer, y_outer, 10, color=(70, 70, 70), fill=True)  # 外端点
  47.             img.draw_circle(x_inner, y_inner, 8, color=(70, 70, 70), fill=True)   # 内端点
  48.         # 4. 装饰性螺栓(16个均匀分布的小圆点)
  49.         for i in range(16):
  50.             angle = i * (360 / 16)  # 更密集的分布
  51.             # 计算螺栓位置(140半径处)
  52.             x = int(320 + 140 * math.cos(math.radians(angle)))
  53.             y = int(240 + 140 * math.sin(math.radians(angle)))
  54.             # 绘制黑色小圆点
  55.             img.draw_circle(x, y, 5, color=(40, 40, 40), fill=True)
  56.         # ========== 显示输出 ==========
  57.         Display.show_image(img)  # 将绘制好的图像显示到屏幕
  58.         
  59.         # 保持显示(实际不会执行到这里,因为下面是无限循环)
  60.         while True:
  61.             time.sleep(2)  # 每2秒检查一次退出条件
  62.     # ========== 异常处理 ==========
  63.     except KeyboardInterrupt as e:
  64.         print("用户中断: ", e)  # 捕获Ctrl+C中断
  65.     except BaseException as e:
  66.         print(f"发生异常: {e}")  # 捕获其他所有异常
  67.     # ========== 清理阶段 ==========
  68.     Display.deinit()  # 反初始化显示器
  69.     os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)  # 启用睡眠模式退出点
  70.     time.sleep_ms(100)  # 短暂延时
  71.     MediaManager.deinit()  # 释放媒体资源
  72. # 程序主入口
  73. if __name__ == "__main__":
  74.     os.exitpoint(os.EXITPOINT_ENABLE)  # 启用退出点功能
  75.     display_test()  # 执行显示测试函数
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 天前

【花雕动手做】CanMV K230 AI视觉模块之绘制一个圆形图案

代码解读

一、核心功能解析
1. 图形绘制逻辑
程序通过draw_circle()方法实现分层圆形图案绘制,模拟汽车轮毂结构:

主轮廓:双层同心圆(外圈150px/内圈130px)
中心轮毂:三层结构(灰色填充盘+深灰边框+黑色中心点)
辐条系统:8根辐条通过计算圆上坐标实现均匀分布
装饰细节:16个螺栓孔围绕主轮廓分布

2. 数学计算关键点
python
  1. angle = i * (360 / n)  # 均分角度计算
  2. x = center_x + radius * math.cos(math.radians(angle))  # 极坐标转直角坐标
  3. y = center_y + radius * math.sin(math.radians(angle))
复制代码

使用三角函数将极坐标转换为屏幕像素坐标
角度需先转换为弧度(math.radians())
坐标取整处理(int())确保像素对齐

3. 显示控制流程
创建画布 → 2. 绘制图形 → 3. 初始化硬件 → 4. 显示输出 → 5. 异常处理 → 6. 资源释放

二、技术实现亮点
1. 硬件抽象层设计
通过Display.init()和MediaManager.init()实现硬件解耦
支持ST7701驱动芯片的显示器
使用os.exitpoint()管理低功耗模式

2. 图形渲染优化
ARGB8888格式支持透明度(虽未使用alpha通道)
分层绘制策略:先背景后前景,避免重复渲染
装饰元素使用填充圆点提升视觉效果

3. 异常安全机制
python
  1. try:
  2.     # 业务逻辑
  3. except KeyboardInterrupt:
  4.     # 用户中断处理
  5. finally:
  6.     # 确保资源释放
复制代码

捕获Ctrl+C中断和系统异常
显式调用反初始化方法释放硬件资源
100ms延时确保硬件稳定

三、扩展应用建议
1. 动态效果实现
python
  1. # 示例:添加旋转动画
  2. for frame in range(36):  # 36帧动画
  3.     img.clear()
  4.     img.draw_rectangle(0,0,640,480,(255,255,255),True)
  5.    
  6.     # 绘制动态辐条(随帧数旋转)
  7.     for i in range(8):
  8.         angle = i*45 + frame*10  # 基础角度+动态偏移
  9.         # ...(坐标计算代码)
  10.    
  11.     Display.show_image(img)
  12.     time.sleep(0.05)
复制代码

2. 交互功能扩展
python
  1. # 添加触摸检测(需硬件支持)
  2. from media.touch import Touch
  3. touch = Touch()
  4. while True:
  5.     if touch.read() == Touch.PRESSED:
  6.         x, y = touch.position()
  7.         if (x-320)**2 + (y-240)**2 < 150**2:  # 检测点击是否在外圈内
  8.             print("点击了轮毂区域")
复制代码

3. 性能优化方向
使用图像缓冲区减少重复计算
对静态元素预渲染到位图
采用差分更新机制(仅刷新变化区域)

四、潜在问题排查
显示异常:
检查to_ide=True参数是否与实际硬件匹配
确认分辨率常量与显示器物理尺寸一致
内存不足:
ARGB8888格式占用内存较大(640×480×4字节)
可改用RGB565格式减少内存占用
坐标错位:
确保三角函数计算后取整
检查显示器方向设置(可能需要坐标变换)

五、代码结构示意图
main()
├─ 初始化阶段
│   ├─ 创建画布
│   ├─ 硬件初始化
│   └─ 绘制白色背景
├─ 图形渲染
│   ├─ 主轮廓(双圆)
│   ├─ 中心轮毂(三层)
│   ├─ 辐条系统(8根)
│   └─ 装饰螺栓(16个)
├─ 显示输出
│   └─ 图像刷新
└─ 资源释放
    ├─ 显示器反初始化
    └─ 媒体管理器释放

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 天前

【花雕动手做】CanMV K230 AI视觉模块之绘制一个圆形图案

实验场景图

【花雕动手做】CanMV K230 AI视觉模块之绘制一个圆形图案图1

【花雕动手做】CanMV K230 AI视觉模块之绘制一个圆形图案图2
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail