当前位置: 首页 > news >正文

使用 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 目录中找到所有提取的图像文件。

相关文章:

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

在机器人应用中&#xff0c;ROS (Robot Operating System) 是一个常见的框架。ROS Bag&#xff08;rosbag&#xff09;是 ROS 中用于记录和回放数据流&#xff08;例如传感器数据、话题消息等&#xff09;的一种强大工具。有时&#xff0c;我们需要将存储在 rosbag 文件中的图像…...

MYSQL执行一条update语句,期间发生了什么

客户端先通过连接器建立连接&#xff0c;连接器自会判断用户身份&#xff1b; 因为这是一条 update 语句&#xff0c;所以不需要经过查询缓存&#xff0c;但是表上有更新语句&#xff0c;是会把整个表的查询缓存清空的&#xff0c;所以说查询缓存很鸡肋&#xff0c;在 MySQL 8…...

前端性能优化思路

前端性能优化需要从多方面入手,包括减少资源加载时间、优化页面渲染、利用浏览器缓存、使用CDN加速,服务端渲染和预渲染、性能监控和分析。需要综合运用这些优化策略才能显著提升网页或应用的性能和用户体验 一、减少资源加载时间 1. 代码分割 原理: 代码分割允许我们将代…...

有向图判环(leetcode207,leetcode210)

有向图判环&#xff08;leetcode207&#xff0c;leetcode210&#xff09; 有向图判环 #include <iostream> #include <vector> using namespace std;struct graph {int V; // 顶点的数量vector<vector<int>> adj; // 邻接表数组…...

概率论得学习和整理25:EXCEL 关于直方图/ 频度图 /hist图的细节,2种做hist图的方法

目录 1 hist图的特点 2 hist的设置技巧&#xff1a;直接生成的hist图往往很奇怪不好用&#xff1a;因为横轴的分组不对 3 如何修改分组 4 设置开放边界&#xff0c;把长尾合并&#xff0c;得到hist图1 5 用原始表得到频数表 6 用上面的频数图做柱状图&#xff0c;再修改&…...

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 报了个错&#xff1b;所以换topthink/think-orm&#xff0c;根据文…...

【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string,垃圾回收( GC)

文章目录 知识回顾一、栈&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢&#xff1f;值类型引用类型 2、总结 三、特殊的引用类…...

基于微信小程序的小区疫情防控ssm+论文源码调试讲解

第2章 程序开发技术 2.1 Mysql数据库 为了更容易理解Mysql数据库&#xff0c;接下来就对其具备的主要特征进行描述。 &#xff08;1&#xff09;首选Mysql数据库也是为了节省开发资金&#xff0c;因为网络上对Mysql的源码都已进行了公开展示&#xff0c;开发者根据程序开发需…...

第P2周:Pytorch实现CIFAR10彩色图片识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 实现CIFAR-10的彩色图片识别实现比P1周更复杂一点的CNN网络 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: …...

CTFHub 命令注入-综合练习(学习记录)

综合过滤练习 命令分隔符的绕过姿势 ; %0a %0d & 那我们使用%0a试试&#xff0c;发现ls命令被成功执行 /?ip127.0.0.1%0als 发现一个名为flag_is_here的文件夹和index.php的文件&#xff0c;那么我们还是使用cd命令进入到文件夹下 http://challenge-438c1c1fb670566b.sa…...

OpenCV目标检测 级联分类器 C++实现

一.目标检测技术 目前常用实用性目标检测与跟踪的方法有以下两种&#xff1a; 帧差法 识别原理&#xff1a;基于前后两帧图像之间的差异进行对比&#xff0c;获取图像画面中正在运动的物体从而达到目标检测 缺点&#xff1a;画面中所有运动中物体都能识别 举个例子&#xf…...

QT6 Socket通讯封装(TCP/UDP)

为大家分享一下最近封装的以太网socket通讯接口 效果演示 如图&#xff0c;界面还没优化&#xff0c;后续更新 废话不多说直接上教程 添加库 如果为qmake项目中&#xff0c;在.pro文件添加 QT network QT core gui QT networkgreaterThan(QT_MAJOR_VERS…...

elasticsearch设置密码访问

1 用户认证介绍 默认ES是没有设置用户认证访问的&#xff0c;所以每次访问时&#xff0c;直接调相关API就能查询和写入数据。现在做一个认证&#xff0c;只有通过认证的用户才能访问和操作ES。 2 开启加密设置 1.生成证书文件 /usr/share/elasticsearch/bin/elasticsearch-…...

彻底理解如何优化接口性能

作为后端研发&#xff0c;必须要掌握怎么优化接口的性能或者说是响应时间&#xff0c;这样才能提高系统的系能&#xff0c;本文通过如下两个方面进行分析&#xff1a; 一.后端代码 有如下几步&#xff1a; 1.缓存机制 这是最场景的方式&#xff0c;当使用了缓存后&#xff0c;…...

C# 位运算

一、数据大小对应关系 说明&#xff1a; 将一个数据每左移一位&#xff0c;相当于乘以2。因此&#xff0c;左移8位就是乘以2的8次方&#xff0c;即256。 二、转换 1、 10进制转2进制字符串 #region 10进制转2进制字符串int number1 10;string binary Convert.ToString(num…...

【Flink-scala】DataStream编程模型之状态编程

DataStream编程模型之状态编程 参考&#xff1a; 1.【Flink-Scala】DataStream编程模型之数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 3.【Flink-scala】DataStream编程模型之窗口计算-触发器-驱逐器 4.【Flink-scal…...

RabbitMQ的核心组件有哪些?

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ的核心组件有哪些&#xff1f;】面试题。希望对大家有帮助&#xff1b; RabbitMQ的核心组件有哪些&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ是一个开源的消息代理&#xff08;Messag…...

【Linux基础】基本开发工具的使用

目录 一、编译器——gcc/g的使用 gcc/g的安装 gcc的安装&#xff1a; g的安装&#xff1a; gcc/g的基本使用 gcc的使用 g的使用 动态链接与静态链接 程序的翻译过程 1. 一个C/C程序的构建过程&#xff0c;程序从源代码到可执行文件必须经历四个阶段 2. 理解选项的含…...

常见的数据结构和应用场景

数据结构是计算机科学中的基础概念&#xff0c;用于组织和存储数据&#xff0c;以便能够高效地访问和修改。下面是几种常见数据结构及其代表性应用场景&#xff1a; 1. 数组&#xff08;Array&#xff09; 问题解决&#xff1a;数组是一种线性数据结构&#xff0c;用于存储相…...

爬虫基础学习

爬虫概念与工作原理 爬虫是什么&#xff1a;爬虫&#xff08;Web Scraping&#xff09;是自动化地访问网站并提取数据的技术。它模拟用户浏览器的行为&#xff0c;通过HTTP请求访问网页&#xff0c;解析HTML文档并提取有用信息。 爬虫的基本工作流程&#xff1a; 发送HTTP请求…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...