使用 Python 从 ROS Bag 中提取图像:详解与实现

在机器人应用中,ROS (Robot Operating System) 是一个常见的框架。ROS Bag(rosbag)是 ROS 中用于记录和回放数据流(例如传感器数据、话题消息等)的一种强大工具。有时,我们需要将存储在 rosbag 文件中的图像数据提取并保存为图像文件以便进一步分析或处理。本文将介绍如何编写一个 Python 脚本,从 rosbag 文件中提取图像并保存为 PNG 文件。


功能概述

该脚本的主要功能包括:

  1. 读取指定的 ROS Bag 文件。
  2. 从指定的话题(Topic)中提取图像数据。
  3. 使用 OpenCV 将图像保存为 PNG 格式文件。
  4. 提供灵活的命令行参数,支持不同的输入文件、输出目录和话题。

注意:

如果ROS Bag中的图像数据为sensor_msgs/CompressedImage通过以下方式先转换为sensor_msgs/Image,重新录制一个Bag

rosrun image_transport republish compressed in:=/camera/color/image_raw raw out:=/camera/color/image_raw

脚本实现

下面是完整的 Python 脚本代码:

1. 普通RGB(sensor_msgs/Image)图像

#!/usr/bin/env python3
import argparse
import cv2
import os
import rosbag
from sensor_msgs.msg import Image
from cv_bridge import CvBridgedef extract_images_from_bag(bag_file, output_dir, image_topic):# 打开rosbag文件bag = rosbag.Bag(bag_file, 'r')bridge = CvBridge()count = 0# 读取指定话题的消息for topic, msg, t in bag.read_messages(topics=[image_topic]):try:# 将ROS消息转换为OpenCV图像cv_image = bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')except Exception as e:print(f"Error converting image: {e}")continue# 保存为图像文件image_filename = os.path.join(output_dir, f"frame_{count:06d}.png")cv2.imwrite(image_filename, cv_image)count += 1print(f"Image {count} saved to {image_filename}")# 关闭rosbag文件bag.close()print(f"Processed {count} images.")def main():# 使用argparse处理命令行参数parser = argparse.ArgumentParser(description="Extract images from a rosbag and save them as files.")parser.add_argument("bag_file", help="The rosbag file to extract images from")parser.add_argument("output_dir", help="Directory to save the extracted images")parser.add_argument("image_topic", help="Image topic to subscribe to")args = parser.parse_args()# 确保输出目录存在if not os.path.exists(args.output_dir):os.makedirs(args.output_dir)# 从rosbag中提取图像extract_images_from_bag(args.bag_file, args.output_dir, args.image_topic)if __name__ == '__main__':main()

2. 8UC3红外图像

#!/usr/bin/env python3
import argparse
import cv2
import os
import rosbag
from sensor_msgs.msg import Image
from cv_bridge import CvBridgedef extract_images_from_bag(bag_file, output_dir, image_topic):# 打开rosbag文件bag = rosbag.Bag(bag_file, 'r')bridge = CvBridge()count = 0# 读取指定话题的消息for topic, msg, t in bag.read_messages(topics=[image_topic]):try:# 检查图像的编码格式if msg.encoding == '8UC3':# 直接转换为OpenCV图像cv_image = bridge.imgmsg_to_cv2(msg, desired_encoding='passthrough')else:# 转换为指定的颜色编码(例如 'bgr8')cv_image = bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')except Exception as e:print(f"Error converting image: {e}")continue# 保存为图像文件image_filename = os.path.join(output_dir, f"frame_{count:06d}.png")cv2.imwrite(image_filename, cv_image)count += 1print(f"Image {count} saved to {image_filename}")# 关闭rosbag文件bag.close()print(f"Processed {count} images.")def main():# 使用argparse处理命令行参数parser = argparse.ArgumentParser(description="Extract images from a rosbag and save them as files.")parser.add_argument("bag_file", help="The rosbag file to extract images from")parser.add_argument("output_dir", help="Directory to save the extracted images")parser.add_argument("image_topic", help="Image topic to subscribe to")args = parser.parse_args()# 确保输出目录存在if not os.path.exists(args.output_dir):os.makedirs(args.output_dir)# 从rosbag中提取图像extract_images_from_bag(args.bag_file, args.output_dir, args.image_topic)if __name__ == '__main__':main()

脚本讲解

1. 依赖库

该脚本依赖以下库:

  • rosbag:用于读取 ROS Bag 文件。
  • cv_bridge:将 ROS 的图像消息转换为 OpenCV 格式。
  • cv2:OpenCV 的核心库,用于图像处理和文件保存。
  • argparse:用于解析命令行参数。

安装依赖库

在运行脚本前,需要确保已安装这些依赖项。以下是安装命令:

pip install opencv-python
sudo apt install python3-rosbag python3-cv-bridge

脚本功能详解

2. 主要功能模块

2.1 从 ROS Bag 中提取图像

