You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用OpenCV显示串口接收的160×120 8位灰度像素二维数组

解决8位灰度串口数据转OpenCV可显示图像问题

原代码问题分析

  1. frame初始化错误:用列表推导式创建的是Python嵌套列表,并非OpenCV所需的numpy数组格式,无法直接用于显示。
  2. 数据类型不匹配:serial.read()返回的是bytes对象,直接赋值给列表元素虽能得到数值,但OpenCV不支持处理Python列表。
  3. 手动循环效率低且易出错:嵌套循环逐个赋值不仅性能差,还可能因索引计算失误导致图像错位。

正确实现代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:17:34