Rosbag提取图片python

#coding:utf-8

import roslib;
import rosbag
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError

path='/home/scy310/下载/img_storage/00/' #存放图片的位置
class ImageCreator():


   def __init__(self):
       self.bridge = CvBridge()
       with rosbag.Bag('/home/scy310/下载/0730.bag', 'r') as bag:   #要读取的bag文件;
           for topic,msg,t in bag.read_messages():
               if topic == "/rgb_publisher/color/image" :  #图像的topic;
                       try:
                           cv_image = self.bridge.imgmsg_to_cv2(msg,"bgr8")
                       except CvBridgeError as e:
                           print (e)
                       timestr = "%.6f" %  msg.header.stamp.to_sec()
                       #%.6f表示小数点后带有6位,可根据精确度需要修改;
                       image_name = timestr+ ".jpg" #图像命名:时间戳.jpg
                       cv2.imwrite(path+image_name, cv_image)  #保存;


if __name__ == '__main__':

   #rospy.init_node(PKG)

   try:
       image_creator = ImageCreator()
   except rospy.ROSInterruptException:
       pass

### 如何从 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、付费专栏及课程。

余额充值