Как получить правильные представления данных облака точек в numpy -stl? - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь получить спереди, сзади, слева, справа, сверху, снизу после проецирования облаков точек 3D-данных. Но результаты не очень хорошие. Есть ли лучший способ получить требуемые просмотры? Я сделал это, используя документацию numpy -stl и некоторые исследования для проецирования.

import numpy as np
import pandas as pd
import os
import time
import scipy
import math
from scipy import ndimage
from stl import mesh
from matplotlib import pyplot as plt
from mpl_toolkits import mplot3d
from matplotlib import cm
%matplotlib inline

# Load an existing stl file:
my_mesh = mesh.Mesh.from_file('Bolt.stl')

# Create a new plot
figure = pyplot.figure()
axes = mplot3d.Axes3D(figure)

# Load the STL files and add the vectors to the plot
axes.add_collection3d(mplot3d.art3d.Poly3DCollection(my_mesh.vectors))

# Auto scale to the mesh size
scale = my_mesh.points.flatten()
axes.auto_scale_xyz(scale, scale, scale)

# Show the plot to the screen
pyplot.show()

3D view of the input bolt.stl file

Я скачал этот bolt.stl с сайта grabcad.com.

После этого я попытался спроецировать различные виды, например:

points = my_mesh.vectors
x = points[:,0].flatten()
y = points[:,1].flatten()
z = points[:,2].flatten()

fig= plt.figure()
ax= fig.add_subplot(111, projection= '3d')
ax.scatter(x,y,z)

ax.plot(x, z, 'r+', zdir='y', zs=100)
ax.plot(y, z, 'g+', zdir='x', zs=-100)
ax.plot(x, y, 'k+', zdir='z', zs=-100)

ax.set_xlabel('X')
ax.set_xlim([-100, 100])
ax.set_ylabel('Y')
ax.set_ylim([-100, 100])
ax.set_zlabel('Z')
ax.set_zlim([-100, 100])

plt.show()

Using matplotlib to get projected views

Результат так плохо, я даже не знаю, куда девается болт 3D.

Я также пытался:

X = points[:,0]
Y = points[:,1]
Z = points[:,2]

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3)
cset = ax.contourf(X, Y, Z, zdir='z', offset=-100, cmap="gray")
cset = ax.contourf(X, Y, Z, zdir='x', offset=-100, cmap="gray")
cset = ax.contourf(X, Y, Z, zdir='y', offset=100, cmap="gray")

ax.set_xlabel('X')
ax.set_xlim(-100, 100)
ax.set_ylabel('Y')
ax.set_ylim(-100, 100)
ax.set_zlabel('Z')
ax.set_zlim(-100, 100)

plt.show()

Using contourf

I также пытался с этим кодом, который я нашел из " MVCNN для 3D распознавания формы "

def point_cloud_to_volume(points, size=32):
    vol = np.zeros((size,size,size))
    locations = np.copy(points)
    locations[:] *= (size-1)
    locations = locations.astype(int)
    locations[locations >= size] = 0.0
    locations[locations < 0] = 0.0
    vol[locations[:,0],locations[:,1],locations[:,2]] = 1.0
    return vol

def vol2depthmap(volume_array, bg_val=32):
    vol = volume_array.argmax(2)
    vol[vol == 0] = bg_val
    return vol
v = point_cloud_to_volume(points)
%matplotlib inline
from matplotlib import pyplot as plt
plt.imshow(vol2depthmap(v), interpolation='nearest', cmap='Greys')
plt.colorbar()

Matplotlib plot after convertion from point cloud to volume

Наконец я попробовал:

front_proj = points[:, :, :].sum(axis=1)
plt.plot(front_proj)
plt.show()

Front View

side_proj = points[:, :, :].sum(axis=0)
plt.plot(side_proj)
plt.show()

Side View

top_proj = points[:, :, :].sum(axis=2)
plt.plot(top_proj)
plt.show()

Top View

Я пробовал использовать нарезку, но, как вы уже догадались, каков будет результат.

front   = points[:,:,0] 
back   = points[:,:,-1] 
top    = points[0,:,:]  
bottom = points[-1,:,:] 
r_side = points[:,-1,:] 
l_side = points[:,0,:]

front view

back view

top view

bottom view

right view

left view

Как получить правильный вид файла .stl, как показано ниже. Пожалуйста, игнорируйте черчение и размеры.

Sample views

Или подойдет любой другой формат cad. Я попробовал это в файле .stl, так как нет библиотеки python, которую я нашел до сих пор, чтобы загрузить другие форматы CAD, кроме stl.

...