#coding=utf-8import os
#可視化依賴的庫是pyside,也可以是pyqt
os.environ['QT_API']='pyside'import numpy as np
from mayavi import mlab
defget_image(file_name,height=160,width=160):"""這裏的點雲數據的每一個通道大小爲160x160;
Construct an array from data in a text or binary file.
"""
file_data = np.fromfile(file_name, np.float32)# file_data.shape
image = np.reshape(file_data,[width,height,3])return image
defshow(file_path,save_dir =None):
XYZ = get_image(file_path)#len(X)=size,len(X[index])=sizeprint(np.max(XYZ[:,:,2]))print(np.min(XYZ[:,:,2]))
x = np.squeeze(XYZ[:,:,0]).tolist()
y = np.squeeze(XYZ[:,:,1]).tolist()
z = np.squeeze(XYZ[:,:,2]).tolist()#print("max value is {},min value is {}".format(max(z),min(z)))if save_dir !=None:ifnot os.path.exists(save_dir):
os.mkdir(save_dir)
temp = os.path.splitext(file_path)[0]
pre_name = os.path.basename(temp)
sub_dir = file_path.split("\\")[-2]
new_subdir = os.path.join(save_dir,sub_dir)ifnot os.path.exists(new_subdir):
os.mkdir(new_subdir)
new_name = os.path.join(new_subdir,pre_name)#將每一個維度的對應位置的(x,y,z)值存入txt,並且每一行開頭添加字母v,表示三維頂點,值之間用空格隔開。#隨後將.txt擴展名改爲.obj,這樣meshlab就可以讀取.obj文件,可視化點雲圖像。withopen(new_name+'.txt','w')as f:for i inrange(len(x)):for j inrange(len(x)):
f.write("v"+" "+str(x[i][j])+" "+str(y[i][j])+" "+str(z[i][j])+"\n")#直接用mayavi可視化
mlab.points3d(x,y,z,mode='point')
mlab.show()if __name__ =='__main__':
show(r"\yourpath\XXX.bin",r"\savepath\pointclouds_obj")