使用matplotlib可视化点云分割结果
程序员文章站
2023-11-26 22:45:58
用matplotlib绘制点云分割结果...
如何获取分割结果就不再赘述了,这里主要是在获取了分割结果后如何绘制,我是使用的matplotlib库,以ShapeNet为例:
- 首先设置每个类别的每个部分的颜色映设表:
import copy
import numpy as np
# 每个种类所对应的part类别
lab2seg={'Earphone': [16, 17, 18], 'Motorbike': [30, 31, 32, 33, 34, 35], 'Rocket': [41, 42, 43], 'Car': [8, 9, 10, 11],
'Laptop': [28, 29], 'Cap': [6, 7], 'Skateboard': [44, 45, 46], 'Mug': [36, 37], 'Guitar': [19, 20, 21],
'Bag': [4, 5], 'Lamp': [24, 25, 26, 27], 'Table': [47, 48, 49], 'Airplane': [0, 1, 2, 3], 'Pistol': [38, 39, 40],
'Chair': [12, 13, 14, 15], 'Knife': [22, 23]}
#获取所要绘制点云数据的类别
cls=[]
with open('/results/seg_model_2.txt', 'r') as f:
for i,line in enumerate(f):
ls=line.strip().split()
cls.append(ls[0][1:-2])
#生成颜色映射表
#因为只有几种颜色可选,所以分割结果按这几种颜色随机分配,可以自己改成其他的
map = ['r', 'g', 'b', 'c', 'm', 'y']
#随机生成颜色映射
idx = np.arange(0, len(map))
idx_all = []
np.random.seed(123)
for _ in range(len(lab2seg)):
np.random.shuffle(idx)
idx_all.append(copy.deepcopy(idx))
idx_all = np.array(idx_all)
#将生成的颜色映射表对应到不同种类的part类别上
for i,key in enumerate(lab2seg.keys()):
lab2seg[key]=dict(zip(set(lab2seg[key]),[map[idx_all[i,j]] for j in range(len(set(lab2seg[key])))]))
- 依据所得到的颜色映射表绘制分割结果
def data_depict(bsize,fn,lab2seg,cls):
#bsize: 数据个数
#fn: 路径
#lab2seg: 生成的颜色对应表,即每个种类的每个part类别所对应的颜色,作为输入是为了使得不同结果间保持一致
#cls: 每个点云数据所对应的类别
for j in range(bsize):
#读取点云和分割结果数据
data= np.loadtxt(fn+'%d.txt'%j).astype(np.float32)
#归一化
data[:,:3]=pc_normalize(data[:,:3])
#将数据点的part类别对应为lab2seg中设置的颜色
colormap = [[] for _ in range(len(data))]
for i in range(len(data)):
colormap[i] = lab2seg[cls[j]][data[i, -1]]
#设置图片大小
plt.figure(figsize=(10,10))
ax = plt.subplot(111, projection='3d')
#设置视角
ax.view_init(elev=30, azim=-60)
#关闭坐标轴
plt.axis('off')
#设置坐标轴范围
ax.set_zlim3d(-1, 1)
ax.set_ylim3d(-1, 1)
ax.set_xlim3d(-1, 1)
ax.scatter(data[:, 0], data[:, 1], data[:, 2], c=colormap, s=20, marker='.') #, cmap='plasma')
# plt.show()
#保存为.eps文件,也可以是其他类型,注意保存不能和显示同时使用
plt.savefig(fn + '%d.eps' % j, dpi=500,bbox_inches='tight',transparent=True)
plt.close()
def pc_normalize(pc):
l = pc.shape[0]
centroid = np.mean(pc, axis=0)
pc = pc - centroid[np.newaxis,:]
m = np.max(np.sqrt(np.sum(np.power(pc,2), axis=1)),axis=0)
pc = pc / m[np.newaxis,np.newaxis]
return pc
结果图:
本文地址:https://blog.csdn.net/inshallah/article/details/107092968