Python+OpenCV将彩图数据转成数组供LCD显示

tech2025-04-28  7

Python+OpenCV将彩图数据转成数组供LCD显示

TFTLCD采用的数据格式介绍转换过程

TFTLCD显示彩图的原理相信大家都很熟悉,基本上是采用MCU将图像数据通过SPI、IIC、8080或者6800时序送到LCD的驱动控制器,LCD控制器将驱动显示出彩图。那么从信号源的角度来讲,图像数据的来源变得很重要。行业内比较普遍的做法是在PC端将要显示的jpg或者其他格式的图片文件,通过自己编写的小软件转换成数据文件,比如使用在c或者c++的数组文件。然后再用于其他的编程。采用不同语言的编程,程序的规模和难度不一。合理采用工具,可以大大减少编程的难度。 本文介绍一种采用Python和Opencv的方法将图像文件转成数据文件,共c或者c++编程使用。当然,掌握这个方法后也可以按照自己的需求编写你想要的文件格式。

TFTLCD采用的数据格式介绍

TFTLCD如何根据图像颜色数据不同而现实不同的色彩呢?这里介绍一下用的比较多的两种格式,一是RGB565,第二是RGB888。 顾名思义,RGB565就是表示,LCD上一个像素点的颜色有5+6+5=16bits表示,其中红色、绿色、蓝色三分量分别由5bits,6bits,5bits来表示,那么一共可以显示的颜色有65536种。RGB888也是同理。 图像在PC的存储方式很多,文件格式各不相同,但是通过解码,基本还原为RGB三种分量,我们采用合适的工具将数据提取出来,然后按照要去重新排列。这样就得出要的数据了,最后将数据转成你需要的格式即可。

转换过程

导入需要的库

import cv2 import numpy as np from matplotlib import pyplot as plt

第一个是加载cv2库,主要是处理图像数据的读取等,第二个是numpy库,主要是进行矩阵操作等,后面的plt是画图显示用。

首先读入需要转换的图像,以读取彩图的形式读取并获得图像的行列数。

im = cv2.imread('1.jpg', cv2.IMREAD_COLOR) rows, cols, _ = im.shape

然后建立红绿蓝三组空数组及要目标数组,尺度大小和图像一样,注意是因为要进行移位操作,因此把数据放大,数据类型选择uint32。 将图像数据的三个分量分别读出来。要注意的是opencv读取图像的次序是蓝绿红方式,即0通道时是蓝色数据,1通道时绿色数据,2通道时红色数据。

b = np.zeros((rows, cols), dtype=np.uint32) g = np.zeros((rows, cols), dtype=np.uint32) r = np.zeros((rows, cols), dtype=np.uint32) imgout = np.zeros((rows, cols), dtype=np.uint32) for i in range(0, rows): for j in range(0, cols): b[i, j] = im[i, j, 0] g[i, j] = im[i, j, 1] r[i, j] = im[i, j, 2]

我们采用565格式,因此要对rgb数据做裁减和合并,由于原始rgb数据长度均为8bits,因此采用保留高位,放弃低位原则。 本程序每个像素数据采用16bits模式,刚好是两个字节。具体算法如下: 1、将r数据向右移动3bit,将低位去掉,留下5bit,再将其左移11位,形成16bit的高5bit。 2、同理将g数据右移2位,留下6bit,再左移5位,形成中间的6bit。 3、对b进行同样的处理。 4、最后将三个数据合并,得到最终的结果。

for i in range(0, rows): for j in range(0, cols): red = np.right_shift(r[i, j], 3) red = np.left_shift(red, 11) green = np.right_shift(g[i, j], 2) green = np.left_shift(green, 5) blue = np.right_shift(b[i, j], 3) imgout[i, j] = red + green + blue

最后就是将数据准换成16进制字符型,写到文件。 本次只是简单示例。具体到符合c使用的文件格式,大家可以自己动手做一做,比如如何加上unsigned int等字样,最后的一个‘,’号如何去掉。

f = open("file.txt", "w") for i in range(0, rows): for j in range(0, cols): f.write(hex(imgout[i, j]) + ',') f.close()

谢谢。

最新回复(0)