一、解析.bag文件获得图片,pcd点云
1. 查看某个.bag的数据信息(其中*为.bag文件名)
rosbag info *.bag
结果如下:
2. 解析该.bag文件到.jpg格式图片
安装如下依赖项
sudo apt-get install mjepgtools
sudo apt-get install ffmpeg
新建终端,执行
roscore
调整到你需要存储图片的文件夹中,或者新建文件夹,新建终端执行以下命令,其中<>中为你的topic信息
rosrun image_view extract_images _sec_per_frame:=0.05 image:=<IMAGE TOPIC IN BAGFILE>
新建终端。调整到待解析的rosbag文件目录下,回放rosbag包,执行以下命令
rosbag play -r 0.5 <BAG FILE>
3. 解析.bag文件到.pcd点云数据文件
以下两种方法:
1.rosrun pcl_ros bag_to_pcd <*.bag> <topic> <output_directory>
2.rosrun pcl_ros pointcloud_to_pcd input:=<topic>
4.附上常用的.bag文件使用方法
检查并播放bag文件
rosbag info *.bag
可以看出topic类型以及数量
运行bag数据
rosbag play *.bag
二、将图片编成符合slam的数据集形式
1.若数据集是用.bag文件进行提取的则采用如下代码进行编译
会生成一个rgb.txt文件,并且会将图片重新命名,
import numpy as np
import os
# 图片文件夹,后面的/不能省
from PIL import Image
img_path = 'D:/VS_project/yolov5-v5.0/ssd.pytorch-master/ssd.pytorch-master/aerial1'
for root, dirs, files in os.walk(img_path, topdown=False):
print(root) # 当前目录路径
print(dirs) # 当前目录下所有子目录
print(files) # 当前路径下所有非目录子文件
# with open(img_path+"\opt_poses.txt") as f:
# read_data = f.readlines()
# print(read_data)
count = 0
write_date = [0 for _ in range(4801)]
time_list = [0 for _ in range(4801)]
# print(len(read_data))
for j in range(0,len(files)):
time_list[j] = "1." + files[j][5:9]
# print(j)
print(time_list)
# for wai in range(len(read_data)):
# for nei in range(len(read_data)-wai):
# if (time_list[wai]>time_list[wai+nei]):
# exchange = time_list[wai]
# time_list[wai] = time_list[wai+nei]
# time_list[wai+nei] = exchange
# #print(time_list)
with open("D:/VS_project/yolov5-v5.0/ssd.pytorch-master/ssd.pytorch-master/aerial1/rgb.txt", 'w') as g:
flag = 0
for i in range(4801):
print(flag)
if(files[i][-3:-1]+files[i][-1] == "jpg"):
I = Image.open('./aerial1/'+files[i])
write_date[i] = time_list[i] + ' ' + time_list[i] + '.jpg' + "\n"
#print(write_date[i])
I.save('./picture/aerial1/'+time_list[i]+'.jpg')
flag = flag +1
count = 0
for i in range(4801):
print(write_date[i])
g.writelines(write_date[i])
count=count+1
print(count)
2.若原有的数据集不符合slam的运行时序,采用如下代码进行修正
import numpy as np
import os
# 图片文件夹,后面的/不能省
from PIL import Image
img_path = 'D:/VS_project/yolov5-v5.0/ssd.pytorch-master/ssd.pytorch-master/rafz_gray'
for root, dirs, files in os.walk(img_path, topdown=False):
print(root) # 当前目录路径
print(dirs) # 当前目录下所有子目录
# print(files) # 当前路径下所有非目录子文件
with open(img_path+"\opt_poses.txt") as f:
read_data = f.readlines()
# print(read_data)
count = 0
write_date = [0 for _ in range(249)]
time_list = [0 for _ in range(249)]
print(len(read_data))
for j in range(len(read_data)):
# print(read_data[j][0:8])
time_list[j] = read_data[j][0:8]
# if(read_data[j][16] == ' ' ):
# time_list[j] = read_data[j][0:16]+"0"+str(j)
# else:
# time_list[j] = read_data[j][0:17] +str(j)
#print(time_list[j])
for wai in range(len(read_data)):
for nei in range(len(read_data)-wai):
if (time_list[wai]>time_list[wai+nei]):
exchange = time_list[wai]
time_list[wai] = time_list[wai+nei]
time_list[wai+nei] = exchange
#print(time_list)
with open(img_path+"\\rgb.txt", 'w') as g:
for i in range(249):
# print(i[-3:-1]+i[-1])
# if(i[-3:-1]+i[-1] == "jpg"):
# #print(count)
# #I = Image.open('./cadastre_gray/'+i)
# count = int(i[6:-1].split('.')[0])
# print(count)
# # print(read_data[count][0:7] +' '+ i)
# write_date[count] = time_list[count] +' '+ time_list[count]+'.jpg' +"\n"
# print(write_date[count])
# # print(read_data[count][0:7])
# #I.save('./picture/'+time_list[count]+'.jpg')
# print(count)
I = Image.open('./rafz_gray/opt_image_'+str(i)+'.jpg')
write_date[i] = time_list[i] + ' ' + time_list[i] + '.jpg' + "\n"
#print(write_date[i])
I.save('./picture/rafz/'+time_list[i]+'.jpg')
count = 0
for i in range(249):
print(write_date[i])
g.writelines(write_date[i])
count=count+1
print(count)
# I = Image.open('./image.png')
# print(type(I)) #---><class 'PIL.JpegImagePlugin.JpegImageFile'>
# print(I.size) #--->(1280, 720)
# I.show()
# I.save('./save.png')