Realsense D435i相机实时采集图像

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值