LCD只能显示固定分辨率的图片,下面代码可以将任意图片resize成支持的分辨率即800*480,可以试一下下述代码:
from media.display import *
from media.media import *
import nncase_runtime as nn
import ulab.numpy as np
import gc
def read_image_for_display(display_mode,image_path):
# 屏幕显示分辨率
output_w=800
output_h=480
if display_mode=="st7701":
output_w=800
output_h=480
elif display_mode=="lt9611":
output_w=1920
output_h=1080
else:
output_w=800
output_h=480
# 读入图片
img_ori=image.Image(image_path).to_rgb888()
# ST7701只能显示800*480分辨率的图像,需要使用ai2d做resize,实现适配屏幕
# 读入的图片是HWC的,需要使用transpose将数据转成CHW,用于创建ai2d输入tensor,[H,W,C]->[H*W,C]->[C,H*W]->[C,H,W]
img_ori_hwc=img_ori.to_numpy_ref()
shape_input=img_ori_hwc.shape
img_tmp = img_ori_hwc.reshape((shape_input[0] * shape_input[1], shape_input[2]))
img_tmp_trans = img_tmp.transpose().copy()
img_ori_chw=img_tmp_trans.reshape((shape_input[2],shape_input[0],shape_input[1]))
# 构建ai2d的输入和输出tensor,并构造ai2d实例,进行resize配置,并执行resize
ai2d_input_tensor = nn.from_numpy(img_ori_chw)
ai2d_output_np = np.ones((1,3,output_h,output_w),dtype=np.uint8)
ai2d_output_tensor = nn.from_numpy(ai2d_output_np)
ai2d=nn.ai2d()
ai2d.set_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8)
ai2d.set_resize_param(True,nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel)
ai2d_builder = ai2d.build([1,3,img_ori_chw.shape[1],img_ori_chw.shape[2]], [1,3,output_h,output_w])
ai2d_builder.run(ai2d_input_tensor, ai2d_output_tensor)
# 输出tensor转numpy.ndarray
ai2d_output_np=ai2d_output_tensor.to_numpy()[0]
# 输出为CHW,创建Image实例需要使用HWC排布的数据,使用transpose,[C,H,W]->[C,H*W]->[H*W,C]->[H,W,C]
shape_output=ai2d_output_np.shape
img_tmp_ = ai2d_output_np.reshape((shape_output[0],shape_output[1]*shape_output[2]))
img_tmp_trans_ = img_tmp_.transpose().copy()
img_out_hwc=img_tmp_trans_.reshape((shape_output[1],shape_output[2],shape_output[0]))
img_out = image.Image(output_w, output_h, image.RGB888, alloc=image.ALLOC_REF,data =img_out_hwc)
return img_out
Display.init(Display.ST7701,width = 800, height = 480,to_ide=True)
MediaManager.init() #初始化media资源管理器
img_path="/data/test_save.png"
img=read_image_for_display("st7701",img_path)
while True:
Display.show_image(img)
gc.collect()