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

驴友花雕  中级技神
 楼主|

发表于 昨天 19:43

【花雕动手做】CanMV K230 AI视觉模块之绘制大号红色字

绘制文字的draw_string_advanced方法

【推荐使用】
draw_string_advanced

增强版 draw_string,支持中文显示,并允许用户通过 font 参数自定义字体。

  1. image.draw_string_advanced(x, y, char_size, str, [color, font])
复制代码

【不推荐使用】
draw_string

  1. image.draw_string(x, y, text[, color[, scale=1[, x_spacing=0[, y_spacing=0[, mono_space=True]]]]])
复制代码

从图像的 (x, y) 位置开始绘制 8x10 大小的文本。参数可以分别传入 x, y,也可以作为元组 (x, y) 一起传递。

text: 要绘制的字符串,换行符 \n、\r 或 \r\n 用于将光标移动到下一行。
color: 表示颜色的 RGB888 元组,适用于灰度或 RGB565 图像,默认为白色。对于灰度图像,还可以传递像素值(范围 0-255);对于 RGB565 图像,可以传递字节翻转的 RGB565 值。
scale: 控制文本的缩放比例,默认为 1。只能为整数。
x_spacing: 调整字符之间的水平间距。正值表示增加间距,负值表示减少。
y_spacing: 调整行之间的垂直间距。正值表示增加间距,负值表示减少。
mono_space: 默认为 True,使字符具有固定宽度。设置为 False 时,字符间距将根据字符宽度动态调整。
该方法返回图像对象,允许通过链式调用其他方法。

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

项目测试实验代码

  1. # 【花雕动手做】CanMV K230 AI视觉识别模块之draw_string_advanced()函数绘制大号文字
  2. # 该代码演示如何在CanMV K230开发板上使用draw_string_advanced()函数绘制不同大小和颜色的文字,包括中文和英文
  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.     测试显示功能的函数:创建图像并使用draw_string_advanced()绘制文字,最终在屏幕上显示
  18.     """
  19.     # Create main background image with white color
  20.     # 创建白色背景的主图像:参数为宽度、高度、像素格式(ARGB8888支持透明通道和真彩色)
  21.     img = image.Image(DISPLAY_WIDTH, DISPLAY_HEIGHT, image.ARGB8888)
  22.     img.clear()  # 清空图像缓存(初始化为黑色)
  23.     # 绘制全屏白色矩形作为背景:x起点=0, y起点=0, 宽度=屏宽, 高度=屏高, 白色, 填充
  24.     img.draw_rectangle(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, color=(255,255,255), fill=True)
  25.     # Initialize display with ST7701 driver
  26.     # 初始化显示器:指定驱动型号为ST7701,分辨率与图像一致,to_ide=True支持在开发工具中预览
  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.         # draw_string_advanced()参数:x坐标, y坐标, 字体大小, 文字内容, 颜色
  34.         # 此处在(60,130)位置绘制130号大小的红色"世界你好"
  35.         img.draw_string_advanced(60, 130, 130, "世界你好", color=(255, 0, 0))
  36.         # 绘制英文文字 - 使用蓝色
  37.         # 在(250,300)位置绘制30号大小的蓝色"Hello World"
  38.         img.draw_string_advanced(250, 300, 30, "Hello World", color=(0, 0, 255))
  39.         # Update display with background image
  40.         # 更新显示屏:将绘制好的图像输出到物理屏幕
  41.         Display.show_image(img)
  42.         # 无限循环保持显示(每2秒休眠一次,降低CPU占用)
  43.         while True:
  44.             time.sleep(2)
  45.     except KeyboardInterrupt as e:
  46.         # 捕获用户中断(如Ctrl+C停止程序),打印中断信息
  47.         print("user stop: ", e)
  48.     except BaseException as e:
  49.         # 捕获其他异常,打印错误信息便于调试
  50.         print(f"Exception {e}")
  51.     # Cleanup and deinitialize display
  52.     # 清理并反初始化显示器:释放显示屏硬件资源
  53.     Display.deinit()
  54.     # 启用系统退出点,允许设备进入低功耗休眠状态
  55.     os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
  56.     time.sleep_ms(100)  # 等待100毫秒确保资源释放完成
  57.     # Release media resources
  58.     # 释放媒体资源:关闭媒体管理器,释放图像缓存等
  59.     MediaManager.deinit()
  60. if __name__ == "__main__":
  61.     # 程序入口:当脚本直接运行时执行
  62.     # Enable exit points and run display test
  63.     # 启用系统安全退出机制,并运行显示测试函数
  64.     os.exitpoint(os.EXITPOINT_ENABLE)
  65.     display_test()
复制代码



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:48

【花雕动手做】CanMV K230 AI视觉模块之绘制大号红色字

这份代码是基于 CanMV K230 AI 视觉识别模块的文字显示测试程序,核心功能是通过draw_string_advanced()函数在屏幕上绘制不同大小、颜色的中英文文字,展示了 K230 的文本显示能力。以下是相关解读:

一、整体结构
代码分为三个主要部分:
模块导入:引入系统工具和显示相关库
核心函数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是 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支持透明通道和 24 位真彩色,色彩还原更细腻)。
img.clear():清空图像缓存(初始为黑色)。
img.draw_rectangle():绘制全屏白色背景,参数包括左上角坐标(0,0)、宽高(屏幕尺寸)、白色(255,255,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:支持将显示内容同步到开发工具(如 CanMV IDE),方便调试时在电脑上预览。
MediaManager.init():初始化媒体管理器,负责分配图像缓存、字体库等底层资源,是显示文字的必要步骤(字体资源由该模块管理)。

(3)绘制文字(核心功能)
通过draw_string_advanced()函数绘制中英文文字:
python

  1. # 绘制中文:在(60,130)位置,130号大小,红色"世界你好"
  2. img.draw_string_advanced(60, 130, 130, "世界你好", color=(255, 0, 0))
  3. # 绘制英文:在(250,300)位置,30号大小,蓝色"Hello World"
  4. img.draw_string_advanced(250, 300, 30, "Hello World", color=(0, 0, 255))
复制代码

draw_string_advanced()参数详解(核心函数):
x, y, size, text, color
x, y:文字左上角的坐标(屏幕左上角为原点(0,0),x 向右递增,y 向下递增)。
size:字体大小(数值越大文字越大,此处 130 为大号,30 为中号)。
text:要显示的字符串(支持中英文,需确保 K230 固件包含中文字体库,默认通常支持)。
color:文字颜色,以 RGB 元组表示((红,绿,蓝),值范围 0-255,如(255,0,0)为红色)。

(4)显示图像并保持
python

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

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_string_advanced()函数:K230 绘制文字的高级接口,支持自定义大小和颜色,且原生支持中文(依赖固件字体库),适合快速开发带文字交互的界面。
坐标系统:屏幕左上角为原点(0,0),需根据文字大小计算位置,避免超出屏幕范围(如 130 号文字高度较大,需确保 y 坐标足够小)。
资源管理:显示硬件和媒体资源必须通过init()初始化、deinit()释放,否则可能导致设备异常(如屏幕闪烁、程序卡死)。

四、功能总结
该代码通过draw_string_advanced()函数在白色背景上绘制了红色大号中文和蓝色中号英文,验证了 CanMV K230 的文字显示能力,尤其展示了中文支持的便捷性。可作为开发信息提示、人机交互界面的基础示例,实际使用时可调整坐标、大小和颜色以适应需求。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:52

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