【花雕动手做】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 倍。
【花雕动手做】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()# 调用显示测试函数
【花雕动手做】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进行图形渲染
【花雕动手做】CanMV K230 AI 视觉模块之绘制一个椭圆图案
实验场景图
页:
[1]