当前位置: 首页 > news >正文

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

📌 背景介绍

英特尔的 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:breakfinally: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:breakfinally:pipeline.stop()cv2.destroyAllWindows()print("已停止采集并关闭窗口。")

📎 总结

这个脚本是使用 RealSense 采集左右红外图像的非常实用的起点。你可以基于它进一步扩展,例如:

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

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

http://www.dtcms.com/a/328185.html

相关文章:

  • 扣子空间深度解析
  • 堆排序以及实现
  • 飞算 JavaAI -智慧城市项目实践:从交通协同到应急响应的全链路技术革新
  • 【Go】Gin 超时中间件的坑:fatal error: concurrent map writes
  • FPGA即插即用Verilog驱动系列——UART串口接收
  • 医疗智慧大屏系统 - Flask + Vue实现
  • nextTick和setTimeout的区别
  • Docker概述与安装Dockerfile文件
  • k8s-scheduler 解析
  • 1小时 MySQL 数据库基础速通
  • log4cplus的功能是什么,我们如何来使用它?
  • 调整UOS在VMware中的分辨率
  • Linux系统启动过程详解
  • CTO 如何从“干活的人”转变成“带方向的人”?
  • 需求沟通会议如何组织
  • 云手机在电商行业中的作用
  • 知名车企门户漏洞或致攻击者远程解锁汽车并窃取数据
  • C++ 学习与 CLion 使用:(二)using namespace std 语句详解,以及 std 空间的标识符罗列
  • 消防安全预警系统助力安全生产
  • 【工作笔记】win11系统docker desktop配置国内mirror不生效解决方案汇总整理
  • `SHOW PROCESSLIST;` 返回列详解(含义 + 单位)
  • django celery 动态添加定时任务后不生效问题
  • 【SDR课堂第35讲】通用软件无线电平台USRP7440- RFSOC NCO性能测试(一)
  • android 换肤框架详解3-自动换肤原理梳理
  • JDK 9~17 新特性及升级建议
  • 【154页PPT】某大型再生资源集团管控企业数字化转型SAP解决方案(附下载方式)
  • 麒麟信安“操作系统+云”双驱动,推进某市公安局智慧警务建设
  • 云部署 MCP 服务计费
  • Java 包
  • 飞算JavaAI:Java智能开发工具的技术解析、应用实践