10浏览
查看: 10|回复: 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

驴友花雕  中级技神
 楼主|

发表于 6 小时前

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

API 文档
draw_rectangle函数
  1. image.draw_rectangle(x, y, w, h[, color[, thickness=1[, fill=False]]])
复制代码

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

color: 表示颜色的 RGB888 元组,适用于灰度或 RGB565 图像,默认为白色。对于灰度图像,还可以传递像素值(范围 0-255);对于 RGB565 图像,可以传递字节翻转的 RGB565 值。
thickness: 控制矩形边框的像素宽度,默认为 1。
fill: 设置为 True 时,将填充矩形内部,默认为 False。
该方法返回图像对象,允许通过链式调用其他方法。

不支持压缩图像和 Bayer 格式图像。

测试实验代码

  1. # 【花雕动手做】CanMV K230 AI 视觉识别模块之使用draw_rectangle()方法绘制矩形
  2. # 该代码演示了如何在CanMV K230开发板上使用draw_rectangle()方法绘制各种矩形图案,并在显示屏上显示
  3. # Import required modules
  4. # 导入所需的模块
  5. import time, os, urandom, sys, math  # 基础工具模块:时间、操作系统、随机数、系统、数学运算
  6. # Import display and media related modules
  7. # 导入显示和媒体相关模块
  8. from media.display import *  # 显示驱动模块,用于控制显示屏
  9. from media.media import *    # 媒体管理模块,用于管理图像资源
  10. # Define display resolution constants
  11. # 定义显示分辨率常量(根据实际使用的显示屏参数设置)
  12. DISPLAY_WIDTH = 640    # 显示屏宽度(像素)
  13. DISPLAY_HEIGHT = 480   # 显示屏高度(像素)
  14. def display_test():
  15.     """
  16.     Function to test display functionality
  17.     测试显示功能的函数:创建图像并绘制矩形图案,最终在屏幕上显示
  18.     """
  19.     # Create main background image with white color
  20.     # 创建白色背景的主图像:参数分别为宽度、高度、像素格式(ARGB8888表示每个像素包含Alpha、红、绿、蓝四个通道,各8位)
  21.     img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888)
  22.     img.clear()  # 清空图像缓存
  23.     # 绘制全屏白色矩形作为背景:参数为x起点、y起点、x终点、y终点、颜色、是否填充
  24.     img.draw_rectangle(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, color=(255,255,255), fill=True)
  25.     # Initialize display with ST7701 driver
  26.     # 使用ST7701驱动初始化显示器:指定驱动型号、分辨率、是否输出到IDE(方便调试)
  27.     Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
  28.     # Initialize media manager
  29.     # 初始化媒体管理器:负责管理图像、显示等资源的分配与释放
  30.     MediaManager.init()
  31.     try:
  32.         # 主要的装饰性矩形图案 - 居中调整
  33.         # 使用不同深浅的天蓝色营造层次感(RGB颜色值:(红, 绿, 蓝),值范围0-255)
  34.         
  35.         # 深色天蓝色 - 中央水平线(未填充,仅边框)
  36.         # 参数:x1=120, y1=160, x2=400, y2=160(由于y1=y2,实际为一条水平线),颜色(0,191,255),线宽2
  37.         img.draw_rectangle(120, 160, 400, 160, color=(0, 191, 255), thickness=2)
  38.         # 左侧装饰性小矩形
  39.         # 浅天蓝色填充矩形:x1=120, y1=160, x2=170(120+50), y2=210(160+50),颜色(135,206,235),填充
  40.         img.draw_rectangle(120, 160, 50, 50, color=(135, 206, 235), fill=True)
  41.         # 天蓝色填充矩形:x1=120, y1=270, x2=170, y2=320,颜色(0,191,255),填充
  42.         img.draw_rectangle(120, 270, 50, 50, color=(0, 191, 255), fill=True)
  43.         # 右侧装饰性小矩形
  44.         # 天蓝色填充矩形:x1=470, y1=160, x2=520, y2=210,颜色(0,191,255),填充
  45.         img.draw_rectangle(470, 160, 50, 50, color=(0, 191, 255), fill=True)
  46.         # 浅天蓝色填充矩形:x1=470, y1=270, x2=520, y2=320,颜色(135,206,235),填充
  47.         img.draw_rectangle(470, 270, 50, 50, color=(135, 206, 235), fill=True)
  48.         # 中央装饰性矩形
  49.         # 天蓝色边框矩形(未填充):x1=220, y1=200, x2=420(220+200), y2=280(200+80),线宽2
  50.         img.draw_rectangle(220, 200, 200, 80, color=(0, 191, 255), thickness=2)
  51.         # 浅天蓝色填充矩形(内部):x1=240, y1=220, x2=400(240+160), y2=260(220+40),填充
  52.         img.draw_rectangle(240, 220, 160, 40, color=(135, 206, 235), fill=True)
  53.         # 连接线效果的细长矩形
  54.         # 天蓝色填充矩形(左连接):x1=170, y1=235, x2=220(170+50), y2=245(235+10),填充
  55.         img.draw_rectangle(170, 235, 50, 10, color=(0, 191, 255), fill=True)
  56.         # 天蓝色填充矩形(右连接):x1=420, y1=235, x2=470(420+50), y2=245,填充
  57.         img.draw_rectangle(420, 235, 50, 10, color=(0, 191, 255), fill=True)
  58.         # 点缀性的小方块
  59.         # 最浅天蓝色填充方块:x1=200, y1=180, x2=215(200+15), y2=195(180+15),填充
  60.         img.draw_rectangle(200, 180, 15, 15, color=(173, 216, 230), fill=True)
  61.         img.draw_rectangle(425, 180, 15, 15, color=(173, 216, 230), fill=True)  # 右上小方块
  62.         img.draw_rectangle(200, 285, 15, 15, color=(173, 216, 230), fill=True)  # 左下小方块
  63.         img.draw_rectangle(425, 285, 15, 15, color=(173, 216, 230), fill=True)  # 右下小方块
  64.         
  65.         # Update display with background image
  66.         # 更新显示背景图像:将绘制好的img图像输出到显示屏
  67.         Display.show_image(img)
  68.         # 无限循环保持显示(每2秒休眠一次,降低CPU占用)
  69.         while True:
  70.             time.sleep(2)
  71.     except KeyboardInterrupt as e:
  72.         # 捕获用户中断(如Ctrl+C),打印信息
  73.         print("user stop: ", e)
  74.     except BaseException as e:
  75.         # 捕获其他异常,打印错误信息
  76.         print(f"Exception {e}")
  77.     # Cleanup and deinitialize display
  78.     # 清理并反初始化显示器:释放显示资源
  79.     Display.deinit()
  80.     # 启用系统退出点,允许进入休眠状态
  81.     os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
  82.     time.sleep_ms(100)  # 等待100毫秒确保资源释放完成
  83.     # Release media resources
  84.     # 释放媒体资源:关闭媒体管理器
  85.     MediaManager.deinit()
  86. if __name__ == "__main__":
  87.     # 程序入口:当脚本直接运行时执行
  88.     # Enable exit points and run display test
  89.     # 启用系统退出点(用于安全关闭)并运行显示测试函数
  90.     os.exitpoint(os.EXITPOINT_ENABLE)
  91.     display_test()
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

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

