跳到主要内容

图像3种显示方式

前言

在摄像头拍摄图像后我们需要观察图像,这就涉及如何显示的问题,目前CanMV K230支持3种显示方式。分别是:IDE缓冲区显示、外接HDMI显示器或MIPI显示屏。

实验目的

编程实现摄像头图像的3种不同显示方式。

实验讲解

01Studio CanMV K230开发板目前有3种图像显示方式,各有特点:

  • IDE缓冲区显示:性价比最高,图像质量有一定下降,但能满足大部分场合调试使用。最大支持1920x1080分辨率。
  • HDMI:外接HDMI显示屏,清晰度最高。最大支持1920x1080分辨率。
  • MIPI显示屏:外接01Studio 3.5寸MiPi显示屏,可以一体化组装,适合离线部署调试使用。最大支持800x480分辨率。

以上显示方式均集成在 Display Python API。用户只需要简单修改代码即可实现不同方式显示。

Display对象

构造函数

from media.display import * 

导入Display模块,即可使用Display相关API接口。

使用方法

Display.init(type = None, width = None, height = None, osd_num = 1, to_ide = False, fps = None)

初始化Display模块。

  • type: 显示设备类型。

    • VIRT : IDE缓冲区显示;
    • LT9611 : HDMI显示;
    • ST7701 : mipi显示屏。
  • width: 可选参数,显示图像宽度;

  • height: 可选参数,显示图像高度;

  • to_ide: 同时在IDE显示,仅用于设置为HDMI或MIPI屏显示时使用:

    • True : 同步显示;
    • False : 不显示。

Display.show_image(img, x = 0, y = 0, layer = None, alpha = 255, flag = 0)

显示图像。

  • type: 显示设备类型。

    • VIRT : IDE缓冲区显示;
    • LT9611 : HDMI显示;
    • ST7701 : mipi显示屏。
  • x: 起始横坐标;

  • y: 起始纵坐标。


Display.deinit()

注销Display模块。必须在MediaManager.deinit()之前, 在sensor.stop()之后调用。


更多用法请阅读: CanMV K230官方文档

熟悉Display API用法后,我们来看看代码的编写流程图:

参考代码

'''
实验名称:图像3种显示方式
实验平台:01Studio CanMV K230
说明:实现摄像头图像采集通过IDE、HDMI和MIPI屏显示
'''

import time, os, sys

from media.sensor import * #导入sensor模块,使用摄像头相关接口
from media.display import * #导入display模块,使用display相关接口
from media.media import * #导入media模块,使用meida相关接口

try:

sensor = Sensor() #构建摄像头对象
sensor.reset() #复位和初始化摄像头
sensor.set_framesize(Sensor.FHD) #设置帧大小FHD(1920x1080),缓冲区和HDMI用,默认通道0
#sensor.set_framesize(width=800,height=480) #设置帧大小800x480,LCD专用,默认通道0
sensor.set_pixformat(Sensor.RGB565) #设置输出图像格式,默认通道0

#################################
## 图像3种不同显示方式(修改注释实现)
#################################

Display.init(Display.VIRT, sensor.width(), sensor.height()) #通过IDE缓冲区显示图像
#Display.init(Display.LT9611, to_ide=True) #通过HDMI显示图像
#Display.init(Display.ST7701, to_ide=True) #通过01Studio 3.5寸mipi显示屏显示图像

MediaManager.init() #初始化media资源管理器

sensor.run() #启动sensor

clock = time.clock()

while True:


os.exitpoint() #检测IDE中断

####################
## 这里编写主要代码
####################
clock.tick()

img = sensor.snapshot() #拍摄一张图

Display.show_image(img) #显示图片

print(clock.fps()) #打印FPS


###################
# IDE中断释放资源代码
###################
except KeyboardInterrupt as e:
print("user stop: ", e)
except BaseException as e:
print(f"Exception {e}")
finally:
# sensor stop run
if isinstance(sensor, Sensor):
sensor.stop()
# deinit display
Display.deinit()
os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
time.sleep_ms(100)
# release media buffer
MediaManager.deinit()

实验结果

IDE缓冲区显示

点击运行代码,可以看到在IDE右边显示摄像头实时拍摄图像。

display

HDMI显示器显示

将参考代码中的代码改成LT9611 :

    #################################
## 图像3种不同显示方式(修改注释实现)
#################################

#Display.init(Display.VIRT, sensor.width(), sensor.height()) #通过IDE缓冲区显示图像
Display.init(Display.LT9611 ,to_ide=True) #通过HDMI显示图像
#Display.init(Display.ST7701 ,to_ide=True) #通过01Studio 3.5寸mipi显示屏显示图像

通过HDMI线连接到HDMI显示器: display

运行代码,可以看到HDMI显示摄像头采集图像, 最大支持1080p: display

3.5寸mipi显示屏显示

使用3.5寸mipi显示屏显示图像需要修改2个地方:

将摄像头采集分辨率改成800x480以下:

    #sensor.set_framesize(Sensor.FHD) #设置帧大小FHD(1920x1080),缓冲区和HDMI用,默认通道0
sensor.set_framesize(width=800,height=480) #设置帧大小800x480,LCD专用,默认通道0
sensor.set_pixformat(Sensor.RGB565) #设置输出图像格式,默认通道0

将参考代码中的代码改成ST7701 :

    #################################
## 图像3种不同显示方式(修改注释实现)
#################################

#Display.init(Display.VIRT, sensor.width(), sensor.height()) #通过IDE缓冲区显示图像
#Display.init(Display.LT9611, to_ide=True) #通过HDMI显示图像
Display.init(Display.ST7701, to_ide=True) #通过01Studio 3.5寸mipi显示屏显示图像

通过排线连接01Studio 3.5寸mipi屏: display

运行代码,可以看到mipi屏上显示摄像头采集图像,最大支持800x480: display