Резка 3D облака точек и интерполяция между точками - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть следующие данные

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()

Пример графика показан здесь:

введите описание изображения здесь

...