实时保存realsense图片或视频流

博客主要围绕实时保存Realsense图片或视频流展开,虽未给出具体内容,但核心聚焦于Realsense设备的数据保存,在信息技术领域,这涉及图像和视频数据的处理与存储。
# -*- encoding: utf-8 -*-
"""
@File    : save_image.py
@Time    : 2019/10/23 14:44
@Author  : Dontla
@Email   : sxana@qq.com
@Software: PyCharm
"""
import pyrealsense2 as rs
import numpy as np
import cv2
import os
import time

# Configure depth and color streams
pipeline = rs.pipeline()
# 创建 config 对象:
config = rs.config()
# config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

# Start streaming
pipeline.start(config)

try:
    while True:

        # Wait for a coherent pair of frames(一对连贯的帧): depth and color
        frames = pipeline.wait_for_frames()
        # depth_frame = frames.get_depth_frame()
        color_frame = frames.get_color_frame()

        if not color_frame:
            continue

        color_image = np.asanyarray(color_frame.get_data())

        # Show images
        cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)

        cv2.imshow('RealSense', color_image)

        c = cv2.waitKey(1)

        # 手动采集(空格键)
        # 敲击空格将图像保存(空格的ascii码是32)
        if c == 32:

            # 计算文件夹里jpg文件数量,以便于关闭软件后重新打开采集不会将已有图片覆盖
            count = 0
            for filename in os.listdir('./imgs/'):
                if filename.endswith('.jpg'):
                    count += 1
            # print(count)

            # 保存图像,保存到上一层的imgs文件夹内,以1、2、3、4...为文件名保存图像
            cv2.imwrite('./imgs/{}.jpg'.format(count + 1), color_image)

        # 自动采集(回车键)
        # 如果按下回车键则自动采集(回车键ascii码是13)
        if c == 13:
            # 获取时间以在循环中判断是否经过了某段时间
            time0 = time.time()
            flag = True
            while flag:
                # 之前卡死是因为进了这个循环出不去了了,没法wait_for_frames同时opencv窗口也没法waitKey刷新所以就卡死了,所以必须再把wait_for_frames和waitKey加进来

                # Wait for a coherent pair of frames(一对连贯的帧): depth and color
                frames = pipeline.wait_for_frames()
                # depth_frame = frames.get_depth_frame()
                color_frame = frames.get_color_frame()

                if not color_frame:
                    continue

                color_image = np.asanyarray(color_frame.get_data())

                # Show images
                cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)

                cv2.imshow('RealSense', color_image)

                c = cv2.waitKey(1)

                # 计算文件夹里jpg文件数量,以便于关闭软件后重新采集不会将已有图片覆盖
                count = 0
                for filename in os.listdir('./imgs/'):
                    if filename.endswith('.jpg'):
                        count += 1

                # 设置延时时间(单位:秒)
                time_delay = 1
                c = cv2.waitKey(10)
                if c == 13:
                    flag = False
                # 使用经过的时间差来对操作进行延时,这样可避免流停滞,但此方法不完全准确,特别是在我们的操作耗时较长的情况下,延时误差较大。当我们将操作的时间视为无穷小时,此方法准确
                if (time.time() - time0) > time_delay:
                    # 可以看到,实际延时微微大于我们设置的延时时间
                    print(time.time() - time0)
                    # 1.0003252029418945
                    # 1.0017242431640625
                    # 1.0030531883239746
                    # 1.004326343536377
                    # 1.0044221878051758
                    # 1.008774995803833
                    # 1.005782127380371
                    # 1.0061774253845215
                    # 1.010535717010498

                    # 保存图像,保存到上一层的imgs文件夹内,以1、2、3、4...为文件名保存图像
                    cv2.imwrite('./imgs/{}.jpg'.format(count + 1), color_image)

                    # 只让操作在某时间段内只执行一次,下次执行需在延时时间time_delay(秒)后
                    time0 += time_delay

                # 延时一下,不然保存太快翻车咋办
                # 之前卡顿的原因是用了time.sleep函数,导致wait_for_frames变慢了,不能用sleep函数
                # time.sleep(1)

                if c == 27:
                    break

        # 如果按下ESC则关闭窗口(ESC的ascii码为27),同时跳出循环
        if c == 27:
            cv2.destroyAllWindows()
            break

finally:

    # Stop streaming
    pipeline.stop()

