欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用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

结果图:
使用matplotlib可视化点云分割结果使用matplotlib可视化点云分割结果

本文地址:https://blog.csdn.net/inshallah/article/details/107092968