基于 CanMV K230 AI 视觉识别模块的显示测试程序,核心功能是通过draw_rectangle()方法在屏幕上绘制一系列矩形图案,展示了图像创建、显示控制和图形绘制的基本流程。以下是代码解读:

一、整体结构
代码分为三个主要部分:
模块导入:引入必要的系统工具和显示相关库
核心函数display_test():实现图像创建、矩形绘制、显示控制的完整逻辑
程序入口:启动显示测试流程

二、关键代码逐段解读
1. 模块导入与常量定义
python
  1. import time, os, urandom, sys, math  # 基础工具模块
  2. from media.display import *  # 显示驱动模块(控制显示屏)
  3. from media.media import *    # 媒体管理模块(管理图像资源)
  4. DISPLAY_WIDTH = 640    # 显示屏宽度(像素)
  5. DISPLAY_HEIGHT = 480   # 显示屏高度(像素)
复制代码

导入time用于延时,os用于系统资源管理,media.display和media.media是 CanMV K230 控制显示的核心库。
定义显示屏分辨率常量(需与实际硬件匹配,这里为 640×480)。

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

image.Image():创建一个图像对象,参数为宽度、高度、像素格式(ARGB8888表示每个像素包含透明度 + 红、绿、蓝三原色,各 8 位精度)。
img.clear():清空图像缓存(初始化为黑色)。
img.draw_rectangle():绘制全屏白色矩形作为背景,参数说明:
0, 0:矩形左上角坐标(x, y)
DISPLAY_WIDTH, DISPLAY_HEIGHT:矩形的宽和高(此处铺满整个屏幕)
color=(255,255,255):白色(RGB 值,范围 0-255)
fill=True:矩形内部填充指定颜色

