如何使用Python的bagpy库从bag文件中提取jpg格式图像帧
使用bagpy提取ROS bag中JPG图像帧的方案
完全可以。bagpy是专门为Python3环境开发的ROS bag读取工具,原生支持Python3.7及以上版本,不需要依赖ROS官方的rosbag包,也无需完整安装ROS环境,即可实现图像帧提取。
前置依赖安装
- 安装bagpy核心库:
pip install bagpy - 安装图像处理依赖:
pip install opencv-python numpy - 若bag中存储的是原始未压缩的
sensor_msgs/Image类型消息,需额外安装cv_bridge:pip install cv-bridge
代码实现示例
以下为提取bag中压缩图像话题(sensor_msgs/CompressedImage类型,通常话题名带/compressed后缀)的JPG帧的可运行代码:
import os import numpy as np import cv2 from bagpy import bagreader # 替换为你的bag文件绝对路径 BAG_PATH = "./test.bag" # 替换为你的图像话题名,可通过下方打印的话题列表确认 IMAGE_TOPIC = "/camera/image_raw/compressed" # 图像保存目录 SAVE_DIR = "./extracted_jpg" os.makedirs(SAVE_DIR, exist_ok=True) # 读取bag文件 bag = bagreader(BAG_PATH) # 打印bag中所有话题信息,用于确认图像话题名和类型,不需要可注释 print("bag内所有话题列表:") print(bag.topic_table) # 读取目标话题的所有消息 image_msgs = bag.reader.read_messages(topics=[IMAGE_TOPIC]) frame_count = 0 for topic, msg, timestamp in image_msgs: # 解析压缩图像数据 img_arr = np.frombuffer(msg.data, np.uint8) img = cv2.imdecode(img_arr, cv2.IMREAD_COLOR) # 按帧序号+时间戳命名,避免重名 save_path = os.path.join(SAVE_DIR, f"frame_{frame_count}_{timestamp.to_nsec()}.jpg") cv2.imwrite(save_path, img) frame_count += 1 print(f"提取完成,共保存{frame_count}帧JPG图像到{SAVE_DIR}目录")
注意事项
- 若处理的是原始未压缩的
sensor_msgs/Image类型消息,需用cv_bridge将ROS图像消息转为OpenCV格式,替换解析部分的代码即可 - 读取GB级以上的大bag文件时,建议按需指定读取的话题范围,避免内存占用过高
- 可通过
timestamp.to_sec()获取消息的秒级时间戳,用于和bag内其他传感器数据做时间对齐
内容的提问来源于stack exchange,提问作者Dudes
相关产品推荐
相关产品推荐

