如何显示Intel RealSense D435i的Raw Image输入流以控制机械臂?
解决Intel RealSense D435i Raw图像流显示问题
核心逻辑
你拿到的整数列表是像素的原始数值序列,只需先把它转换成OpenCV支持的图像矩阵格式,再通过循环窗口就能实现实时显示。
步骤1:将整数列表转为OpenCV图像矩阵
根据D435i的Raw数据类型,分两种常见场景处理:
场景1:Raw是8位灰度图像(如Y8格式)
每个整数对应0-255的灰度值,直接按640×480的尺寸重构矩阵:
import cv2 import numpy as np # raw_data是你读取到的整数列表,长度必须是640*480=307200 raw_data = [...] # 转成uint8类型的numpy数组,再重构为480行640列的单通道图像 img_array = np.array(raw_data, dtype=np.uint8) img = img_array.reshape((480, 640))
场景2:Raw是16位深度图像(如Z16格式)
深度Raw数据的整数范围是0-65535,需要先映射到0-255的灰度范围才能正常显示:
import cv2 import numpy as np raw_data = [...] # 长度为640*480的整数列表 # 转成uint16类型数组,再映射到8位灰度区间 img_array = np.array(raw_data, dtype=np.uint16) img_16bit = img_array.reshape((480, 640)) img_8bit = cv2.convertScaleAbs(img_16bit, alpha=255/65535)
步骤2:实时显示图像流
用OpenCV循环读取最新帧并显示,匹配30FPS的帧率:
# 创建显示窗口 cv2.namedWindow("RealSense Raw Stream", cv2.WINDOW_NORMAL) while True: # 替换成你获取最新raw_data的逻辑 raw_data = get_latest_raw_frame() # 按上述场景1或2处理得到可显示的图像 img_array = np.array(raw_data, dtype=np.uint8) img = img_array.reshape((480, 640)) # 显示图像 cv2.imshow("RealSense Raw Stream", img) # 控制30FPS,按q键退出 if cv2.waitKey(33) & 0xFF == ord('q'): break # 释放资源 cv2.destroyAllWindows()
额外提示
- 必须保证整数列表长度严格等于
640*480,否则重构矩阵会报错;如果是彩色Raw(如RGB8),列表长度应为640*480*3,重构时要加上通道维度(480,640,3),再用cv2.cvtColor(img, cv2.COLOR_RGB2BGR)转成OpenCV支持的BGR格式。 - 要是你还在手动读取Raw列表,更推荐用
pyrealsense2SDK直接获取原始帧,比手动处理整数列表更稳定:
import pyrealsense2 as rs import cv2 import numpy as np pipe = rs.pipeline() config = rs.config() # 配置Raw灰度流,可根据需求改成深度流或彩色流 config.enable_stream(rs.stream.color, 640, 480, rs.format.y8, 30) pipe.start(config) try: while True: frames = pipe.wait_for_frames() color_frame = frames.get_color_frame() if not color_frame: continue # 直接获取Raw字节流转成numpy数组 img = np.asanyarray(color_frame.get_data()) cv2.imshow("Raw Stream", img) if cv2.waitKey(33) & 0xFF == ord('q'): break finally: pipe.stop() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Mnisyif
相关产品推荐
相关产品推荐

