在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()
最后成品长这样:
来源:https://www.cnblogs.com/jiading/p/12182710.html