从bag包中提取图片和点云数据为pcd格式点云文件

  • 1 开始提取bag包之前的准备工作
  • 2 从bag包中提取图片和点云数据

首先说明一下我运行的系统环境:

  • python2
  • Ubuntu18.04
  • ROS melodic

1 开始提取bag包之前的准备工作

1、首先查看一下自己的bag包中,相机和激光雷达的topic

(base) shl@zhihui-mint:~$ rosbag info 2021-03-24-11-01-45.bag
path:        2021-03-24-11-01-45.bag
version:     2.0
duration:    23.7s
start:       Mar 24 2021 11:01:45.46 (1616554905.46)
end:         Mar 24 2021 11:02:09.15 (1616554929.15)
size:        860.0 MB
messages:    474
compression: none [474/474 chunks]
types:       sensor_msgs/Image       [060021388200f6f0f447d0fcd9c64743]sensor_msgs/PointCloud2 [1158d486dd51d683ce2f1be655c3c181]
topics:      /usb_cam/image_raw   238 msgs    : sensor_msgs/Image/velodyne_points     236 msgs    : sensor_msgs/PointCloud2
(base) shl@zhihui-mint:~$

如上:

  • 我相机的topic为/usb_cam/image_raw
  • 激光雷达的topic为:/velodyne_points

2、由于我相机和激光雷达采集数据的频率都是10Hz,因此提取出之后的数据几乎是每一帧都是保持对齐的!

3、下面提取数据保存的路径

root/
├── images   # 存放提取图片数据,格式jpg
└── pointcloud  # 存放提取的点云数据,格式pcd

2 从bag包中提取图片和点云数据

1、使用rosbag库包提取图片数据

注意:

在提取图片数据的时候,我的rosbag库包是在python2环境下的,因此在运行程序的时候也是使用python2作为解释器进行执行的!

2、把bag包中的点云数据提取为pcd格式点云文件,提取命令:

rosrun pcl_ros bag_to_pcd result.bag /velodyne_points ./pointcloud

  • rosrun pcl_ros bag_to_pcd:前面是指定把bag包提取为pcd格式文件
  • result.bag:是要提取的bag包文件
  • /velodyne_points:是要提取bag包中对应的激光雷达的topic
  • ./pointcloud:是提取的pcd格式的一帧一帧的点云文件

3、下面是完整的代码

#coding:utf-8
'''
env:
- python2
- ros melodic* pcd格式的单帧点云数据,可以通过 pcl_viewer 20.pcd 的形式进行查看每个msg中存放的信息:
# print(msg)
header:seq: 1769stamp:secs: 1616554905nsecs: 527051435frame_id: "usb_cam"
height: 720
width: 1280
encoding: "rgb8"
is_bigendian: 0
step: 3840
data: [146, 205, 228, 144, 203, 226, 149, 189, ...]   # 很长的一个列表'''__Author__ = "Shliang"
__Email__ = "shliang0603@gmail.com"import os
import rosbag
import cv2
from cv_bridge import CvBridge
from tqdm import tqdm
import timeclass ExtractBagData(object):def __init__(self, bagfile_path, camera_topic, pointcloud_topic, root):self.bagfile_path = bagfile_pathself.camera_topic = camera_topicself.pointcloud_topic = pointcloud_topicself.root = rootself.image_dir = os.path.join(root, "images")self.pointcloud_dir = os.path.join(root, "pointcloud")#创建提取图片和点云的目录 ./root/images  root/pointcloudif 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 extract_camera_topic(self):bag = rosbag.Bag(self.bagfile_path, "r")bridge = CvBridge()bag_data_imgs = bag.read_messages(self.camera_topic)index = 0# for topic, msg, t in bag_data_imgs:# for topic, msg, t in tqdm(bag_data_imgs):pbar = tqdm(bag_data_imgs)for topic, msg, t in pbar:pbar.set_description("Processing extract image id: %s" % (index+1))cv_image = bridge.imgmsg_to_cv2(msg, "bgr8")# print('\033[31m=\033[0m'*120)# print(topic)  # /usb_cam/image_raw# print(msg)# print(t)  # 1616554905461126311#print(type(cv_image))  # <type 'numpy.ndarray'># cv2.imshow("Image window", cv_image)# cv2.waitKey(3)# 如果你需要使用时间戳对提取的图片命名,可以使用msg.header.stamp.to_sec()获取时间戳# timestr = "%.6f" %  msg.header.stamp.to_sec()cv2.imwrite(os.path.join(self.image_dir, str(index) + ".jpg"), cv_image)index += 1def extract_pointcloud_topic(self):'''# 提取点云数据为pcd后缀文件,默认提取以为时间戳命名# 提取命令:rosrun pcl_ros bag_to_pcd result.bag /velodyne_points ./pointcloud# 提取点云以时间戳命令:1616554905.476288682.pcd:return:'''cmd = "rosrun pcl_ros bag_to_pcd %s /velodyne_points %s" % (self.bagfile_path, self.pointcloud_dir)os.system(cmd)# 再读取提取的pcd点云数据,把文件名修改为按照顺序索引名pcd_files_list = os.listdir(self.pointcloud_dir)# 因为提取的pcd是以时间戳命令的,但是存放到列表中并不是按照时间戳从小到大排列,这里对时间戳进行重新排序pcd_files_list_sorted = sorted(pcd_files_list)# print(zip(pcd_files_list, pcd_files_list_sorted))index = 0pbar = tqdm(pcd_files_list_sorted)for pcd_file in pbar:pbar.set_description("Processing 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)index += 1if __name__ == '__main__':# bagfile_path = "/home/shl/extract_rosbag_data/0324_bags/plycal_calib/2021-03-24-11-01-45.bag"# camera_topic = "/usb_cam/image_raw"# pointcloud_topic = "/velodyne_points"# extract_bag = ExtractBagData(bagfile_path, camera_topic, pointcloud_topic,  "root")# extract_bag.extract_camera_topic()# extract_bag.extract_pointcloud_topic()bagfile_path = "/home/shl/Desktop/calibrate_data/2021_05_06-17_21_40.bag"camera_topic = "/image"pointcloud_topic = "/velodyne_points"extract_bag = ExtractBagData(bagfile_path, camera_topic, pointcloud_topic,  "/home/shl/Desktop/calibrate_data/extract_data")extract_bag.extract_camera_topic()extract_bag.extract_pointcloud_topic()

