如何用OpenCV显示串口接收的160×120 8位灰度像素二维数组
解决8位灰度串口数据转OpenCV可显示图像问题
原代码问题分析
- frame初始化错误:用列表推导式创建的是Python嵌套列表,并非OpenCV所需的numpy数组格式,无法直接用于显示。
- 数据类型不匹配:
serial.read()返回的是bytes对象,直接赋值给列表元素虽能得到数值,但OpenCV不支持处理Python列表。 - 手动循环效率低且易出错:嵌套循环逐个赋值不仅性能差,还可能因索引计算失误导致图像错位。
正确实现代码
import numpy as np import cv2 import serial # 假设串口已初始化完成,示例: # ser = serial.Serial('COM3', 115200) # 读取完整的图像数据 data_size = 160 * 120 dataArray = ser.read(data_size) # 确保接收到完整数据 if len(dataArray) != data_size: print("数据接收不完整") else: # 将bytes数据转换为numpy uint8数组(8位灰度对应格式) frame = np.frombuffer(dataArray, dtype=np.uint8) # 重塑为120行、160列的单通道灰度图 frame = frame.reshape((120, 160)) # 显示图像 cv2.imshow("串口灰度图像", frame) # 等待1ms刷新窗口,若要等待按键关闭可改为cv2.waitKey(0) cv2.waitKey(1) # 程序结束时释放窗口 # cv2.destroyAllWindows()
关键说明
- numpy数组转换:
np.frombuffer()直接将bytes流转为OpenCV兼容的uint8类型数组,这是处理此类数据的高效方式。 - reshape重塑:直接将一维数组转为
(120,160)的二维结构,完全匹配160×120的图像尺寸,无需手动循环赋值。 - 8位灰度格式:生成的
frame是单通道uint8数组,正好符合发送端的内存限制要求,OpenCV可直接识别为灰度图像。
内容的提问来源于stack exchange,提问作者iamadahn
相关产品推荐
相关产品推荐

