首页 > 其他分享 >rosbag 包提取图片和点云数据

rosbag 包提取图片和点云数据

时间:2024-01-19 14:22:06浏览次数:30  
标签:提取 self topic bag 点云 path pointcloud rosbag pcd

环境

  • Ubuntu 20.04
  • ROS noetic
  • Python 3.8.10

⚠️ 注意:Python 版本很重要,建议用 3.8.10 版本,如果使用更新的版本,会导致程序需要的库版本不对应,会报错。建议使用 conda 创建一个虚拟环境最佳,创建指令:conda create -n ros_env python=3.8.10

安装所需的包

在创建的 Python 3.8.10 的环境里安装如下所需的包:

pip install rospkg gnupg pycryptodomex opencv-python tqdm

查看 bag 包参数

运行 rosbag info xxx.bag (xxx 为你 bag 的文件名)查看你需要提取的 bag 包里的话题 topic,记下来然后在下面的代码里进行更改。

提取代码

需要更改 main 函数里的 bagfile_pathcamera_topicpointcloud_topicoutput_path 参数。程序运行完成后即可在你所设定的 output_path 路径里找到提取的文件。

import os
import cv2
import rosbag
from tqdm import tqdm
from cv_bridge import CvBridge


class ExtractBagData(object):
    def __init__(self, bagfile_path, camera_topic, pointcloud_topic, output_path):
        self.bagfile_path = bagfile_path  # bag 路径
        self.camera_topic = camera_topic  # 相机话题 topic
        self.pointcloud_topic = pointcloud_topic  # 点云话题 topic
        self.output_path = output_path  # 输出的根路径
        self.image_dir = os.path.join(output_path, "images")  # 存放照片的路径
        self.pointcloud_dir = os.path.join(output_path, "pointcloud")  # 存放点云的路径

        # 检查路径是否存在,否则创建提取图片和点云的目录 ./output_path/images  ./output_path/pointcloud
        if not os.path.exists(self.image_dir):
            os.makedirs(self.image_dir)
        if not os.path.exists(self.pointcloud_dir):
            os.makedirs(self.pointcloud_dir)

    def bag_to_image(self):
        """ 提取图片
        """
        bag = rosbag.Bag(self.bagfile_path, "r")  # 读取 bag
        bridge = CvBridge()  # 用于将图像消息转为图片
        bag_data_imgs = bag.read_messages(self.camera_topic)  # 读取图像消息

        pbar = tqdm(bag_data_imgs)
        for index, [topic, msg, t] in enumerate(pbar, start=0):
            pbar.set_description("extract image id: %s" % (index + 1))
            # 消息转为图片
            cv_image = bridge.imgmsg_to_cv2(msg, "bgr8")
            # 存储图片 .bmp .png .jpg
            cv2.imwrite(os.path.join(self.image_dir, str(index) + ".png"), cv_image)
            # index += 1

    def bag_to_pointcloud(self):
        """ 提取点云
        - 提取点云数据为 pcd 后缀文件,默认提取以时间戳命名
        - 提取命令:rosrun pcl_ros bag_to_pcd result.bag /velodyne_points ./pointcloud
        """
        cmd = "rosrun pcl_ros bag_to_pcd %s %s %s" % (
            self.bagfile_path,
            self.pointcloud_topic,
            self.pointcloud_dir,
        )
        os.system(cmd)

        # 读取提取的 pcd 点云数据,把文件名修改为按照顺序索引名
        pcd_files_list = os.listdir(self.pointcloud_dir)
        # 因为提取的 pcd 是以时间戳命名的,但是存放到列表中并不是按照时间戳从小到大排列,这里对时间戳进行重新排序
        pcd_files_list_sorted = sorted(pcd_files_list, reverse=False)

        pbar = tqdm(pcd_files_list_sorted)
        for index, pcd_file in enumerate(pbar, start=0):
            pbar.set_description("extract poindcloud id: %s" % (index + 1))
            os.rename(
                os.path.join(self.pointcloud_dir, pcd_file),
                os.path.join(self.pointcloud_dir, str(index) + ".pcd"),
            )
            print("pcd_file name: ", pcd_file)


