使用 RealSense D435 获取红外图像:完整 Python 脚本解析

发布于:2025-08-13 ⋅ 阅读:(19) ⋅ 点赞:(0)

📌 背景介绍

英特尔的 RealSense D435 是一款常用于 3D 视觉、深度测量与红外成像的相机。本篇文章将分享一个用于采集 D435 红外图像的完整 Python 脚本,并逐步解释代码逻辑,帮助你快速上手红外图像的采集与保存任务。

我们将实现的功能包括:

  • 开启 RealSense 的左右红外传感器
  • 实时显示红外图像
  • 按时间戳保存红外图像
  • 可选开启/关闭红外投影器(IR Emitter)

🧠 脚本功能一览

以下是本脚本的主要功能模块:

  1. 创建数据保存目录
  2. 配置 RealSense 流与红外传感器
  3. 选择是否启用红外投影器
  4. 获取并显示左右红外图像
  5. 保存红外图像
  6. 按下 ESC 退出程序

🧱 脚本结构详解

import pyrealsense2 as rs
import numpy as np
import cv2
import os
import time

导入必要的库:

  • pyrealsense2: RealSense 官方 Python API
  • cv2: 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 采集左右红外图像的非常实用的起点。你可以基于它进一步扩展,例如:

  • 同步彩色图像与深度图像
  • 进行红外立体匹配计算深度
  • 用于医学、工业等领域的低光图像采集

欢迎大家试用并反馈问题或改进建议!


网站公告

今日签到

点亮在社区的每一天
去签到