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

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

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

什么是 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 视觉模块之绘制一个椭圆图案图1

驴友花雕  中级技神
 楼主|

发表于 昨天 20:06

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

本帖最后由 驴友花雕 于 2025-10-31 20:14 编辑

draw_ellipse函数可实现在图像上绘制一个椭圆。

语法
  1. image.draw_ellipse(cx, cy, rx, ry, color, thickness=1)
复制代码


参数解释
cx, cy:椭圆中心的坐标。
rx, ry:椭圆的半径(x轴和y轴方向)。
color:椭圆的颜色。
thickness:椭圆边框的厚度(默认为1)。

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

  1. #【花雕动手做】CanMV K230 AI 视觉识别模块之使用draw_ellipse()方法绘制椭圆
  2. # Import required modules
  3. # 导入所需的模块
  4. import time, os, urandom, sys, math
  5. # Import display and media related modules
  6. # 导入显示和媒体相关模块
  7. from media.display import *
  8. from media.media import *
  9. from random import randint
  10. # Define display resolution constants
  11. # 定义显示分辨率常量
  12. DISPLAY_WIDTH = 640    # 显示宽度:640像素
  13. DISPLAY_HEIGHT = 480   # 显示高度:480像素
  14. def display_test():
  15.     """
  16.     Function to test display functionality
  17.     测试显示功能的函数
  18.     主要功能:在屏幕上随机绘制10个不同位置、大小、颜色和旋转角度的椭圆
  19.     """
  20.     # Create main background image with white color
  21.     # 创建白色背景的主图像
  22.     # ARGB8888格式:每个像素32位(Alpha, Red, Green, Blue各8位)
  23.     img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888)
  24.     img.clear()  # 清空图像缓冲区
  25.     # 绘制白色填充矩形作为背景
  26.     img.draw_rectangle(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, color=(255,255,255), fill=True)
  27.     # Initialize display with ST7701 driver
  28.     # 使用ST7701驱动初始化显示器
  29.     # to_ide=True表示将显示输出同时发送到IDE和硬件屏幕
  30.     Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
  31.    
  32.     # Initialize media manager
  33.     # 初始化媒体管理器 - 负责管理媒体资源如摄像头、显示等
  34.     MediaManager.init()
  35.    
  36.     # 循环绘制10个随机椭圆
  37.     for i in range(10):
  38.         # 生成随机椭圆参数:
  39.         
  40.         # 椭圆中心点x坐标:在屏幕宽度2倍范围内随机,然后减去半宽,使椭圆可能部分在屏幕外
  41.         x = randint(0, 2 * img.width()) - img.width() // 2
  42.         # 椭圆中心点y坐标:在屏幕高度2倍范围内随机,然后减去半高
  43.         y = randint(0, 2 * img.height()) - img.height() // 2
  44.         
  45.         # 椭圆x轴半径:在屏幕最大尺寸的一半内随机
  46.         rx = randint(0, max(img.height(), img.width()) // 2)
  47.         # 椭圆y轴半径:在屏幕最大尺寸的一半内随机
  48.         ry = randint(0, max(img.height(), img.width()) // 2)
  49.         
  50.         # 椭圆旋转角度:0-360度随机
  51.         rot = randint(0, 360)
  52.         # 生成随机颜色(偏亮的颜色,避免与白色背景对比度太低)
  53.         # RGB分量在128-255范围内,确保颜色足够鲜艳
  54.         r = randint(0, 127) + 128  # 红色分量
  55.         g = randint(0, 127) + 128  # 绿色分量  
  56.         b = randint(0, 127) + 128  # 蓝色分量
  57.         # 使用draw_ellipse方法绘制椭圆
  58.         # 参数说明:
  59.         # x, y: 椭圆中心坐标
  60.         # rx, ry: x轴和y轴半径
  61.         # rot: 旋转角度(度)
  62.         # color: 椭圆颜色 (R, G, B)
  63.         # thickness: 线宽(像素),2像素宽
  64.         # fill: False表示只绘制边框,不填充
  65.         img.draw_ellipse(
  66.             x, y, rx, ry, rot, color=(r, g, b), thickness=2, fill=False
  67.         )
  68.    
  69.     # Update display with background image
  70.     # 更新显示背景图像 - 将绘制好的图像显示在屏幕上
  71.     Display.show_image(img)
  72.    
  73.     # 主循环保持显示
  74.     while True:
  75.         time.sleep(2)  # 每2秒循环一次,保持程序运行
  76.     # Cleanup and deinitialize display
  77.     # 清理并反初始化显示器(实际上由于上面的无限循环,这里的代码不会执行)
  78.     Display.deinit()
  79.     os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
  80.     time.sleep_ms(100)
  81.    
  82.     # Release media resources
  83.     # 释放媒体资源
  84.     MediaManager.deinit()
  85. if __name__ == "__main__":
  86.     # Enable exit points and run display test
  87.     # 启用退出点并运行显示测试
  88.     # EXITPOINT_ENABLE允许通过IDE停止程序执行
  89.     os.exitpoint(os.EXITPOINT_ENABLE)
  90.     display_test()  # 调用显示测试函数
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 20:13

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

代码解读

代码架构分析
1. 模块导入部分
python
  1. import time, os, urandom, sys, math
  2. from media.display import *
  3. from media.media import *
  4. from random import randint
复制代码

基础模块:time(延时)、os(系统操作)、urandom(随机数)、math(数学计算)
显示媒体模块:CanMV特有的显示和媒体功能
随机数模块:用于生成随机椭圆参数

2. 显示配置
python
  1. DISPLAY_WIDTH = 640
  2. DISPLAY_HEIGHT = 480
复制代码

设置显示分辨率为640×480,这是嵌入式设备常见分辨率。

核心函数解析
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)
复制代码

ARGB8888格式:32位色彩深度(Alpha透明通道+RGB)
白色背景:通过绘制填充矩形实现纯白背景

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

ST7701驱动:常见的LCD屏幕驱动芯片
to_ide=True:重要参数,同时输出到IDE和硬件屏幕
媒体管理器:管理摄像头、显示等硬件资源

3. 椭圆绘制核心逻辑
随机参数生成:

python
  1. x = randint(0, 2 * img.width()) - img.width() // 2
  2. y = randint(0, 2 * img.height()) - img.height() // 2
复制代码

位置随机:椭圆中心可能在屏幕外,创造动态效果
计算原理:2*width范围减去半宽,使坐标在[-width/2, 3*width/2]之间

大小和旋转:

python
  1. rx = randint(0, max(img.height(), img.width()) // 2)
  2. ry = randint(0, max(img.height(), img.width()) // 2)
  3. rot = randint(0, 360)
复制代码

半径随机:最大为屏幕尺寸的一半
旋转角度:0-360度完整旋转

颜色生成:

python
  1. r = randint(0, 127) + 128
  2. g = randint(0, 127) + 128  
  3. b = randint(0, 127) + 128
复制代码

色彩范围:128-255,确保颜色鲜艳明亮
避免白色:防止与背景色混淆

4. draw_ellipse() 方法详解
python
  1. img.draw_ellipse(
  2.     x, y,           # 椭圆中心坐标
  3.     rx, ry,         # x轴和y轴半径
  4.     rot,            # 旋转角度(度)
  5.     color=(r, g, b), # RGB颜色元组
  6.     thickness=2,    # 边框线宽
  7.     fill=False      # 不填充,只绘制边框
  8. )
复制代码

参数说明表:

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

5. 显示和循环
python
  1. Display.show_image(img)
  2. while True:
  3.     time.sleep(2)
复制代码

显示图像:将内存中的图像数据输出到屏幕
无限循环:保持程序运行,持续显示效果

技术特点分析
1. 图形学特性
椭圆算法:使用中点椭圆算法或类似的光栅化算法
抗锯齿:可能包含基本的抗锯齿处理
坐标变换:支持旋转变换的椭圆绘制

2. 随机化策略
python
  1. # 位置随机化:创造溢出屏幕的效果
  2. x = randint(0, 2*width) - width//2
  3. # 颜色随机化:确保鲜艳度
  4. color = randint(128, 255)
复制代码

3. 资源管理
内存管理:ARGB8888格式每像素4字节,整图约1.2MB
显示缓冲:双缓冲机制避免闪烁
硬件加速:可能利用K230的GPU进行图形渲染

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 20:18

【花雕动手做】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