extract_images_from_bag 函数是脚本的核心部分,主要完成以下任务:

  1. 读取 Bag 文件
    使用 rosbag.Bag 打开指定的 ROS Bag 文件以便提取数据。

  2. 遍历消息
    使用 bag.read_messages 遍历指定话题中的所有消息。

  3. 转换图像
    借助 cv_bridge 将 ROS 格式的图像消息(sensor_msgs/Image)转换为 OpenCV 格式的图像数据。

  4. 保存图像
    使用 cv2.imwrite 将提取的图像保存为 PNG 文件,文件名格式为 frame_000001.pngframe_000002.png 等。


2.2 命令行参数解析

该脚本使用 argparse 支持灵活的命令行参数配置,支持以下参数:

  • bag_file:输入的 ROS Bag 文件路径。
  • output_dir:指定提取图像保存的目标目录。
  • image_topic:ROS 话题名称,用于指定需要提取图像的话题。

通过这些参数,用户可以灵活配置脚本,处理不同的输入文件、输出路径和图像来源话题。


2.3 确保目录存在

为了确保图像可以正确保存,脚本在保存图像之前会检查目标输出目录是否存在:

  • 如果目录不存在,则使用 os.makedirs 自动创建。
  • 避免因缺少目录导致的保存失败。

3. 运行脚本

使用以下命令运行脚本:

python3 extract_images.py <bag_file> <output_dir> <image_topic>

示例

假设

  • ROS Bag 文件名data.bag
  • 输出目录output
  • 图像话题名称/camera/image_raw

运行脚本的命令

在终端中运行以下命令:

python3 extract_images.py data.bag output /camera/image_raw

输出结果

脚本运行后将执行以下操作:

1. 从指定的话题中提取图像数据:

脚本会读取 ROS Bag 文件中的图像数据,并从指定的话题(例如 /camera/image_raw)中提取图像消息。

2. 保存图像到指定的输出目录:

提取的图像会以 PNG 格式保存在 output 目录中,用户可以通过该目录查看保存的图像文件。

3. 文件命名格式:

图像文件将按照顺序命名为 frame_000001.pngframe_000002.png 等。例如,如果提取了 100 张图像,则会生成文件 frame_000001.pngframe_000100.png

4. 终端输出进度:

每提取一张图像,脚本会在终端输出其保存路径。完成后,还会显示总共提取并保存了多少张图像。


示例输出

Image 1 saved to output/frame_000001.png
Image 2 saved to output/frame_000002.png
Image 3 saved to output/frame_000003.png
...
Processed 100 images.

脚本运行完成后,用户可以在 output 目录中找到所有提取的图像文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Bolt.new + PromptCoder】三分钟还原油管主页

【Bolt.new PromptCoder】三分钟还原油管主页 PromptCoder官网&#xff1a;PromptCoder Bolt官网&#xff1a;https://bolt.new/ Bolt 是什么&#xff1f; Bolt.new 是一个提供创建全栈网络应用服务的平台。它允许用户通过提示&#xff08;Prompt&#xff09;、运行&#x…

定时/延时任务-万字解析Spring定时任务原理

文章目录 1. 概要2. EnableScheduling 注解3. Scheduled 注解4. postProcessAfterInitialization 解析4.1 createRunnable 5. 任务 Task 和子类6. ScheduledTaskRegistrar6.1 添加任务的逻辑6.2 调度器初始化6.3 调用时机 7. taskScheduler 类型7.1 ConcurrentTaskScheduler7.2…

JumpServer开源堡垒机搭建及使用

目录 一,产品介绍 二,功能介绍 三,系统架构 3.1 应用架构 3.2 组件说明 3.3 逻辑架构 3.3 逻辑架构 四,linux单机部署及方式选择 4.1 操作系统要求(JumpServer-v3系列版本) 4.1.1 数据库 4.1.3创建数据库参考 4.2 在线安装 4.2.1 环境访问 4.3 基于docker容…

ResNet网络:深度学习中的革命性架构

目录 ​编辑 引言 ResNet网络的特点 1. 残差块&#xff08;Residual Block&#xff09; 2. 恒等映射&#xff08;Identity Mapping&#xff09; 3. 深层网络训练 4. Batch Normalization 5. 全局平均池化 6. 灵活的结构 ResNet的应用案例 ResNet的研究进展 实战案例…

Node.js day-01

01.Node.js 讲解 什么是 Node.js&#xff0c;有什么用&#xff0c;为何能独立执行 JS 代码&#xff0c;演示安装和执行 JS 文件内代码 Node.js 是一个独立的 JavaScript 运行环境&#xff0c;能独立执行 JS 代码&#xff0c;因为这个特点&#xff0c;它可以用来编写服务器后端…

又要考试了

一、实现无名管道练习&#xff1a;父进程写入管道&#xff0c;子进程读取管道数据。 #include<myhead.h> int main(int argc, const char *argv[]) {int fd[2];char buff[1024]"王吕阳&#xff0c;崔庆权别卷了";char s[1024];if(pipe(fd)-1){perror("pi…

LoadBalancer负载均衡和Nginx负载均衡区别理解

LoadBalancer和Nginx都是用来做负载均衡用的&#xff0c;那二者有什么区别呢&#xff1f; Nginx服务器端的负载均衡&#xff1a; 所有请求都先发到nginx&#xff0c;然后再有nginx转发从而实现负载均衡。LoadBalancer是本地的负载均衡&#xff1a; 它是本地先在调用微服务接口…