从bag包中提取图片和点云数据为pcd格式点云文件相关推荐

  1. 自动化办公 | 快速从Excel中提取图片并匹配命名

    大家好,我是小五???? 关于自动化办公,之前我思考过好久.到底什么是自动化办公,哪些属于能真正提高我们工作效率的知识,哪些所谓的python自动化办公项目又是伪需求? 其实挺难断定的,可能大部分人用 ...

  2. 用R制作gif动态图以及从gif中提取图片

    作者:辉小宝同学 微信公众号:R语言和Python学堂 知乎: https://www.zhihu.com/people/zoro-3-92/posts 简书:https://www.jianshu. ...

  3. php imagemagick gif,用R制作gif动态图以及从gif中提取图片

    想获取本文完整代码和数据的下载链接,可关注微信公众号"R语言和Python学堂",并回复发文日期"20181121". 熟悉R的朋友,肯定知道 animatio ...

  4. unity 从apk包中提取资源

    unity 从apk包中提取资源 前提:使用本方法来提取资源有个前提就是资源没有被加密 (1)打开apk包 首先,将你的apk包重命名为zip或者rar类型的文件,然后进行解压缩,获取下面的文件 各个 ...

  5. c# 保存html中的图片,c# HTML中提取图片地址

    public class HtmlHelper { /// /// HTML中提取图片地址 /// public static List PickupImgUrl(string html) { Reg ...

  6. 从视频中提取图片(截取ppt)

    从视频中提取图片 大聪明2.0上线 本文将介绍如何快速从网课视频中提取ppt Step1 从视频中提取图片 使用win自带的"电影与电视" 点击这个小铅笔,选择"保存视频 ...

  7. 怎么从pdf中提取图片

    在办公室工作过程中,我们需要从PDF文件中获取对我们有用的图片. 但是打开PDF文件后,无法直接保存或复制图片.所以我们常用的方法是使用屏幕截图工具保存一两张图片. 如果有数百张图片,则估计头部会很大 ...

  8. 免费离线PDF工具箱,PDF工具大全,PDF合并PDF加密PDF解密PDF格式转换PDF分割PDF旋转以及从PDF中提取图片,满足对PDF操作的一切需求~完全免费无使用次数限制,文末附下载链接~

    一款 完全免费 的PDF工具箱,软件一共 内置45个和PDF文件操作相关的功能,无需注册登录 即可 免费使用,所有的功能都 不限制使用次数,你对PDF操作的大多数需求它都能满足!而且 所有操作均在本地 ...

  9. Python-从PDF中提取图片、压缩PDF

    功能描述 老大最近一直需要将一个好几兆的pdf文件压缩到2mb甚至1mb以内.通常的做法可能会是打印pdf文件,然后用打印机设置生产很小的pdf文件,或者就是截图保存等等.但都有点太傻瓜了,这时候还是 ...

最新文章

  1. Eclipse launch failed.Binary not found解决方案
  2. REST service 化一个数据系统(REST Service 的最佳实践,第 2 部分)
  3. DotNet语音技术实现(实现电脑发音)
  4. Nginx命令配置到系统环境
  5. java开发工程师面试题总结
  6. 【直播预告】腾讯广告实时策略数据框架建设
  7. AttributeError: 'dict' object has no attribute 'has_key'
  8. 西安计算机二级12月,2017年12月计算机二级MS Office习题答案(一)
  9. mac os android sd卡,关于 Mac 上的 SD 和 SDXC 卡插槽
  10. 来一杯java_初级java笔试题
  11. 正则表达式(用户名表单验证/验证座机号码/正则替换replace)
  12. 什么是ROE、ROA和ROS?衡量企业盈利能力的比率有哪些?
  13. Spring(三) 表单页面处理
  14. 非银行支付机构网络支付业务管理办法
  15. STM32 SPI获取磁性角度传感器AS5048A角度数据
  16. 为树莓派3B+编译 64位UEFI 固件
  17. 第三方SDK接入--微信
  18. Steve Hui:云联云是中国云计算的最好切入点(4月刊推荐)
  19. STM32之RGB灯仿真
  20. 从零开始学数据分析之——《笨办法学Python》(习题0-10)

热门文章

  1. 关于SEED-XDS560V2PLUS在Win10下驱动不能正常识别问题的解决
  2. 小妞会装机 -- 一个装机软件的开发笔记(八)
  3. 垃圾分类解决方案-最新全套文件
  4. linux操作之:设置fedora的yum国内源
  5. 1.什么是Spark
  6. /Localizable.strings:0: error: read failed: The data couldn’t be read because it isn’t in the correc
  7. elasticsearch监控工具之bigdesk
  8. 邮件服务器的基础知识概述
  9. 告诉大家如何下钻石vga,480*640的竖版壁纸
  10. 免费申请Jetbrains全家桶