写在前面:因为做实验,需要对数据集进行一定的处理,所以需要python写一个脚本来处理。水平有限,能用就行,也许之后会优化一下。
本文适合对slam实验中的kitti、euroc等数据集进行与处理
首先,了解文件操作函数
f=open('01.txt')
#open会返回来一个和对象f
line=f.readline()
#该函数会一行一行的读取文件,而且返回的类型是字符串
lines=readlines()
#这个函数读取整个文件,并且返回的数据类型是一个列表
f.close()
#对文件操作完毕之后,要使用函数将文件关闭
with open('01.txt','r) as read_file:
statement
#使用with打开文件不用再去考虑关闭文件的事,可以更加专注对文件本身的操作,在对文件操作完成之后会自动关闭文件
接下来,使用上述函数对文件进行进行操作。
一、将txt文件的第一列改成时间戳
#该函数用来将grountruth.txt文件的第一列改为时间戳,即从0到n,并将改名之后的文件存储的哦呵all.#txt文件中
path = '/home/grountruth.txt'
path_save = '/home/yi/ex/eurocMH_04/all.txt'
with open(path, 'r') as read_file, open(path_save, 'w') as write_file:
data = read_file.readlines()
i = 0
for line in data:
line.split(' ')[1:9]
mydata = str(i) + ' ' + line.split(' ')[1] + ' ' + line.split(' ')[2] + ' ' + line.split(' ')[3] + ' ' + \
line.split(' ')[4] + ' ' + line.split(' ')[5] + ' ' + line.split(' ')[6] + ' ' + line.split(' ')[
7] + ' ' + line.split(' ')[8]
i = i + 1
print(mydata, file=write_file, end="")
二、给图像进行批量改名
import os
def Rename(dir, filedir):
file = open(dir, "r")
timestamp = list()
a = os.listdir(filedir)
a.sort()
for line, img_name in zip(file.readlines(), a):
os.rename("data/" + img_name, "/home/yi/ex/eurocMH_04/cam0/data/" + line.split()[0])
file.close()
if __name__ == '__main__':
Rename('/home/image_name_format.txt', '/home/cam0/data/')
#第一个参数时存储图片名称的文件
#第二个参数时存储图片的文件夹
三、寻找最匹配的时间戳,暴力匹配
#问题描述,许多数据集给出的groundtruth与图片并非是一一对应的,而是会给出许多的groundtruth,所以我们应该找到距离所用图片时间戳所对应的groundtruth时间戳之间的最短距离,这个groundtruth也就是图片所对应的时间戳
# 该文件用来找到距离图片最近的时间戳
path_image_name = '/home/image_name.txt'
path_txt_all = '/home4/groundtruth.txt'
path_truth_right = '/home//right_grountruth.txt'
with open(path_txt_all, 'r') as txt_file, open(path_image_name, 'r') as image_file, open(path_truth_right,
'w') as write_file:
image_data = image_file.readlines()
txt_data = txt_file.readlines()
for image_line in image_data:
min = 100000000000
data = int(image_line)
# print('data')
# print(data)
for txt_line in txt_data:
txt = int(txt_line.split(' ')[0])
if abs(txt - data) < min:
min = abs(txt - data)
my_data = txt_line
#print('mydata')
#print(my_data)
print(my_data, file=write_file, end="")
四,拼接两个txt文件
# 该文件用来将旋转和平移变量两个文件联结起来
path2 = '/home/tran.txt'
path1 = '/home/calqua.txt'
path_all = '/home/all.txt'# 保存拼接之后的文件
with open(path1, 'r') as read_filex, open(path2, 'r') as read_filey, open(path_all, 'w') as write_file:
linex = read_filex.readlines()
liney = read_filey.readlines()
for i in range(len(linex)):
line = linex[i].strip() + ' ' + liney[i]
print(line,file=write_file,end="")
综上:
对txt文件操作,主要注意的点是,readlines函数返回的是一个列表,可以对这个列表进行遍历,当需要这个列表中的内容是,需要对其进行分割操作,写清楚分割符是什么。
接下来对csv文件操作,与txt文件异曲同工。可以使用python中的csv库来操作,注意事项如下:
'''
语法:csv.writer(f):
writer支持writerow(列表)单行写入,和writerows(嵌套列表)批量写入多行,无须手动保存。
语法:csv.reader(f, delimiter=‘,’)
reader为生成器,每次读取一行,每行数据为列表格式,可以通过delimiter参数指定分隔符
返回一个reader对像,对该对象进行遍历
'''