<think>我们正在处理用户关于使用realsense-viewer从.bag文件中提取单帧图片的问题。首先,需要明确realsense-viewer是IntelRealSenseSDK的一部分,它提供了图形界面来操作RealSense设备。用户已经录制了.bag文件(一种ROS bag格式,但RealSenseSDK也能处理),现在想从中提取单帧图片。步骤:1.打开realsense-viewer软件。2.加载.bag文件:在软件界面上方,有一个“AddSource”(添加源)按钮,点击后选择“LoadRecorded File”(加载录制文件),然后选择.bag文件。3.播放.bag文件:加载后,软件会显示录制的内容。点击播放按钮(三角形图标)开始播放。4.在播放过程中,可以暂停在某一帧,然后使用截图功能保存当前帧。但是,用户想要的是提取所有帧,而不是手动一帧一帧保存realsense-viewer本身并没有提供批量导出所有帧的功能。因此,我们需要使用其他工具,例如IntelRealSense提供的Python脚本来实现批量导出。推荐方法:使用rs-convert工具(命令行工具)Python脚本。方法一:使用rs-convert(推荐,因为简单)rs-convert是RealSenseSDK自带的一个命令行工具,可以将.bag文件转换为其他格式。安装SDK后,该工具应该位于安装目录的tools文件夹下(Windows)者在系统路径中(Linux)。命令示例:```rs-convert -i input.bag-poutput_image_folder/image_%04d.png```其中:-i指定输入.bag文件-p指定输出图片的路径和命名格式(%04d表示4位数字的序号)这个命令会将.bag文件中的每一帧保存图片。方法二:使用Python脚本如果用户希望用Python,可以使用pyrealsense2库。以下是一个示例脚本:```pythonimport pyrealsense2as rsimport numpyas npimport cv2#配置要处理的.bag文件bag_file ="input.bag"#创建管道并配置pipeline= rs.pipeline()config =rs.config()#告诉配置我们要使用录制的设备config.enable_device_from_file(bag_file)#开始流pipeline.start(config)#创建对齐对象(深度图对齐到彩色图)align_to= rs.stream.coloralign =rs.align(align_to)frame_count=0try:while True:#等待一帧数据frames =pipeline.wait_for_frames()#对齐帧aligned_frames =align.process(frames)color_frame= aligned_frames.get_color_frame()ifnot color_frame:continue#将图像转换为numpy数组color_image= np.asanyarray(color_frame.get_data())#保存图像cv2.imwrite(f"output_image_{frame_count:04d}.png",color_image)frame_count+=1exceptRuntimeErroras e:#当文件结束时,会抛出异常print(e)finally:pipeline.stop()```注意:这个脚本只提取彩色图像帧。如果需要深度图其他流,需要相应调整。方法三:使用ROS工具(如果用户熟悉ROS)如果用户有ROS环境,可以使用rosbag和image_view工具提取图像。总结:对于普通用户,推荐使用方法一(rs-convert),因为它简单直接。如果用户需要编程处理,则可以使用方法二。注意事项:-确保安装的RealSense SDK版本支持rs-convert工具(较新版本都有)。-在提取之前,确保.bag文件确实包含图像流(例如彩色流)。参考引用:IntelRealSense官方文档提供了关于rs-convert的更多信息[^1]。生成相关问题:1.如何安装rs-convert工具?2.在提取帧时如何指定只提取深度图?3.如果.bag文件中同时有多个流(如彩色和深度),如何同时提取?4.使用Python脚本提取时出现错误如何处理?</think>### 使用 realsense-viewer 从 .bag 文件中提取单帧图像 以下是详细步骤(基于 Intel RealSense SDK 2.0): #### 方法 1:通过 GUI 手动提取(适合少量帧) 1. **打开 realsense-viewer** 启动软件后,点击左上角 ☰ 菜单 → "Load Recorded Sequence" → 选择你的 .bag 文件。 2. **定位目标帧** - 使用播放控制条定位到需要提取的帧(拖动进度条使用逐帧按钮) - 暂停播放(⏸️ 按钮) 3. **保存单帧** - 在预览窗口下方点击 **Snapshot** 按钮(相机图标) - 图像将自动保存为 PNG 格式,默认路径: `C:\Users\<用户名>\Documents\Intel RealSense Viewer\captures\<日期>\` #### 方法 2:使用命令行工具批量提取(推荐大批量) realsense-viewer 本身不支持批量导出,但 SDK 提供 **rs-convert** 工具: 1. **打开终端/命令提示符** (需提前安装 [Intel RealSense SDK](https://github.com/IntelRealSense/librealsense)) 2. **执行转换命令** ```bash rs-convert -i input.bag -p output_folder/frame_%04d.png ``` - `-i`:输入 .bag 文件路径 - `-p`:输出路径模板(`%04d` 表示4位数字序号) - 示例输出:`frame_0001.png, frame_0002.png...` 3. **可选参数** - 指定流类型(默认导出所有流): ```bash rs-convert -i input.bag -p color_%04d.png -s color ``` - 导出深度图(需转换为可视格式): ```bash rs-convert -i input.bag -p depth_%04d.png -s depth ``` #### 常见问题解决 1. **找不到 rs-convert** - Windows:默认路径 `C:\Program Files (x86)\Intel RealSense SDK 2.0\tools` - Linux:安装后直接调用 `rs-convert` 2. **帧率控制** 添加 `-f <FPS>` 参数限制导出帧率(例如 `-f 10` 每秒导出10帧) 3. **深度图处理** 导出的深度图是16位灰度PNG,可使用 OpenCV 处理: ```python import cv2 depth = cv2.imread("depth_0001.png", cv2.IMREAD_ANYDEPTH) ``` > **提示**:对于编程提取,推荐使用 `pyrealsense2` 库的 `realsense.recorder` 模块[^1]。 --- ###
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值