从ROSbag文件中提取CompressedImage为JPG文件

目录

准备工作 

创建py文件(bag2img.py)

运行代码:


准备工作 

- 打开终端1,运行

roscore

- 打开终端2,在bag文件所在目录运行

查看bag文件信息

rosbag info xxx.bag

结果如下图,其中topic “rgb_cam/image_raw/compressed”是需要提取的话题信息

运行bag文件

rosbag play xxx.bag

- 打开终端3,查看话题信息

rostopic list

结果如图,存在“rgb_cam/image_raw/compressed”,说明一切正常

创建py文件(bag2img.py)

内容如下:

# coding:utf-8
#!/usr/bin/python

# Extract images from a bag file.

import rosbag
import cv2
from sensor_msgs.msg import CompressedImage
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError

output_path = '/path/to/save/images/'  # 替换为保存图像的目录路径
frame_interval = 10  # 提取图像的帧间隔

class ImageCreator():
    def __init__(self):
        self.bridge = CvBridge()
        frame_count = 0
        with rosbag.Bag('/path/to/your.bag', 'r') as bag:  # 要读取的bag文件路径
            for topic, msg, t in bag.read_messages():
                if topic == "/rgb_camera/image_raw/compressed":  # 图像的topic
                    if frame_count % frame_interval == 0:  # 每隔frame_interval帧提取一次
                        try:
                            cv_image = self.bridge.compressed_imgmsg_to_cv2(msg, desired_encoding='passthrough')
                        except CvBridgeError as e:
                            print(e)
                        filename = f"{t.to_nsec()}.jpg"  # 使用时间戳作为文件名
                        save_path = output_path + filename
                        cv2.imwrite(save_path, cv_image)  # 保存图像
                        print(f"Saved image: {save_path}")
                    frame_count += 1

if __name__ == '__main__':
    try:
        image_creator = ImageCreator()
    except rospy.ROSInterruptException:
        pass

参数说明:

frame_interval:提取图像的帧间隔

'/path/to/save/images/':输出jpg图像的保存路径

'path/to/your.bag':要读取的bag文件路径

运行代码:

python3 bag2img.py

参考链接

ROS☞通过两种方法提取.bag中的图像数据_从bag包中提取图像-CSDN博客

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值