目录
准备工作
- 打开终端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