Realsense .bag 格式文件提取图像

使用Realsense d415录制了一个视频,保存的格式为.bag
在网上察查了一些方法,基本都是通过ROS库那一套东西实现.bag文件的解析。还有的文章提到了使用Matlab里面的ROS Toolbox对.bag文件进行解码:

使用Matlab提取Realsense数据的一种实现

然而我在尝试使用Matlab的时候始终不成功,一直在报错,最终只好无奈放弃。

最后经过在librealsense2的github上翻了两个多小时,终于找到了一种使用Realsense SDK直接提取图片的方法

使用SDK从bag里提取图片并进行后处理的方法

简单来讲,就是把录制好的.bag文件当成视频流加载到数据管道pipeline中,然后用正常获取图像的方法从这个之前已经录制好的视频流中读取帧信息。这一步可以参考官方给出的图像对齐示例:

深度图片对齐到彩色图片

注意这里提取出的帧信息是原始信息,我们在使用GUI界面录制视频的时候可能会选择一些不同的filter来提升显示效果,但是直接从.bag中提取出来的图像是没有这些filter的效果的。如果需要的话就得手动重新添加filter。

此处附上稍加改动后的提取代码

rs2::config cfg;
cfg.enable_stream(RS2_STREAM_COLOR);
cfg.enable_stream(RS2_STREAM_DEPTH);
cfg.enable_device_from_file("test.bag");
rs2::pipeline pipe;
pipe.start(cfg);

rs2::device device = pipe.get_active_profile().get_device();
rs2::playback play_back = device.as();
play_back.set_real_time(false);

frameNum = 0
while (true)
{
    rs2:frameset frames = pipe.wait_for_frames();
    auto color_frame = frames.get_color_frame();
    cout << "frame number" << color_frame.get_frame_number() << endl;
    if (frameNum > color_frame.get_frame_number())
        break;
}

这里还有两点值得注意:
1.set_real_time(false)是为了防止由于后处理的过程时间太长导致的数据流被动丢帧
2.使用set_real_time防止丢帧的方法在2.16.1版本之后才真正有效果。

最后顺便贴一下有关基础操作的两个代码
自己写代码直接从相机获取视频图像的时候Visual Preset的设置方法

一些简单使用的API操作方法

你可能感兴趣的:(Realsense .bag 格式文件提取图像)