📌 背景介绍
英特尔的 RealSense D435 是一款常用于 3D 视觉、深度测量与红外成像的相机。本篇文章将分享一个用于采集 D435 红外图像的完整 Python 脚本,并逐步解释代码逻辑,帮助你快速上手红外图像的采集与保存任务。
我们将实现的功能包括:
- 开启 RealSense 的左右红外传感器
- 实时显示红外图像
- 按时间戳保存红外图像
- 可选开启/关闭红外投影器(IR Emitter)
🧠 脚本功能一览
以下是本脚本的主要功能模块:
- 创建数据保存目录
- 配置 RealSense 流与红外传感器
- 选择是否启用红外投影器
- 获取并显示左右红外图像
- 保存红外图像
- 按下 ESC 退出程序
🧱 脚本结构详解
import pyrealsense2 as rs
import numpy as np
import cv2
import os
import time
导入必要的库:
pyrealsense2
: RealSense 官方 Python APIcv2
: OpenCV 图像处理库numpy
: 数组处理os
,time
: 用于文件操作与时间戳命名
1. 创建图像保存目录与配置红外投影器
save_dir = r"C:\Users\24605\Desktop\Realsense\Save_Img"
os.makedirs(save_dir, exist_ok=True) # 如果目录不存在则创建
set_depth_sensor = 0 # 设置是否开启红外投影器(0关,1开)
- 设置图像保存路径
set_depth_sensor
控制是否启用 D435 的红外投影器(用于主动投射红外光)
2. 配置并启动 RealSense 管道
pipeline = rs.pipeline()
config = rs.config()
# 启用两个红外流(左:1,右:2)
config.enable_stream(rs.stream.infrared, 1, 1280, 720, rs.format.y8, 30)
config.enable_stream(rs.stream.infrared, 2, 1280, 720, rs.format.y8, 30)
# 启动流
profile = pipeline.start(config)
- 使用 RealSense 的管道式配置
- 以 1280x720、30FPS 启用左右两个红外流
3. 控制红外投影器状态(IR Emitter)
device = profile.get_device()
depth_sensor = device.query_sensors()[0]
if depth_sensor.supports(rs.option.emitter_enabled):
depth_sensor.set_option(rs.option.emitter_enabled, set_depth_sensor)
- 获取设备传感器
- 判断是否支持红外投影器控制
- 设置其开关状态
4. 读取与展示红外图像帧
frames = pipeline.wait_for_frames()
ir_left = frames.get_infrared_frame(1)
ir_right = frames.get_infrared_frame(2)
ir_left_img = np.asanyarray(ir_left.get_data())
ir_right_img = np.asanyarray(ir_right.get_data())
cv2.imshow('IR Left', ir_left_img)
cv2.imshow('IR Right', ir_right_img)
- 每一帧图像分别读取左、右红外图
- 转换为 NumPy 数组并通过 OpenCV 显示
5. 自动保存图像
timestamp = time.strftime("%Y%m%d_%H%M%S")
cv2.imwrite(os.path.join(save_dir, f"ir_left_{timestamp}.png"), ir_left_img)
cv2.imwrite(os.path.join(save_dir, f"ir_right_{timestamp}.png"), ir_right_img)
- 以时间戳命名并保存图像
6. 退出逻辑与资源释放
if cv2.waitKey(1) & 0xFF == 27:
break
finally:
pipeline.stop()
cv2.destroyAllWindows()
- 按
ESC
键退出 - 停止数据流,关闭窗口,释放资源
✅ 运行效果
运行脚本后将看到两个窗口分别显示 左红外图像 和 右红外图像,并在后台持续以时间戳保存 .png
文件。
💡 完整代码
import pyrealsense2 as rs
import numpy as np
import cv2
import os
import time
"""
zjy_20250812
该脚本用以获取RealSense的红外相机数据
(1)开启两个窗口,分别展示左右红外相机的数据
(2)修改set_depth_sensor,配置是否启用红外投影器(0关1开)
"""
# ====== 基础配置 ======
save_dir = r"C:\Users\24605\Desktop\Realsense\Save_Img"
os.makedirs(save_dir, exist_ok=True) # 创建文件夹
set_depth_sensor = 0 # 0关1开
# 1. 创建管道
pipeline = rs.pipeline()
config = rs.config()
# 2. 启用红外流(左红外 + 右红外)
config.enable_stream(rs.stream.infrared, 1, 1280, 720, rs.format.y8, 30) # 左红外
config.enable_stream(rs.stream.infrared, 2, 1280, 720, rs.format.y8, 30) # 右红外
# 3. 启动流
profile = pipeline.start(config)
# 4. 关闭红外投影器(IR Emitter)
device = profile.get_device()
depth_sensor = device.query_sensors()[0] # 一般第0个是深度传感器
if depth_sensor.supports(rs.option.emitter_enabled):
depth_sensor.set_option(rs.option.emitter_enabled, set_depth_sensor)
if set_depth_sensor == 1:
print("已开启红外投影器。")
if set_depth_sensor == 0:
print("已关闭红外投影器。")
print("开始采集 D435 红外图像,按 ESC 退出...")
try:
while True:
# 等待一帧数据
frames = pipeline.wait_for_frames()
ir_left = frames.get_infrared_frame(1) # 左红外
ir_right = frames.get_infrared_frame(2) # 右红外
# 转成 numpy 数组
ir_left_img = np.asanyarray(ir_left.get_data())
ir_right_img = np.asanyarray(ir_right.get_data())
# 显示
cv2.imshow('IR Left', ir_left_img)
cv2.imshow('IR Right', ir_right_img)
# 保存文件(时间戳命名)
timestamp = time.strftime("%Y%m%d_%H%M%S")
cv2.imwrite(os.path.join(save_dir, f"ir_left_{timestamp}.png"), ir_left_img)
cv2.imwrite(os.path.join(save_dir, f"ir_right_{timestamp}.png"), ir_right_img)
# 按 ESC 退出
if cv2.waitKey(1) & 0xFF == 27:
break
finally:
pipeline.stop()
cv2.destroyAllWindows()
print("已停止采集并关闭窗口。")
📎 总结
这个脚本是使用 RealSense 采集左右红外图像的非常实用的起点。你可以基于它进一步扩展,例如:
- 同步彩色图像与深度图像
- 进行红外立体匹配计算深度
- 用于医学、工业等领域的低光图像采集
欢迎大家试用并反馈问题或改进建议!