Display
目录
概述
K230 配备 1 路 MIPI-DSI(1x4 lane),可驱动 MIPI 屏幕或通过接口芯片转换驱动 HDMI 显示器。此外,为了方便调试,我们还支持虚拟显示器,用户可以选择 VIRT 输出设备,即使没有 HDMI 显示器或 LCD 屏幕, 也可在 CanMV-IDE 中进行图像预览。
Display 模块 API
Note
该模块自固件版本 V0.7 起有显著更改,若您使用的是 V0.7 之前的固件,请参考旧版本文档。概述
本手册旨在指导开发人员使用 Micro Python API 调用 CanMV Display 模块,实现图像显示功能。
如需增加自定义屏幕,可参考Display Debugger
API 介绍
init
描述
初始化 Display 通路,包括 VO 模块、 DSI 模块和 LCD/HDMI。
必须在 MediaManager.init()之前调用
语法
init(type=None, width=None, height=None, osd_num=1, to_ide=False, flag=None, fps=None, quality=90)
参数
| 参数名称 | 描述 | 输入 / 输出 | 说明 |
|---|---|---|---|
| type | 显示器驱动类型 | 输入 | 必选 |
| width | 分辨率宽度 | 输入 | 可选参数,默认值根据 type 决定 |
| height | 分辨率高度 | 输入 | 可选参数,默认值根据 type 决定 |
| osd_num | 在show_image时支持的 LAYER 数量 |
输入 | 越大占用内存越多 |
| to_ide | 是否将屏幕显示传输到 IDE 显示 | 输入 | 开启时占用更多内存 |
| flag | 显示 标志 | 输入 | |
| fps | 显示帧率 | 输入 | 仅支持 VIRT 类型 |
| quality | 设置 Jpeg 压缩质量 |
输入 | 仅在 to_ide=True 时有效,范围 [10-100] |
返回值
| 返回值 | 描述 |
|---|---|
| 无 |
show_image
描述
在屏幕上显示图像。
语法
show_image(img, x=0, y=0, layer=None, alpha=255, flag=None)
参数
| 参数名称 | 描述 | 输入 / 输出 | 说明 |
|---|---|---|---|
| img | 显示的图像 | 输入 | |
| x | 起始坐标的 x 值 | 输入 | |
| y | 起始坐标的 y 值 | 输入 | |
| layer | 显示到 指定层 | 输入 | 仅支持 OSD 层,若需要多层请在init 中设置 osd_num |
| alpha | 图层混合 alpha | 输入 | |
| flag | 显示 标志 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 无 |
deinit
描述
执行反初始化, deinit 方法会关闭整个 Display 通路,包括 VO 模块、 DSI 模块和 LCD/HDMI。
必须在 MediaManager.deinit()之前调用
必须在 sensor.stop()之后调用
语法
deinit()
返回值
| 返回值 | 描述 |
|---|---|
| 无 |
bind_layer
描述
将 sensor 或 vdec 模块的输出绑定到屏幕显示。无需用户手动干预即可持续显示图像。
必须在 init 之前调用
语法
bind_layer(src=(mod, dev, layer), dstlayer, rect=(x, y, w, h), pix_format, alpha, flag)
参数
| 参数名称 | 描述 | 输入 / 输出 | 说明 |
|---|---|---|---|
| src | sensor 或 vdec 的输出信息 |
输入 | 可通过 sensor.bind_info() 获取 |
| dstlayer | 绑定到 Display 的 显示层 | 输入 | 可绑定到 video 或 osd 层 |
| rect | 显示区域 | 输入 | 可通过 sensor.bind_info() 获取 |
| pix_format | 图像像素格式 | 输入 | 可通过 sensor.bind_info() 获取 |
| alpha | 图层混合 alpha | 输入 | |
| flag | 显示 标志 | 无 |
width
描述
获取屏幕或某一图层的显示宽度
语法
width(layer = None):
参数
| 参数名称 | 描述 | 输入 / 输出 | 说明 |
|---|---|---|---|
| layer | 指定获取layer 的宽度,如果不传则表示获取屏幕的分辨率宽度 |
返回值
| 返回值 | 描述 |
|---|---|
| width | 屏幕或显示层的宽度信息 |
height
描述
获取屏幕或某一图层的显示高度
语法
height(layer = None):
参数
| 参数名称 | 描述 | 输入 / 输出 | 说明 |
|---|---|---|---|
| layer | 指定获取layer 的高度,如果不传则表示获取屏幕的分辨率高度 |
返回值
| 返回值 | 描述 |
|---|---|
| height | 屏幕或显示层的高度信息 |
数据结构描述
type
| 类型 | 参数取值 | 备注 |
|---|---|---|
| VIRT | 640x480@90 | 默认值 IDE 调试专用,不在外接屏幕上显示内容 用户可自定义设置分辨率 (64x64)-(4096x4096) 和帧率 (1-200) |
| DEBUGGER | 调试屏幕专用 | |
| ST7701 | Display.init(Display.ST7701, width = 800, height = 480) | 默认值 800x480 |
| Display.init(Display.ST7701, width = 480, height = 800) | 480x800 | |
| Display.init(Display.ST7701, width = 854, height = 480) | 854x480 | |
| Display.init(Display.ST7701, width = 480, height = 854) | 480x854 | |
| Display.init(Display.ST7701, width = 640, height = 480) | 640x480 | |
| Display.init(Display.ST7701, width = 480, height = 640) | 480x640 | |
| Display.init(Display.ST7701, width = 368, height = 552) | 368x552 | |
| Display.init(Display.ST7701, width = 552, height = 368) | 552x368 | |
| HX8399 | Display.init(Display.HX8399, width = 1920, height = 1080) | 默认值 1920x1080 |
| Display.init(Display.HX8399, width = 1080, height = 1920) | 1920x1080 | |
| ILI9806 | Display.init(Display.ILI9806, width = 800, height = 480) | 默认值 800x480 |
| Display.init(Display.ILI9806, width = 480, height = 800) | 480x800 | |
| ILI9881 | Display.init(Display.ILI9881, width = 1280, height = 800) | 默认值 1280x800 |
| Display.init(Display.ILI9881, width = 800, height = 1280) | 800x1280 | |
| LT9611 | Display.init(Display.LT9611, width = 1920, height = 1080, fps = 30) | 默认值 1920x1080@30 |
| Display.init(Display.LT9611, width = 1920, height = 1080, fps = 60) | 1920x1080@60 | |
| Display.init(Display.LT9611, width = 1280, height = 720, fps = 60) | 1280x720@60 | |
| Display.init(Display.LT9611, width = 1280, height = 720, fps = 50) | 1280x720@50 | |
| Display.init(Display.LT9611, width = 1280, height = 720, fps = 30) | 1280x720@30 | |
| Display.init(Display.LT9611, width = 640, height = 480, fps = 60) | 640x480@60 |
layer
K230 提供 2 层视频图层支持和 4 层 OSD 图层支持。分列如下:
| 显示层 | 说明 | 备注 |
|---|---|---|
| LAYER_VIDEO1 | 仅可在bind_layer 中使用,支持硬件旋转 |
|
| LAYER_VIDEO2 | 仅可在bind_layer 中使用,不支持硬件旋转 |
|
| LAYER_OSD0 | 支持show_image 和bind_layer 使用 |
|
| LAYER_OSD1 | 支持show_image 和bind_layer 使用 |
|
| LAYER_OSD2 | 支持show_image 和bind_layer 使用 |
|
| LAYER_OSD3 | 支持show_image 和bind_layer 使用 |
flag
| 标志 | 说明 | 备注 |
|---|---|---|
| FLAG_ROTATION_0 | 旋转 0 度 |
|
| FLAG_ROTATION_90 | 旋转 90 度 |
|
| FLAG_ROTATION_180 | 旋转 180 度 |
|
| FLAG_ROTATION_270 | 旋转 270 度 |
|
| FLAG_MIRROR_NONE | 不镜像 | |
| FLAG_MIRROR_HOR | 水平镜像 | |
| FLAG_MIRROR_VER | 垂直镜像 | |
| FLAG_MIRROR_BOTH | 水平与垂直镜像 |
示例程序
from media.display import * # 导入 display 模块,使用 display 相关接口
from media.media import * # 导入 media 模块,使用 media 相关接口
import os, time, image # 导入 image 模块,使用 image 相关接口
# 使用 LCD 作为显示输出
Display.init(Display.ST7701, width=800, height=480, to_ide=True)
# 初始化媒体管理器
MediaManager.init()
# 创建用于绘图的图像
img = image.Image(800, 480, image.RGB565)
img.clear()
img.draw_string_advanced(0, 0, 32, "Hello World!,你好世界!!!", color=(255, 0, 0))
Display.show_image(img)
try:
while True:
time.sleep(1)
os.exitpoint()
except KeyboardInterrupt as e:
print(" 用户停止:", e)
except BaseException as e:
print(f" 异常:{e}")
Display.deinit()
MediaManager.deinit()