在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()
最后成品長這樣:

