在jupyter notebook中绘制KITTI三维散点图

在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()

最后成品长这样:

posted @ 2020-01-12 15:02  别再闹了  阅读(2012)  评论(0编辑  收藏  举报