kitti数据集的可视化(一)

数据集的介绍

image文件:8位png格式

velodyne文件 :激光雷达的测量数据,点云以二进制形式存储,后缀为.bin。

点云数据以浮点二进制文件格式存储,每行包含8个数据,每个数据由四位16进制数表示(浮点数),每个数据通过空格隔开,一个点云数据由四个浮点数构成,分别表示x, y, z, r(强度,反射)

一个字节是多少位? Answer:一个字节为8位。

carlib文件:相机、雷达等的校正数据

label文件:kitti中object的标签和评估数据

每一行代表一个object,每一行都有16列分别表示不同的含义

第一列代表物体的类别。2(浮点数):数字表示指离开图像边界对象的程度。 3(整数):代表物体是否被遮挡。 4(弧度数):物体的观察角度(alpha) 5~8(浮点数):物体的2D边界框大小(bbox) 四个数分别是xmin、ymin、xmax、ymax(单位:pixel),表示2维边界框的左上角和右下角的坐标。 9~11(浮点数):3D物体的尺寸(dimensions)分别是高、宽、长(单位:米) 12-14(整数):3D物体的位置(location)分别是x、y、z(单位:米),特别注意的是,这里的xyz是在相机坐标系下3D物体的中心点位置。 15(弧度数):3D物体的空间方向(rotation_y)取值范围为:-pi ~ pi(单位:rad),它表示,在照相机坐标系下,物体的全局方向角(物体前进方向与相机坐标系x轴的夹角),如图所示。16(整数):检测的置信度(score)

点云数据的可视化

import numpy as np # 导入NumPy库用于数据处理
import mayavi.mlab # 导入Mayavi库用于三维可视化
import os # 导入os模块用于文件路径操作

# 000010.bin这里需要填写文件的位置
# bin_file = '../data/object/training/velodyne/000000.bin'
# assert os.path.exists(bin_file), "{} is not exists".format(bin_file)
kitti_file = r'/home/miaomiao/kitti_object_vis-master/data/object/training/velodyne/000001.bin'
# 从文件中读取点云数据,每个点包含4个浮点数(X、Y、Z坐标和反射强度),存储为NumPy数组
pointcloud = np.fromfile(file=kitti_file, dtype=np.float32, count=-1).reshape([-1, 4])
# pointcloud = np.fromfile(str("000010.bin"), dtype=np.float32, count=-1).reshape([-1, 4])

# 打印点云数据的形状,结果是 (N, 4)
print(pointcloud.shape) 
x = pointcloud[:, 0] # x position of point
y = pointcloud[:, 1] # y position of point
z = pointcloud[:, 2] # z position of point
r = pointcloud[:, 3] # reflectance value of point
d = np.sqrt(x ** 2 + y ** 2) # 点到传感器的距离(二维平面距离)
# sqrt 是 "square root" 的缩写,即平方根。

vals = 'height'
if vals == "height":
col = z
else:
col = d

# 创建一个Mayavi场景,并设置背景颜色和大小
fig = mayavi.mlab.figure(bgcolor=(0, 0, 0), size=(640, 500))
# mayavi.mlab.figure() 函数用于创建一个新的 Figure 对象,这个对象是 Mayavi 中用于显示三维图形的容器
# bgcolor=(0, 0, 0):指定了 Figure 的背景颜色为黑色。
# 这里使用 RGB 色彩空间,(0, 0, 0) 分别表示红、绿、蓝通道的颜色强度,(0, 0, 0) 表示全黑。
# size=(640, 500):指定了 Figure 的大小为宽度 640 像素,高度 500 像素。

# 使用 Mayavi 库中的 points3d 函数在三维空间中绘制点云数据。
mayavi.mlab.points3d(x, y, z,
col, # 用于颜色的数组,它决定了每个点的颜色。在这段代码中,根据之前的逻辑,col 的值应该是点的 Z 坐标或者点到传感器的距离。
mode="point", # 绘制模式,这里是点模式
colormap='spectral', # 'bone', 'copper', 'gnuplot'
# color=(0, 1, 0), # Used a fixed (r,g,b) instead
figure=fig,
)
# 'spectral',这是一种常用的颜色映射
# 会根据数据值的大小从紫色渐变到红色,可以帮助显示出数据的分布情况和变化趋势。
# 数据值指的是 col 参数所表示的值,它决定了点的颜色。

# 创建一条线段用于辅助绘制,这里是一个平行于Y轴的线段
x = np.linspace(5, 5, 50)
y = np.linspace(0, 0, 50)
z = np.linspace(0, 5, 50)
mayavi.mlab.plot3d(x, y, z, color=(1, 0, 1)) # 调用 Mayavi 库的 plot3d 函数,将创建的线段绘制在三维空间中。
mayavi.mlab.show()

以下是实现上述功能的Python代码: ```python import argparse import pandas as pd import re import matplotlib.pyplot as plt # 创建命令行参数解析器 parser = argparse.ArgumentParser(description='Process log file and generate charts') parser.add_argument('log_file', help='path to the log file') args = parser.parse_args() # 读取log文件 with open(args.log_file) as f: lines = f.readlines() # 找到"My name is kitty"所在的行,并从下一行开始读取 start_line = None for i, line in enumerate(lines): if "My name is kitty" in line: start_line = i+1 break if start_line is None: print("Error: 'My name is kitty' not found in log file.") exit() # 从start_line开始读取,删除重复行,然后写入新文件output.csv lines = lines[start_line:] lines = list(set(lines)) with open("output.csv", "w") as f: for line in lines: f.write(line) # 读取output.csv文件,按照正则规则1和规则2分列 df = pd.read_csv("output.csv", header=None) df1 = df[0].str.extract(r'(\d+)\s+(\w+)') df2 = df[1:].apply(lambda x: pd.Series(re.split('\s+', x[0])), axis=1) # 将分列后的数据写入output.csv文件 df1.to_csv("output.csv", mode="a", header=False, index=False) df2.to_csv("output.csv", mode="a", header=False, index=False) # 读取output.csv文件,将标题行分成4类 df = pd.read_csv("output.csv", header=None) df.columns = df.iloc[0] df = df.drop(0) df1 = df.loc[:, ["ABC", "DFG"]] df2 = df.loc[:, df.columns.str.startswith("CAT")] df3 = df.loc[:, df.columns.str.startswith("DOG")] df4 = df.loc[:, df.columns.str.startswith("Fish")] # 画4个曲线图,标注每条线的标题 plt.plot(df1["ABC"], label="ABC") plt.plot(df1["DFG"], label="DFG") plt.legend() plt.show() for col in df2.columns: plt.plot(df2[col], label=col) plt.legend() plt.show() for col in df3.columns: plt.plot(df3[col], label=col) plt.legend() plt.show() for col in df4.columns: plt.plot(df4[col], label=col) plt.legend() plt.show() ``` 使用方法:在命令行中输入`python script.py /path/to/log/file`,其中`script.py`为保存上述代码的文件名,`/path/to/log/file`为log文件的路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值