ros从bag文件中提取图片

本文介绍了如何在ROS环境中安装必要的包,通过`rosbaginfo`查找图像话题,创建文件夹提取bag文件中图片,设置帧率,并执行`rosbagplay`来播放bag文件中的图像数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.安装依赖的包:

sudo apt-get install ros-noetic-image-view

2.运行rosbag info 查看包中图像的话题名:

rosbag info xxx.bag

3.新建文件夹用于储存提取后的图片,在该文件夹下打开终端,运行:

rosrun image_view extract_images _sec_per_frame:=0.01 image:=<IMAGETOPICINBAGFILE>

sec_per_frame是提取图片的帧率:

<IMAGETOPICINBAGFILE>为bag文件中储存图片的topic

4.播放bag包

rosbag play xxx.bag

### 如何从 ROS Bag 文件提取图像数据 #### 方法一:通过 Launch 文件提取图片 可以通过创建一个 launch 文件来订阅特定的 topic 并保存接收到的消息为图片文件。这种方法适用于简单的场景,其中只需要处理少量主题的数据[^2]。 以下是实现此功能的一个简单示例: ```xml <launch> <!-- 设置参数 --> <param name="/use_sim_time" value="true"/> <!-- 启动 image_view 节点用于保存图片 --> <node pkg="image_view" type="extract_images" name="extractor" output="screen"> <remap from="image" to="/camera/image_raw"/> <param name="sec_per_frame" value="0.5"/> </node> </launch> ``` 在此配置中,`/camera/image_raw` 是要从中提取图片的主题名称。如果 bag 文件中的主题不同,则需要相应修改 `to=` 的值。 --- #### 方法二:使用 Python 脚本直接提取 CompressedImage 图像 另一种更灵活的方式是编写自定义 Python 脚本来解析 bag 文件提取所需的图像数据。这种方式尤其适合复杂需求或批量操作[^3]。 下面是一个完整的 Python 实现例子: ```python #!/usr/bin/env python import rospy import rosbag from cv_bridge import CvBridge import cv2 import os def extract_images_from_bag(bag_file, output_dir, image_topic): """ 从指定的 ROS bag 文件提取图像数据。 参数: - bag_file (str): 输入的 .bag 文件路径。 - output_dir (str): 输出目录路径。 - image_topic (str): 包含图像消息的主题名。 """ bridge = CvBridge() count = 0 with rosbag.Bag(bag_file, 'r') as bag: for _, msg, _ in bag.read_messages(topics=[image_topic]): try: # 将 ROS Image 消息转换为 OpenCV 格式的图像 if hasattr(msg, 'format') and 'compressed' in msg.format: # 处理压缩图像 np_arr = np.frombuffer(msg.data, np.uint8) cv_image = cv2.imdecode(np_arr, cv2.IMREAD_COLOR) else: # 非压缩图像 cv_image = bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8') img_name = f"{output_dir}/frame_{count}.png" cv2.imwrite(img_name, cv_image) # 保存图像到磁盘 print(f"Saved {img_name}") count += 1 except Exception as e: print(f"Error processing message: {e}") if __name__ == '__main__': import argparse parser = argparse.ArgumentParser(description='Extract images from a ROS bag file.') parser.add_argument('bag_file', help='Input ROS bag file path.') parser.add_argument('output_dir', help='Output directory for extracted images.') parser.add_argument('image_topic', help='Topic containing the image data.') args = parser.parse_args() if not os.path.exists(args.output_dir): os.makedirs(args.output_dir) extract_images_from_bag(args.bag_file, args.output_dir, args.image_topic) ``` 上述代码会遍历给定的 bag 文件,并将所有来自指定主题的图像保存为 PNG 文件。注意,这段代码支持解码标准的 `sensor_msgs/Image` 类型以及 `CompressedImage` 类型的消息。 --- #### 注意事项 - **依赖项安装** 确保已安装必要的工具包,例如 `cv_bridge`, `opencv-python` 和 `rosbag`。如果没有,请先执行以下命令: ```bash sudo apt-get install ros-noetic-cv-bridge python-opencv pip install opencv-python ``` - **主题匹配** 确认目标 bag 文件中存在的实际主题名称与脚本中的设置一致。可以使用如下命令查看可用主题列表: ```bash rostopic list -b /path/to/bagfile.bag ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值