又是一个深夜,这是一个初五的夜晚,之前我在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文件中的数量是一致的,同时也带有时间戳,因此提取是很成功的。
以下链接都是无压缩的方案:
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