在jupyter notebook中绘制KITTI三维散点图
数据来源是KITTI数据集的电云,它的bin文件中包括的是每一个点的XYZ坐标和反射率,这里只用了坐标。当然数据不一定要KITTI,只要有XYZ坐标就可以
X=[]
Y=[]
Z=[]
#用来打开KITTI的bin文件
def get_lidar(path, idx):
lidar_file = os.path.join(path, '%06d.bin' % idx)
assert os.path.exists(lidar_file)
return np.fromfile(lidar_file, dtype=np.float32).reshape(-1, 4)
ROOT="/home/jiading/myPointnet2/Pointnet2_PyTorch/pointnet2/data"
MODE="train"
split_dir = os.path.join(ROOT, 'KITTI', 'ImageSets', MODE + '.txt')
image_idx_list = [x.strip() for x in open(split_dir).readlines()]
sample_id_list = [int(sample_id) for sample_id in image_idx_list]
binPath=os.path.join(ROOT,'KITTI','object','training','velodyne')
for i in sample_id_list:
fin=open(MODE+str(i+1)+".txt",'w')
X1=[]
Y1=[]
Z1=[]
for line in get_lidar(binPath,i+1):
'''line=line[1:]
sublist=line.split(" ")
X.append(float(sublist[0]))
Y.append(float(sublist[1]))
Z.append(float(sublist[2]))'''
X1.append(float(line[0]))
Y1.append(float(line[1]))
Z1.append(float(line[2]))
X.append(X1)
Y.append(Y1)
Z.append(Z1)
fin.close()
上面这几步都是数据准备,您也可以准备自己的数据,不用管这个
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.pyplot import MultipleLocator
%matplotlib notebook
#因为是在jupyter notebook中绘制,所以要加上面这一句
plt.rcParams['figure.figsize']=[10,10]#设置图的大小
PLOT_WHICH=2#因为我的数据是二维数组,这里选择输出其中一个
ax = plt.subplot(111, projection='3d') # 创建一个三维的绘图工程
ax.scatter(X[PLOT_WHICH],Y[PLOT_WHICH], Z[PLOT_WHICH], c='b',s=0.1)#s是设置散点的大小,0.1已经比较小了,适用于像KITTI这种有好几万点的情况
ax.set_zlabel('Z') # 坐标轴
ax.set_ylabel('Y')
ax.set_xlabel('X')
#ax.xaxis.set_major_locator(MultipleLocator(0.5)),这个是用来设置坐标轴间隔的
#ax.yaxis.set_major_locator(MultipleLocator(0.5))
ax.set_xlim(-60,60)#设置坐标范围
ax.set_ylim(-20,40)
ax.set_zlim(-5,10)
plt.show()
最后成品长这样: