使用 Python 从 ROS Bag 中提取图像:详解与实现
在机器人应用中,ROS (Robot Operating System) 是一个常见的框架。ROS Bag(rosbag)是 ROS 中用于记录和回放数据流(例如传感器数据、话题消息等)的一种强大工具。有时,我们需要将存储在 rosbag 文件中的图像数据提取并保存为图像文件以便进一步分析或处理。本文将介绍如何编写一个 Python 脚本,从 rosbag 文件中提取图像并保存为 PNG 文件。
功能概述
该脚本的主要功能包括:
- 读取指定的 ROS Bag 文件。
- 从指定的话题(Topic)中提取图像数据。
- 使用 OpenCV 将图像保存为 PNG 格式文件。
- 提供灵活的命令行参数,支持不同的输入文件、输出目录和话题。
注意:
如果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 函数是脚本的核心部分,主要完成以下任务:
-
读取 Bag 文件
使用rosbag.Bag打开指定的 ROS Bag 文件以便提取数据。 -
遍历消息
使用bag.read_messages遍历指定话题中的所有消息。 -
转换图像
借助cv_bridge将 ROS 格式的图像消息(sensor_msgs/Image)转换为 OpenCV 格式的图像数据。 -
保存图像
使用cv2.imwrite将提取的图像保存为 PNG 文件,文件名格式为frame_000001.png、frame_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.png、frame_000002.png 等。例如,如果提取了 100 张图像,则会生成文件 frame_000001.png 到 frame_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 目录中找到所有提取的图像文件。
相关文章:
使用 Python 从 ROS Bag 中提取图像:详解与实现
在机器人应用中,ROS (Robot Operating System) 是一个常见的框架。ROS Bag(rosbag)是 ROS 中用于记录和回放数据流(例如传感器数据、话题消息等)的一种强大工具。有时,我们需要将存储在 rosbag 文件中的图像…...
MYSQL执行一条update语句,期间发生了什么
客户端先通过连接器建立连接,连接器自会判断用户身份; 因为这是一条 update 语句,所以不需要经过查询缓存,但是表上有更新语句,是会把整个表的查询缓存清空的,所以说查询缓存很鸡肋,在 MySQL 8…...
前端性能优化思路
前端性能优化需要从多方面入手,包括减少资源加载时间、优化页面渲染、利用浏览器缓存、使用CDN加速,服务端渲染和预渲染、性能监控和分析。需要综合运用这些优化策略才能显著提升网页或应用的性能和用户体验 一、减少资源加载时间 1. 代码分割 原理: 代码分割允许我们将代…...
有向图判环(leetcode207,leetcode210)
有向图判环(leetcode207,leetcode210) 有向图判环 #include <iostream> #include <vector> using namespace std;struct graph {int V; // 顶点的数量vector<vector<int>> adj; // 邻接表数组…...
概率论得学习和整理25:EXCEL 关于直方图/ 频度图 /hist图的细节,2种做hist图的方法
目录 1 hist图的特点 2 hist的设置技巧:直接生成的hist图往往很奇怪不好用:因为横轴的分组不对 3 如何修改分组 4 设置开放边界,把长尾合并,得到hist图1 5 用原始表得到频数表 6 用上面的频数图做柱状图,再修改&…...
PHP8.4下webman直接使用topthink/think-orm
环境信息 操作系统win11php 8.4.1webman-framework ^1.6.8MySQL 8.4.3topthink/think-orm ^3.0 说明 PHP8.3以下版本 直接使用webman提供的webman/think-orm更方便。 PHP 环境换为 8.4 使用webman/think-orm 报了个错;所以换topthink/think-orm,根据文…...
【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string,垃圾回收( GC)
文章目录 知识回顾一、栈(Stack)和堆(Heap)1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢?值类型引用类型 2、总结 三、特殊的引用类…...
基于微信小程序的小区疫情防控ssm+论文源码调试讲解
第2章 程序开发技术 2.1 Mysql数据库 为了更容易理解Mysql数据库,接下来就对其具备的主要特征进行描述。 (1)首选Mysql数据库也是为了节省开发资金,因为网络上对Mysql的源码都已进行了公开展示,开发者根据程序开发需…...
第P2周:Pytorch实现CIFAR10彩色图片识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 实现CIFAR-10的彩色图片识别实现比P1周更复杂一点的CNN网络 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: …...
CTFHub 命令注入-综合练习(学习记录)
综合过滤练习 命令分隔符的绕过姿势 ; %0a %0d & 那我们使用%0a试试,发现ls命令被成功执行 /?ip127.0.0.1%0als 发现一个名为flag_is_here的文件夹和index.php的文件,那么我们还是使用cd命令进入到文件夹下 http://challenge-438c1c1fb670566b.sa…...
OpenCV目标检测 级联分类器 C++实现
一.目标检测技术 目前常用实用性目标检测与跟踪的方法有以下两种: 帧差法 识别原理:基于前后两帧图像之间的差异进行对比,获取图像画面中正在运动的物体从而达到目标检测 缺点:画面中所有运动中物体都能识别 举个例子…...
QT6 Socket通讯封装(TCP/UDP)
为大家分享一下最近封装的以太网socket通讯接口 效果演示 如图,界面还没优化,后续更新 废话不多说直接上教程 添加库 如果为qmake项目中,在.pro文件添加 QT network QT core gui QT networkgreaterThan(QT_MAJOR_VERS…...
elasticsearch设置密码访问
1 用户认证介绍 默认ES是没有设置用户认证访问的,所以每次访问时,直接调相关API就能查询和写入数据。现在做一个认证,只有通过认证的用户才能访问和操作ES。 2 开启加密设置 1.生成证书文件 /usr/share/elasticsearch/bin/elasticsearch-…...
彻底理解如何优化接口性能
作为后端研发,必须要掌握怎么优化接口的性能或者说是响应时间,这样才能提高系统的系能,本文通过如下两个方面进行分析: 一.后端代码 有如下几步: 1.缓存机制 这是最场景的方式,当使用了缓存后,…...
C# 位运算
一、数据大小对应关系 说明: 将一个数据每左移一位,相当于乘以2。因此,左移8位就是乘以2的8次方,即256。 二、转换 1、 10进制转2进制字符串 #region 10进制转2进制字符串int number1 10;string binary Convert.ToString(num…...
【Flink-scala】DataStream编程模型之状态编程
DataStream编程模型之状态编程 参考: 1.【Flink-Scala】DataStream编程模型之数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 3.【Flink-scala】DataStream编程模型之窗口计算-触发器-驱逐器 4.【Flink-scal…...
RabbitMQ的核心组件有哪些?
大家好,我是锋哥。今天分享关于【RabbitMQ的核心组件有哪些?】面试题。希望对大家有帮助; RabbitMQ的核心组件有哪些? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ是一个开源的消息代理(Messag…...
【Linux基础】基本开发工具的使用
目录 一、编译器——gcc/g的使用 gcc/g的安装 gcc的安装: g的安装: gcc/g的基本使用 gcc的使用 g的使用 动态链接与静态链接 程序的翻译过程 1. 一个C/C程序的构建过程,程序从源代码到可执行文件必须经历四个阶段 2. 理解选项的含…...
常见的数据结构和应用场景
数据结构是计算机科学中的基础概念,用于组织和存储数据,以便能够高效地访问和修改。下面是几种常见数据结构及其代表性应用场景: 1. 数组(Array) 问题解决:数组是一种线性数据结构,用于存储相…...
爬虫基础学习
爬虫概念与工作原理 爬虫是什么:爬虫(Web Scraping)是自动化地访问网站并提取数据的技术。它模拟用户浏览器的行为,通过HTTP请求访问网页,解析HTML文档并提取有用信息。 爬虫的基本工作流程: 发送HTTP请求…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
