使用 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请求…...
Univer全栈框架实战指南:3步构建企业级AI原生表格应用
Univer全栈框架实战指南:3步构建企业级AI原生表格应用 【免费下载链接】univer Build AI-native spreadsheets. Univer is a full-stack framework for creating and editing spreadsheets on both web and server. With Univer Platform, Univer Spreadsheets is d…...
从ET1100迁移到AX58100:我的EtherCAT从站代码需要重写多少?
从ET1100迁移到AX58100:EtherCAT从站代码重构实战指南 当你的产品线需要从百兆升级到千兆EtherCAT网络,或者要支持时间敏感网络(TSN)功能时,从经典的ET1100切换到AX58100几乎是必然选择。但作为经历过完整迁移周期的开发者,我必须…...
突破B站字幕处理瓶颈:BiliBiliCCSubtitle全流程解决方案
突破B站字幕处理瓶颈:BiliBiliCCSubtitle全流程解决方案 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 一、问题发现:字幕处理的现实困境…...
新手入门指南:在快马平台用AI生成代码理解云桌面基础概念
今天想和大家分享一个特别适合新手理解云桌面基础概念的实践方法。作为一个刚接触云计算的小白,我最初对"一台主机创建多个云桌面"这个概念也是一头雾水,直到在InsCode(快马)平台上尝试用AI生成代码来模拟这个过程,才真正搞明白其中…...
Cursor Pro功能持续访问解决方案:系统化AI编程助手权限管理方法论
Cursor Pro功能持续访问解决方案:系统化AI编程助手权限管理方法论 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reach…...
在ESP32上为LVGL 8.x添加中文输入法:从拼音到候选词显示的完整实现
在ESP32上为LVGL 8.x实现高性能中文输入法的工程实践 当我们在智能家居控制面板上输入Wi-Fi密码时,或者在工业HMI设备中输入参数时,中文输入往往成为嵌入式设备最令人头疼的用户体验瓶颈。ESP32作为物联网领域的主流芯片,其有限的RAM资源&…...
DLSS状态指示器配置完全指南:实用监控工具深度解析
DLSS状态指示器配置完全指南:实用监控工具深度解析 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 在追求极致游戏体验的路上,你是否曾疑惑DLSS是否真正生效?DLSS Swapper作为一款专…...
Phi-3-Mini-128K实战JavaScript:构建前端智能代码提示插件
Phi-3-Mini-128K实战JavaScript:构建前端智能代码提示插件 最近在折腾前端项目时,我总在想,要是写代码时能有个更懂我的助手就好了。现有的代码补全工具虽然不错,但很多时候还是停留在语法层面,对于业务逻辑、复杂函数…...
Krita插件组件缺失故障排除实战指南
Krita插件组件缺失故障排除实战指南 【免费下载链接】krita-ai-diffusion Streamlined interface for generating images with AI in Krita. Inpaint and outpaint with optional text prompt, no tweaking required. 项目地址: https://gitcode.com/gh_mirrors/kr/krita-ai-…...
SketchUp STL开源工具:让3D设计无缝转化为可打印模型的完整方案
SketchUp STL开源工具:让3D设计无缝转化为可打印模型的完整方案 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 在…...
