本文介绍了如何将 realsense-viewer 录制的 rosbag 格式的视频导出成图片序列,方便合并成 mp4 视频或插入到论文中。

说明

Intel 提供的 realsense-viewer 软件录制的视频都是 rosbag 格式的,为了编写论文,需要从录制的视频中截取一两帧作为论文插图,所以需要使用工具把 rosbag 中的视频导出为图片。

最简单的方式肯定是直接 rosplay 播放 bag 里面的视频流然后使用 image_view 读取视频流然后截图,但是这个方式不太好,因为手动截图非常容易出现分辨率差异(框选的区域不一样),而且 rosplay 播放视频的时候不能暂停,也不好精确的截到自己想要的那张图片。

更好的方式是使用 ros 自带的工具把 rosbag 里面的视频流直接导出成图片序列,避免自己手动截图。在最终导出的图片序列里面选一两个插入到论文里面就 ok 了。

操作

首先,realsense-viewer 录制的视频默认存放在用户的 ~/Documents 文件夹里面,命名格式一般是今天的日期加上一串数字,比如 20250331_172324.bag。首先要做的是确定我们需要的视频数据 topic 名称,使用如下命令查看

bash
1
rostopic list -b example.bag

以我使用的 RealSense D435 为例,图像 topic 是下面这俩个,分别对应深度数据和 RGB 数据。我要的是 RGB 数据。

plaintext
1
2
/device_0/sensor_1/Color_0/image/data
/device_0/sensor_0/Depth_0/image/data

先使用另外一个终端 A,开启 roscore,然后在终端 B 里面执行如下命令,工具会在这个命令执行的目录中输出图片序列。这个命令中使用了 extract_images 工具,并通过_sec_per_frame 指定每 0.01 秒截取一张图片,通过 image:= 订阅的 topic 正是我需要的 RGB 图像 topic。

bash
1
2
3
rosrun image_view extract_images \
_sec_per_frame:=0.01 \
image:=/device_0/sensor_1/Color_0/image/data

再开启一个终端 C,执行 rosbag play 命令来播放 bag 文件里面的视频,其中 --topics 选项用于列出我们想要广播的 topic 是谁。

bash
1
2
rosbag play exmaple.bag \
--topics /device_0/sensor_1/Color_0/image/data

执行之后,extract_images 工具就会自动从这个订阅的 topic 中截取视频流,输出到执行这个命令的 PWD 里面了,如下所示。图片文件的默认命名格式是 frame%04.jpg,工具会自动命名序号。

plaintext
1
2
3
4
king@ubuntu:~/Documents$ ls images/
frame0000.jpg frame0164.jpg frame0328.jpg frame0492.jpg frame0656.jpg
frame0001.jpg frame0165.jpg frame0329.jpg frame0493.jpg frame0657.jpg
...

图片输出结果如下图所示:

image.png

注:如果你想把这些图片重新组成一个 mp4 格式的视频,可以用 ffmpeg 工具实现。

The end

至此,问题解决。