驴友花雕 发表于 前天 20:04

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



什么是 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 倍。



驴友花雕 发表于 前天 20:06

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

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

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

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

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

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

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

# Import required modules
# 导入所需的模块
import time, os, urandom, sys, math

# Import display and media related modules
# 导入显示和媒体相关模块
from media.display import *
from media.media import *
from random import randint

# Define display resolution constants
# 定义显示分辨率常量
DISPLAY_WIDTH = 640    # 显示宽度:640像素
DISPLAY_HEIGHT = 480   # 显示高度:480像素

def display_test():
    """
    Function to test display functionality
    测试显示功能的函数
    主要功能:在屏幕上随机绘制10个不同位置、大小、颜色和旋转角度的椭圆
    """

    # Create main background image with white color
    # 创建白色背景的主图像
    # ARGB8888格式:每个像素32位(Alpha, Red, Green, Blue各8位)
    img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888)
    img.clear()# 清空图像缓冲区
    # 绘制白色填充矩形作为背景
    img.draw_rectangle(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, color=(255,255,255), fill=True)

    # Initialize display with ST7701 driver
    # 使用ST7701驱动初始化显示器
    # to_ide=True表示将显示输出同时发送到IDE和硬件屏幕
    Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
   
    # Initialize media manager
    # 初始化媒体管理器 - 负责管理媒体资源如摄像头、显示等
    MediaManager.init()
   
    # 循环绘制10个随机椭圆
    for i in range(10):
      # 生成随机椭圆参数:
      
      # 椭圆中心点x坐标:在屏幕宽度2倍范围内随机,然后减去半宽,使椭圆可能部分在屏幕外
      x = randint(0, 2 * img.width()) - img.width() // 2
      # 椭圆中心点y坐标:在屏幕高度2倍范围内随机,然后减去半高
      y = randint(0, 2 * img.height()) - img.height() // 2
      
      # 椭圆x轴半径:在屏幕最大尺寸的一半内随机
      rx = randint(0, max(img.height(), img.width()) // 2)
      # 椭圆y轴半径:在屏幕最大尺寸的一半内随机
      ry = randint(0, max(img.height(), img.width()) // 2)
      
      # 椭圆旋转角度:0-360度随机
      rot = randint(0, 360)

      # 生成随机颜色(偏亮的颜色,避免与白色背景对比度太低)
      # RGB分量在128-255范围内,确保颜色足够鲜艳
      r = randint(0, 127) + 128# 红色分量
      g = randint(0, 127) + 128# 绿色分量
      b = randint(0, 127) + 128# 蓝色分量

      # 使用draw_ellipse方法绘制椭圆
      # 参数说明:
      # x, y: 椭圆中心坐标
      # rx, ry: x轴和y轴半径
      # rot: 旋转角度(度)
      # color: 椭圆颜色 (R, G, B)
      # thickness: 线宽(像素),2像素宽
      # fill: False表示只绘制边框,不填充
      img.draw_ellipse(
            x, y, rx, ry, rot, color=(r, g, b), thickness=2, fill=False
      )
   
    # Update display with background image
    # 更新显示背景图像 - 将绘制好的图像显示在屏幕上
    Display.show_image(img)
   
    # 主循环保持显示
    while True:
      time.sleep(2)# 每2秒循环一次,保持程序运行

    # Cleanup and deinitialize display
    # 清理并反初始化显示器(实际上由于上面的无限循环,这里的代码不会执行)
    Display.deinit()
    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
    time.sleep_ms(100)
   
    # Release media resources
    # 释放媒体资源
    MediaManager.deinit()

if __name__ == "__main__":
    # Enable exit points and run display test
    # 启用退出点并运行显示测试
    # EXITPOINT_ENABLE允许通过IDE停止程序执行
    os.exitpoint(os.EXITPOINT_ENABLE)
    display_test()# 调用显示测试函数

驴友花雕 发表于 前天 20:13

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

代码解读

代码架构分析
1. 模块导入部分
python
import time, os, urandom, sys, math

from media.display import *

from media.media import *

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

2. 显示配置
python
DISPLAY_WIDTH = 640

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

核心函数解析
display_test() 函数详解
1. 图像初始化
python
img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888)

img.clear()

img.draw_rectangle(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, color=(255,255,255), fill=True)
ARGB8888格式:32位色彩深度(Alpha透明通道+RGB)
白色背景:通过绘制填充矩形实现纯白背景

2. 显示系统初始化
python
Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)

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

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

python
x = randint(0, 2 * img.width()) - img.width() // 2

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

大小和旋转:

python
rx = randint(0, max(img.height(), img.width()) // 2)

ry = randint(0, max(img.height(), img.width()) // 2)

rot = randint(0, 360)
半径随机:最大为屏幕尺寸的一半
旋转角度:0-360度完整旋转

颜色生成:

python
r = randint(0, 127) + 128

g = randint(0, 127) + 128

b = randint(0, 127) + 128
色彩范围:128-255,确保颜色鲜艳明亮
避免白色:防止与背景色混淆

4. draw_ellipse() 方法详解
python
img.draw_ellipse(

    x, y,         # 椭圆中心坐标

    rx, ry,         # x轴和y轴半径

    rot,            # 旋转角度(度)

    color=(r, g, b), # RGB颜色元组

    thickness=2,    # 边框线宽

    fill=False      # 不填充,只绘制边框

)
参数说明表:



5. 显示和循环
python
Display.show_image(img)

while True:

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

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

2. 随机化策略
python
# 位置随机化:创造溢出屏幕的效果

x = randint(0, 2*width) - width//2



# 颜色随机化:确保鲜艳度

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

驴友花雕 发表于 前天 20:18

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

实验场景图




页: [1]
查看完整版本: 【花雕动手做】CanMV K230 AI 视觉模块之绘制一个椭圆图案