1.Realsense D435i相机总共有三个镜头外加一个红外投射器,其中由左红外与右红外相机镜头组成的深度坐标系以及RGB相机镜头的彩色图像坐标系,如下所示:
//深度坐标系以左红外镜头光心为原点,其x轴由左红外光心指向右红外光心,y轴依据像素平面垂直向下,z轴垂直于相机镜面向前。
RGB(彩色图像)坐标系以RGB镜头光心为原点,其x轴,y轴、z轴与深度坐标系正方向相同。
//深度坐标系对应的镜头内参就是左红外镜头的内参,并且左红外镜头与右红外镜头内参相同;彩色图像坐标系对应的镜头内参就是RGB镜头的内参;彩色图像坐标系与深度坐标系的外参就是RGB镜头到左红外镜头的转换矩阵。需要注意的是,三个镜头的内参均与分辨率有关,分辨率不同,对应内参也不同,一般是指定RGB镜头分辨率为1280×720,左/右红外镜头分辨率为848×480。
2.三个镜头采集图像的代码共分为两种:
1)一种是每按下“空格键”一次即同步采集左红外图像、右红外图像以及彩色图像各一张,按“esc”键退出采集窗口,如下:
import pyrealsense2 as rs
import numpy as np
import cv2
import os
# 创建保存目录
def create_dirs():
base_dir = r'caiji'#设置保存文件的绝对路径
rgb_dir = os.path.join(base_dir, 'rgb')
left_dir = os.path.join(base_dir, 'left')
right_dir = os.path.join(base_dir, 'right')
os.makedirs(rgb_dir, exist_ok=True)
os.makedirs(left_dir, exist_ok=True)
os.makedirs(right_dir, exist_ok=True)
return rgb_dir, left_dir, right_dir
# 创建 Pipeline
pipeline = rs.pipeline()
config = rs.config()
# 配置RGB相机流 - 使用不同的分辨率
RGB_WIDTH = 1280
RGB_HEIGHT = 720
FPS = 30#表示30帧/s
config.enable_stream(rs.stream.color, RGB_WIDTH, RGB_HEIGHT, rs.format.bgr8, FPS)
config.enable_stream(rs.stream.infrared, 1, 848, 480, rs.format.y8, FPS) # 左红外分辨率
config.enable_stream(rs.stream.infrared, 2, 848, 480, rs.format.y8, FPS) # 右红外分辨率
# 启动 Pipeline
profile = pipeline.start(config)
# 获取相机设备,并禁用红外发射器(补光)
device = profile.get_device()
depth_sensor = device.first_depth_sensor()
depth_sensor.set_option(rs.option.emitter_enabled, 0) # 关闭补光功能
try:
rgb_dir, left_dir, right_dir = create_dirs()
file_index = 1 # 初始化文件序号
while True:
frames = pipeline.wait_for_frames()
color_frame = frames.get_color_frame()
left_ir_frame = frames.get_infrared_frame(1)
right_ir_frame = frames.get_infrared_frame(2)
if not color_frame or not left_ir_frame or not right_ir_frame:
continue
# 转换为numpy数组
color_image = np.asanyarray(color_frame.get_data())
left_ir_image = np.asanyarray(left_ir_frame.get_data())
right_ir_image = np.asanyarray(right_ir_frame.get_data())
# 显示图像
cv2.imshow('RGB', color_image)
cv2.imshow('Left IR', left_ir_image)
cv2.imshow('Right IR', right_ir_image)
# 获取按键输入
key = cv2.waitKey(1) & 0xFF
# 按'esc'退出
if key == 27: # esc key
break
# 按'space'保存图像
elif key == 32: # space key
# 保存RGB图像
cv2.imwrite(os.path.join(rgb_dir, f'zt{file_index:02d}_rgb.png'), color_image)
# 保存左红外图像
cv2.imwrite(os.path.join(left_dir, f'zt{file_index:02d}_left.png'), left_ir_image)
# 保存右红外图像
cv2.imwrite(os.path.join(right_dir, f'zt{file_index:02d}_right.png'), right_ir_image)
print(f"Images saved as zt{file_index:02d}")
file_index += 1 # 增加文件序号
finally:
pipeline.stop()
cv2.destroyAllWindows()
2)另一种是按照间隔帧数(30帧/s)定时采集左红外图像、右红外图像以及彩色图像,按“esc”键退出采集窗口,如下:
import pyrealsense2 as rs
import numpy as np
import cv2
import os
# 创建保存目录
def create_dirs():
base_dir = r'caiji'#设定采集图像的绝对路径
rgb_dir = os.path.join(base_dir, 'rgb')
left_dir = os.path.join(base_dir, 'left')
right_dir = os.path.join(base_dir, 'right')
os.makedirs(rgb_dir, exist_ok=True)
os.makedirs(left_dir, exist_ok=True)
os.makedirs(right_dir, exist_ok=True)
return rgb_dir, left_dir, right_dir
# 创建 Pipeline
pipeline = rs.pipeline()
config = rs.config()
# 配置相机流 - 使用不同的分辨率
RGB_WIDTH = 1280
RGB_HEIGHT = 720
FPS = 30
config.enable_stream(rs.stream.color, RGB_WIDTH, RGB_HEIGHT, rs.format.bgr8, FPS)
config.enable_stream(rs.stream.infrared, 1, 848, 480, rs.format.y8, FPS) # 左红外
config.enable_stream(rs.stream.infrared, 2, 848, 480, rs.format.y8, FPS) # 右红外
# 启动 Pipeline
profile = pipeline.start(config)
# 获取相机设备,并禁用红外发射器(补光)
device = profile.get_device()
depth_sensor = device.first_depth_sensor()
depth_sensor.set_option(rs.option.emitter_enabled, 0) # 关闭补光功能
try:
rgb_dir, left_dir, right_dir = create_dirs()
file_index = 1 # 初始化文件序号
auto_save = False # 初始化自动保存标志为False
frame_interval = 30 # 设置帧间隔为30帧,此时即每秒保存一次图像,60帧即2s采集一次
frame_count = 0 # 初始化帧计数器
while True:
frames = pipeline.wait_for_frames()
color_frame = frames.get_color_frame()
left_ir_frame = frames.get_infrared_frame(1)
right_ir_frame = frames.get_infrared_frame(2)
if not color_frame or not left_ir_frame or not right_ir_frame:
continue
# 转换为numpy数组
color_image = np.asanyarray(color_frame.get_data())
left_ir_image = np.asanyarray(left_ir_frame.get_data())
right_ir_image = np.asanyarray(right_ir_frame.get_data())
# 显示图像
cv2.imshow('RGB', color_image)
cv2.imshow('Left IR', left_ir_image)
cv2.imshow('Right IR', right_ir_image)
# 获取按键输入
key = cv2.waitKey(1) & 0xFF
# 按'esc'退出
if key == 27: # esc key
break
# 按'space'开始或停止自动保存
elif key == 32: # space key
auto_save = not auto_save # 切换自动保存状态
print("Auto save:", "On" if auto_save else "Off")
# 如果自动保存标志为True,则检查帧计数器是否达到帧间隔
if auto_save:
frame_count += 1
if frame_count >= frame_interval:
# 保存RGB图像
cv2.imwrite(os.path.join(rgb_dir, f'zt{file_index:02d}_rgb.png'), color_image)
# 保存左红外图像
cv2.imwrite(os.path.join(left_dir, f'zt{file_index:02d}_left.png'), left_ir_image)
# 保存右红外图像
cv2.imwrite(os.path.join(right_dir, f'zt{file_index:02d}_right.png'), right_ir_image)
print(f"Images saved as zt{file_index:02d}")
file_index += 1 # 增加文件序号
frame_count = 0 # 重置帧计数器
finally:
pipeline.stop()
cv2.destroyAllWindows()
3)仅按照间隔帧数(30帧/s)定时采集彩色图像,按“esc”键退出采集窗口,如下:
import pyrealsense2 as rs
import numpy as np
import cv2
import os
# 创建保存目录
def create_dirs():
base_dir = r'caiji'#设定保存图像文件的据对路径
rgb_dir = os.path.join(base_dir, 'rgb')
os.makedirs(rgb_dir, exist_ok=True)
return rgb_dir
# 创建 Pipeline
pipeline = rs.pipeline()
config = rs.config()
# 配置相机流 - 使用不同的分辨率
RGB_WIDTH = 1280
RGB_HEIGHT = 720
FPS = 30
config.enable_stream(rs.stream.color, RGB_WIDTH, RGB_HEIGHT, rs.format.bgr8, FPS)
# 启动 Pipeline
profile = pipeline.start(config)
# 获取相机设备,并禁用红外发射器(补光)
device = profile.get_device()
depth_sensor = device.first_depth_sensor()
depth_sensor.set_option(rs.option.emitter_enabled, 0) # 关闭补光功能
try:
rgb_dir = create_dirs()
file_index = 1 # 初始化文件序号
frame_count = 0 # 初始化帧计数器
while True:
frames = pipeline.wait_for_frames()
frame_count += 1 # 每捕获一帧,计数器加1
color_frame = frames.get_color_frame()
if not color_frame:
continue
# 转换为numpy数组
color_image = np.asanyarray(color_frame.get_data())
# 显示图像
cv2.imshow('RGB', color_image)
# 获取按键输入
key = cv2.waitKey(1) & 0xFF
# 按'esc'退出
if key == 27: # esc key
break
# 每30帧保存一次RGB图像
if frame_count % 30 == 0:##!!!!!!此处的数字30表示每间隔30帧自动采集一次彩色图像,间隔帧数可自行设定
# 保存RGB图像
cv2.imwrite(os.path.join(rgb_dir, f'zt{file_index:02d}_rgb.png'), color_image)
print(f"Images saved as zt{file_index:02d}")
file_index += 1 # 增加文件序号
finally:
pipeline.stop()
cv2.destroyAllWindows()