You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:39:03