python3d库vispy_python读取三维点云球坐标数据并动态生成三维图像与着色

关键步骤:

1.首先通过读取.txt文本数据并进行一系列字符串处理,提取显示所需要的相关数据矩阵

2.然后利用python的matplotlib库来进行动态三维显示

备注:matplotlib在显示2d数据可视化方面有着绝对的优势,但是在三维点云显示方面则存在很多问题,首先一个就是显示几千几万点以上甚至更多三维点的时候,电脑CPU明显跟不上,计算机显示明显变得卡顿,所以当需要显示更多的点的时候,建议使用python的另一个利用GPU渲染的库vispy,本人亲测,普通i5,GTX750台式机显示个几千万个点是毫无压力的

import numpy as np

import math

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

from matplotlib.animation import FuncAnimation

f=open('data.txt','r')

point=f.read()

f.close()

l1=point.replace('\n',',')

l2=l1.replace(' ',',')

l3=l2.split(',')

#print(l3)

m1=np.array(l3)

m2=m1.reshape(2664,6)

m3=[]

for each in m2:

each_line=list(map(lambda x:float(x),each))

m3.append(each_line)

m4=np.array(m3)

print(m4)

yaw=[i[0] for i in m4]

pitch=[i[1] for i in m4]

radius=[i[2] for i in m4]

c1=[i[3:6] for i in m4]

c2=np.array(c1)

c3=c2.reshape(2664,3)

print(c3)

x=[]

y=[]

z=[]

for i in range(len(m4)):

x.append(radius[i]*math.sin(0.0174532924*pitch[i])*math.sin(0.0174532924*yaw[i]))

y.append(radius[i]*math.cos(0.0174532924*pitch[i]))

z.append(radius[i]*math.sin(0.0174532924*pitch[i])*math.cos(0.0174532924*yaw[i]))

# print(x)

# print(y)

# print(z)

def animate():

return point

def init():

return point

fig=plt.figure(figsize=(16,9),dpi=120)

ax=fig.add_subplot(111,projection='3d')

plt.title('point')

ax.set_xlabel('X Label')

ax.set_ylabel('Z Label')

ax.set_zlabel('Y Label')

anim = FuncAnimation(fig,animate, frames=np.arange(100), init_func=init,

interval=100, blit=True)

for i in range(2664):

point=ax.scatter(z[i],x[i],y[i],c=(c3[i]/255),marker='.',s=10,linewidth=1,alpha=1,cmap='spectral')

plt.ion()

plt.pause(0.01)

plt.close

plt.show()

数据点未进行着色时的情况显示如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将三维点云数据转换为二值图像,您可以使用一些图像处理(如OpenCV)来实现。以下是一个示例代码,展示了如何将数组表示的三维点云坐标转换为二值图像: ```python import numpy as np import cv2 def point_cloud_to_binary_image(point_cloud, resolution, threshold): # 设置图像尺寸(根据点云数据的范围和分辨率) image_size = (int((point_cloud[:, 0].max() - point_cloud[:, 0].min()) / resolution), int((point_cloud[:, 1].max() - point_cloud[:, 1].min()) / resolution)) # 创建空白图像 binary_image = np.zeros(image_size, dtype=np.uint8) # 将点云数据映射到图像中 for point in point_cloud: x = int((point[0] - point_cloud[:, 0].min()) / resolution) y = int((point[1] - point_cloud[:, 1].min()) / resolution) # 根据阈值将像素点设置为白色(255)或黑色(0) if point[2] > threshold: binary_image[y, x] = 255 else: binary_image[y, x] = 0 return binary_image # 示例用法 point_cloud = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 假设这是您的三维点云数据 resolution = 0.1 # 分辨率 threshold = 5 # 阈值 binary_image = point_cloud_to_binary_image(point_cloud, resolution, threshold) cv2.imshow("Binary Image", binary_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的示例中,我们通过将三维点云数据的每个点映射到二值图像上,根据阈值将像素点设置为白色(255)或黑色(0)。您可以根据您的点云数据的范围和分辨率调整图像的尺寸,同时也可以根据您的需求调整阈值。 希望这可以帮助到您!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值