如何从rosbag提取图片(CompressedImage)之使用Python脚本文件

又是一个深夜,这是一个初五的夜晚,之前我在csdn上找了很多用于从rosbag中提取图片的方法(想要提取带时间戳),但毫无例外都报错了,而且之前使用launch文件的提取方法会遗漏很多图片。

主要是因为我这部分是CompressedImage类型,与无压缩的图片存在一定的差别,所以使用多篇文章的提取无压缩图片方法容易报错。于是乎,我打开了csdn社区寻找方法。在这个链接中 https://blog.csdn.net/memoryd/article/details/105174348?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-3&spm=1001.2101.3001.4242 寻找到了合适的解决方案,我将代码按照我的配置和topic修改后运行发现,可以跑动图像说明读取压缩型的image是可行的。然后我将代码进行了修改,与之前别的代码不一样的是,我的代码需要另建一个文件夹,例如,我在dataset文件夹下建立了image文件夹,将test.py和我的bag文件放置在image文件夹下。

以下代码是我修改后的Python代码,在原有展示的基础上增加了存储图像并命名为时间戳的代码:

#coding:utf-8

import rosbag
import roslib;   #roslib.load_manifest(PKG)
import rospy
import cv2
from cv_bridge import CvBridge
from sensor_msgs.msg import Image

bag_file = 'irat_aus_28112011.bag'
bag = rosbag.Bag(bag_file, "r")

bridge = CvBridge()
bag_data = bag.read_messages('/irat_red/camera/image/compressed')
for topic, msg, t in bag_data:
    cv_image = bridge.compressed_imgmsg_to_cv2(msg, "bgr8")
    cv2.imshow("Image window", cv_image) 
    # imshow可有可无只是为了检验是否在提取图像,并展示                      
    timestr = "%.6f" %  msg.header.stamp.to_sec()
    #%.6f表示小数点后带有6位,可根据精确度需要修改;
    image_name = timestr+ ".jpg" #图像命名:时间戳.jpg
    cv2.imwrite(image_name, cv_image)  #保存;
    cv2.waitKey(3)

 在和bag文件一样路径下进行运行,我们就可以看到该文件夹在进行提取图像了。

edward@edward:~/dataset/image$ python test.py

我们运行了之后可以发现提取出来的图像数量和bag文件中的数量是一致的,同时也带有时间戳,因此提取是很成功的。

如何从rosbag提取图片(CompressedImage)之使用Python脚本文件_第1张图片

 

如何从rosbag提取图片(CompressedImage)之使用Python脚本文件_第2张图片

以下链接都是无压缩的方案:

https://blog.csdn.net/qq_22059843/article/details/103018216

https://blog.csdn.net/yourgreatfather/article/details/87783906?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-3&spm=1001.2101.3001.4242

https://wiki.ros.org/rosbag/Tutorials/Exporting%20image%20and%20video%20data

关于irat_aus_28112011.bag,以下是下载链接:

https://download.csdn.net/download/loveSIYU/15711173

你可能感兴趣的:(ROS,C++,计算机视觉,自动驾驶,机器学习,数据挖掘,python)