回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

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

头像 驴友花雕 2025.10.31 2 0

00 (3).jpg

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

 

00 (4).jpg

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()  # 调用显示测试函数

代码解读

 

代码架构分析

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      # 不填充,只绘制边框
)
参数说明表:

 

11.jpg

 

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进行图形渲染

实验场景图 

 

09.jpg
10.jpg

评论

user-avatar
icon 他的勋章
    展开更多