if __name__ == "__main__":
    extract_bag = ExtractBagData(
        bagfile_path="/mnt/e/2024-01-13-12-40-28.bag",  # bag 文件的绝对路径
        camera_topic="/stereo_publisher/color/image",  # 相机 topic
        pointcloud_topic="/livox/lidar",  # 点云 topic
        output_path="/mnt/e/output/",  # 输出的根路径
    )

    extract_bag.bag_to_image()  # 提取图片
    extract_bag.bag_to_pointcloud()  # 提取点云

标签:提取,self,topic,bag,点云,path,pointcloud,rosbag,pcd
From: https://www.cnblogs.com/xiaoaug/p/17974538

相关文章

  • 提取SAO
    "SAO"这个概念在自然语言处理(NLP)领域中指的是从文本中提取“主体-动作-客体”(Subject-Action-Object)结构。主体(Subject):通常是句子中执行动作的人或事物。在英文中,主体通常位于句子的开头。动作(Action):这是句子中描述的主要动作或事件。在英文中,动作通常是句子中的动词。......
  • FormX: 让数据提取更智能
    在数字化时代,许多企业仍然处理大量的物理文件,如收据、身份证、营业执照、地址证明和发票等。将这些物理文件中的数据提取到数字形式通常是一项繁琐的任务,但有了基于人工智能的数据提取工具FormX,这一切变得更加智能和高效。FormX简介FormX是一款基于人工智能的数据提取工具,旨在自......
  • Python3 使用 PyMuPDF 库提取pdf中的字体文件
    先安装PyMuPDF库:pipinstallPyMuPDF 示例:importfitzdefextract_fonts(pdf_path):withfitz.open(pdf_path)asdoc:num_pages=doc.page_countfonts=[]forpage_numberinrange(num_pages):font_info=doc.get......
  • 汉字数字等多类型字符串中提取数字
    使用正则表达式importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassMain{publicstaticvoidmain(String[]args){Stringinput="你好6.6%";doublenumber=extractNumber(input);System.out.println(n......
  • openpyxl模块---------------------------------------------提取身份证信息及计算年
     上代码:fromopenpyxlimportload_workbookfromdatetimeimportdatetimedefcreate_time():now_year=datetime.now().yearwb=load_workbook('C:/Users/admin/Desktop/11.xlsx')sh=wb.activemax_column=sh.max_columnfori,cellin......
  • 基于6ULL-Nand核心板|提取并反编译设备树
    本文基于HD6UL-IOT评估板进行验证。HD6UL-IOT 基于HD6UL-CORE 工业级核心板设计(双网口、双 CAN、7 路串口),接口丰富,采用 3.5 寸工控板标准尺寸,适用于工业现场应用需求,亦方便用户评估核心板及 CPU 的性能。 1.查看dtb文件分区使用cat /proc/mtd命令查看dtb设备树文件在nand......
  • 提取申请人和产品名称
     importrandomimportreimportosimporttimeimportpandasaspdfrompyvirtualdisplayimportDisplayimportundetected_chromedriverasucfromselenium.webdriver.common.keysimportKeysfromselenium.webdriver.common.byimportByfrombs4importBeau......
  • 提取 PE文件 / 目标程序 的各种信息
    前段时间项目需要实现对WindowsPE文件版本信息的提取,如文件说明、文件版本、产品名称、版权、原始文件名等信息。获取这些信息在Windows下当然有一系列的API函数供调用,简单方便。我们先看一下PE文件结构,PE文件由DOS首部,PE文件头,块表,块和调试信息组成,有关PE文件的数据结构......
  • PageOfficeV6.0提取在线编辑保存的excel单元格数据
    转载:提取单元格数据提取单元格数据查看本示例演示效果本示例关键代码的编写位置Vue+Springboot注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。在实际的开发过程中,经常会遇到提取Excel文档中数据保存到数据......
  • 安卓之从视频中提取音频的应用场景及技术优劣分析
    引言随着移动设备性能的不断提升和多媒体内容的广泛传播,从视频中提取音频已成为众多开发者与用户日常操作的一部分。在安卓平台上,这项技术经历了从早期的复杂专业工具到现今便捷易用的应用程序的演变过程。本文旨在探讨安卓系统中视频转音频(VideotoAudioExtraction,VAE)技术的发......