Display

目录

参见:Display 示例讲解 — CanMV K230

概述

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

描述

sensorvdec 模块的输出绑定到屏幕显示。无需用户手动干预即可持续显示图像。 必须在 init 之前调用

语法

bind_layer(src=(mod, dev, layer), dstlayer, rect=(x, y, w, h), pix_format, alpha, flag)

参数

参数名称 描述 输入 / 输出 说明
src sensorvdec 的输出信息 输入 可通过 sensor.bind_info() 获取
dstlayer 绑定到 Display 的 显示层 输入 可绑定到 videoosd
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_imagebind_layer 使用
LAYER_OSD1 支持show_imagebind_layer 使用
LAYER_OSD2 支持show_imagebind_layer 使用
LAYER_OSD3 支持show_imagebind_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()