(2)初始化显示与媒体资源
python

  1. Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
  2. MediaManager.init()
复制代码

Display.init():初始化显示屏,参数包括:
Display.ST7701:显示屏驱动型号(根据硬件选择,此处为 ST7701)
width/height:显示分辨率(与图像尺寸一致)
to_ide=True:支持将图像输出到开发工具(方便调试时在电脑上预览)。
MediaManager.init():初始化媒体管理器,负责分配图像缓存、显示资源等底层硬件资源。

(3)绘制装饰性矩形图案
通过多次调用draw_rectangle()绘制不同位置、大小、颜色的矩形,构建层次感图案:
python

  1. # 中央水平线(深色天蓝色,仅边框)
  2. img.draw_rectangle(120, 160, 400, 160, color=(0, 191, 255), thickness=2)
  3. # 左侧小矩形(浅天蓝色填充)
  4. img.draw_rectangle(120, 160, 50, 50, color=(135, 206, 235), fill=True)
  5. # 其他矩形...(右侧、中央、连接线、小方块等)
复制代码

draw_rectangle()参数详解:
x1, y1, width, height, color, thickness, fill
x1, y1:矩形左上角坐标(屏幕左上角为原点 (0,0))
width, height:矩形的宽度和高度(像素)
color:RGB 颜色元组(如(0,191,255)为天蓝色)
thickness:边框线宽(仅当fill=False时有效,默认 1)
fill:是否填充内部(True填充,False仅画边框)

(4)显示图像并保持
python

  1. Display.show_image(img)  # 将绘制好的图像输出到显示屏
  2. while True:
  3.     time.sleep(2)  # 无限循环保持显示(每2秒休眠一次,降低功耗)
复制代码

Display.show_image(img):将图像数据发送到显示屏,完成显示刷新。
无限循环确保图像持续显示(否则程序结束后屏幕会关闭)。

(5)异常处理与资源释放
python

  1. except KeyboardInterrupt as e:
  2.     print("user stop: ", e)  # 捕获用户中断(如Ctrl+C)
  3. except BaseException as e:
  4.     print(f"Exception {e}")  # 捕获其他异常
  5. # 清理资源
  6. Display.deinit()  # 关闭显示屏,释放显示资源
  7. os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)  # 允许系统进入休眠
  8. time.sleep_ms(100)
  9. MediaManager.deinit()  # 释放媒体资源
复制代码

异常处理确保程序在意外中断时不会崩溃。
资源释放步骤(deinit())是硬件控制的关键,避免占用硬件资源导致下次运行出错。

3. 程序入口
python

  1. if __name__ == "__main__":
  2.     os.exitpoint(os.EXITPOINT_ENABLE)  # 启用系统退出点(安全关闭机制)
  3.     display_test()  # 执行显示测试
复制代码

当脚本直接运行时,启用系统退出机制并调用display_test()函数启动流程。

三、核心技术点
draw_rectangle()方法:CanMV K230 绘制矩形的核心 API,通过坐标、尺寸、颜色和填充参数控制图形样式。
显示流程:创建图像→绘制内容→初始化显示→输出图像→释放资源,是嵌入式显示开发的通用流程。
资源管理:硬件设备(显示屏)需要显式初始化(init())和释放(deinit()),否则可能导致硬件冲突。

四、功能总结
该代码通过组合不同矩形图案,在 CanMV K230 的显示屏上展示了一个具有层次感的装饰性图形,验证了显示驱动和图形绘制功能的正确性,可作为入门示例理解 K230 的图像显示原理。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

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

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

实验场景图

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