rosbag提取图片和点云文件

目录

1、提取点云文件

(1)准备工作

(2)查看topic

(3)提取点云

2、提取图片文件

(1)准备工作

(2)查看topic

(3)提取图片


1、提取点云文件

(1)准备工作

打开终端1,启动ros

roscore

(2)查看topic

打开终端2,查询rosbag中的topic

rosbag info 

查询结果如下图

rosbag提取图片和点云文件_第1张图片

 topic后的信息为录制时的topic,我们现在要提取点云文件,所以需要使用/pointcloud

(3)提取点云

接下来可以将点云文件提取为pcd文件,在rosbag存放目录下运行如下命令

rosrun pcl_ros bag_to_pcd   

为rosbag包名

需要提取的topic

为提取的pcd文件存放路径

举个例子如下

rosrun pcl_ros bag_to_pcd 2.bag /pointcloud /home/jiang/Documents/data/pointcloud

##如果提取失败,可能录制的rosbag存在问题,我们需要对rosbag的topic进一步检查##

在终端2中运行如下命令

rosbag play 

然后打开终端3,运行如下命令

rostopic list

结果如下,检查topic是否与第2步中相同。

rosbag提取图片和点云文件_第2张图片


2、提取图片文件

(1)准备工作

打开终端1,启动ros

roscore

(2)查看topic

与提取点云步骤相同,查询topic,我的rosbag录制的是4路摄像头拍摄的照片,所以对于图片的topic有4个,分别是,/compressedimg1,/compressedimg2,/compressedimg3,/compressedimg4,

(3)提取图片

由于我的rosbag录制的图像数据是压缩数据(compressed),需要使用python脚本进行提取,

具体代码如下(如有不妥还望各位大佬指点):

# coding:utf-8
#! /usr/bin/env python3

# Extract images from a bag file.

import rosbag
import cv2
from sensor_msgs.msg import CompressedImage
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError

output_paths = {
    '/compressedimg1': '/home/jiang/Documents/data/image1/',
    '/compressedimg2': '/home/jiang/Documents/data/image2/',
    '/compressedimg3': '/home/jiang/Documents/data/image3/',
    '/compressedimg4': '/home/jiang/Documents/data/image4/'
}  # 替换为每个 topic 保存图像的目录路径

frame_interval = 10  # 提取图像的帧间隔

class ImageCreator():
    def __init__(self):
        self.bridge = CvBridge()
        frame_counts = {topic: 0 for topic in output_paths.keys()}  # 每个 topic 分别统计帧数

        with rosbag.Bag('/home/jiang/Documents/1.bag', 'r') as bag:  # 要读取的bag文件路径
            for topic, msg, t in bag.read_messages():
                if topic in output_paths:  # 仅处理指定的 topics
                    if frame_counts[topic] % frame_interval == 0:  # 每隔 frame_interval 帧提取一次
                        try:
                            cv_image = self.bridge.compressed_imgmsg_to_cv2(msg, desired_encoding='passthrough')
                        except CvBridgeError as e:
                            print(e)
                            continue

                        filename = f"{t.to_nsec()}.jpg"  # 使用时间戳作为文件名
                        save_path = output_paths[topic] + filename
                        cv2.imwrite(save_path, cv_image)  # 保存图像
                        print(f"Saved image from {topic}: {save_path}")
                    frame_counts[topic] += 1

if __name__ == '__main__':
    try:
        image_creator = ImageCreator()
    except rospy.ROSInterruptException:
        pass

rosbag路径、topic、输出保存路径在脚本中更改,然后保存此脚本的目录下运行如下命令:

python3 

为刚编辑的python脚本

!!!在运行时可能会报错,提示“No module named ‘Cryptodome”,可以参考https://shliang.blog.csdn.net/article/details/109201720?fromshare=blogdetail&sharetype=blogdetail&sharerId=109201720&sharerefer=PC&sharesource=m0_56693980&sharefrom=from_linkicon-default.png?t=O83Ahttps://shliang.blog.csdn.net/article/details/109201720?fromshare=blogdetail&sharetype=blogdetail&sharerId=109201720&sharerefer=PC&sharesource=m0_56693980&sharefrom=from_link此博主介绍的解决方法很详细,强烈推荐。

你可能感兴趣的:(ubuntu,linux,python)