Technitium DNS Server的基本使用1(创建主区域,A记录,开启递归查询,递归到114.114.114.114)

Technitium DNS Server Technitium DNS Server搭建 搭建请看博主的上篇博客&#xff0c;内外网的方法都有 链接: 内网搭建Technitium DNS Server详细教程 登陆进去是以下界面 这个界面主要是监控&#xff0c;有访问的时候就会有波动 创建主区域&#xff0c;A记录 写上主区…

Git简介和特点

目录 一、Git简介 二、Git特点 1.集中式和分布式 (1)集中式版本控制系统 (2)分布式版本控制系统 2.版本存储方式的差异 (1)直接记录快照&#xff0c;而非差异比较 3.近乎所有操作都是本地执行 一、Git简介 Git是目前世界上最先进的的分布式控制系统&#xff08;没有之一…

CSS学习记录15

CSS下拉菜单 使用CSS创建可悬停的下拉列表。 下拉式式菜单 .dropdown类使用position:relative,当我们希望将下拉内容放置在下拉按钮的正下方(使用position:absolute)时&#xff0c;需要使用该类。 .dropdown-content 类保存实际的下拉内容。默认情况下它是隐藏的&#xff0…

RabbitMQ全局流量控制

RabbitMQ全局流量控制 流控机制流控是对什么进行控制&#xff1f;rabbitmq进程邮箱流控机制是什么&#xff1f; 流控原理流控原理流程 流控状态显示流控对象流控机制对象主要进程各进程状态情形分析 性能提升提升队列性能方式 当消息积压时&#xff0c;消息会进入到队列深处&am…

大数据平台

大数据行业应用持续升温&#xff0c;特别是企业级大数据市场正在进入快速发展时期。越来越多的企业期望实现数据孤岛的打通&#xff0c;整合海量的数据资源&#xff0c;挖掘并沉淀有价值的数据&#xff0c;进而驱动更智能的商业。随着公司数据爆发式增长&#xff0c;原有的数据…

鸿蒙生态的崛起:开发实践、认证路径与激励策略

目录 前言 鸿蒙生态能力和行业解决方案 1、鸿蒙创新能力 2、鸿蒙行业解决方案 中软鸿蒙生态业务布局 1、深度参与鸿蒙生态建设 2、提供一站式鸿蒙生态服务 &#xff08;1&#xff09;服务目录 &#xff08;2&#xff09;改造过程的关键点 &#xff08;3&#xff09;鸿…

指令遵循数据集IFEval介绍:中英双语

IFEval数据集介绍&#xff1a;评估大语言模型指令遵循能力 1. IFEval数据集提出的问题 随着大语言模型&#xff08;如GPT-4、PaLM 2等&#xff09;在自然语言任务中的广泛应用&#xff0c;模型的指令遵循能力&#xff08;Instruction Following&#xff09;成为一个重要评估指…

基于Qt的上位机通讯库

1.前言 做Qt上位机已经有两年的时间了&#xff0c;上位机主要是和下游器件打交道的&#xff0c;通过modbus、tcp、串口等协议来控制这些设备&#xff0c;通过一定的时序控制&#xff0c;完成所需要的工作流程。这其中最重要的就是通讯了&#xff0c;上位机开发过程中的相当一部…

docker安装mysql5.7

1、宿主机创建映射目录 mkdir -p /data/mysql/log mkdir -p /data/mysql/data mkdir -p /data/mysql/conf这里我放在了/data/mysql目录下 2、拉取mysql镜像 docker pull mysql:5.7注意是5.7版本&#xff0c;如果是8版本操作会略有不同&#xff0c;下篇文章介绍安装8版本的操…

SQLServer利用QQ邮箱做SMTP服务器发邮件

环境 Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) SQL Server Management Studio 15.0.18384.0 SQL Server 管理对象 (SMO) 16.100.46367.54 Microsoft .NET Framework 4.0.30319.42000 操作系统 Windows Server2019 ———————————————— 前言&#xf…

好用的网站-直接复制的文字图标不需要引入

分享一个前端不需要引入的&#xff0c;可以直接复制的图标网站 直接复制放在代码中 特殊符号大全&#xff0c;可直接复制黏贴 (shijianchuo.net)

修改uniapp下拉刷新圆圈颜色

直接看图 修改前就是常规的绿色 自定义更符合我们的软件 直接说方法 修改 在App.vue的style样式里添加一行 .uni-page-refresh--refreshing .uni-page-refresh__path{stroke:#FF2442; }我是通过 不执行 uni.stopPullDownRefresh(); 下拉刷新 之后通过F12看出来的 希望可以帮…

Maven插件打包发布远程Docker镜像

dockerfile-maven-plugin插件的介绍 dockerfile-maven-plugin目前这款插件非常成熟&#xff0c;它集成了Maven和Docker&#xff0c;该插件的官方文档地址如下&#xff1a; 地址&#xff1a;https://github.com/spotify/dockerfile-maven 其他说明&#xff1a; dockerfile是用…