У меня есть следующие данные
https://www.mediafire.com/file/f8tz1zbpxvyvko7/Waltersdorf_F3.csv/file
, которое является трехмерным облаком точек.
Я могу визуализировать его правильно, но я хочу сделать сокращения какте, что в красных линиях (линейные срезы), на этих срезах интерполируют между значениями облака точек 3D и выполняют двухмерное построение этой линии (среза) и двухмерных интерполированных значений.
Кто-нибудь предложил бы подходили алгоритм?
image
Вот что я сделал до сих пор, но вам не нужно использовать библиотеку PyPCL для облака точек, вы можете работать с исходными данными...
def main():
#process first point cloud
f3data = np.loadtxt(r'C:\ahmed\Waltersdorf_feld3_4.csv', delimiter=',', dtype=[('sp', np.str_, 20), ('x1', np.float32), ('x2', np.float32), ('x3', np.float32)])
ptcloud_1 = np.vstack((f3data['x1'], f3data['x2'], f3data['x3'])).transpose()
pc_1 = pcl.PointCloud.PointXYZ(ptcloud_1)
#plotScatterRot3(f3rot)
pc_type = utils.get_point_cloud_type(pc_1)
seg = getattr(pcl.segmentation.SACSegmentation, pc_type)()
seg.setOptimizeCoefficients(True)
model = getattr(pcl.sample_consensus, "SACMODEL_" + 'PLANE'.upper())
seg.setModelType(model)
seg.setMethodType(pcl.sample_consensus.SAC_RANSAC)
seg.setDistanceThreshold(1)
seg.setInputCloud(pc_1)
coefficients = pcl.ModelCoefficients()
inliers = pcl.PointIndices()
seg.segment(inliers, coefficients)
inla = pc_1.xyz[inliers.indices]
cloud_filtered = pcl.PointCloud.PointXYZ(inla)
pcl.io.savePCDFile("original_first.txt", cloud_filtered)
X = np.vstack((cloud_filtered.x, cloud_filtered.y, cloud_filtered.z)).transpose()
pca = decomposition.PCA(n_components=3)
pca.fit(X)
X = pca.transform(X)
# Verify that everything looks right.
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d as m3d
ax = m3d.Axes3D(plt.figure())
ax.scatter3D(*X.T)
plt.show()
Пример графика показан здесь:
введите описание изображения здесь