Сегментация плоскости земли Ransac для данных лидара

Я хочу использовать алгоритм ransac для сегментации лидарных колец наземной плоскости, я использую для этого python-pcl, но я получил ложные результаты, как показано на рисунках ниже.

Как мы знаем, данные лидара имеют много колец наземной плоскости, они не могут найти правильную плоскость земли, но они нашли плоскость над землей. Причина, по которой я могу предположить, заключается в том, что, возможно, земля лидара очень разреженная, а на плоскости над землей количество точек больше, чем на земле, поэтому алгоритм находит ложные результаты. Код можно перечислить, как показано ниже:


seg = point_cloud.make_segmenter()

seg.set_optimize_coefficients(True)

seg.set_model_type(pcl.SACMODEL_PLANE)

seg.set_method_type(pcl.SAC_RANSAC)

seg.set_distance_threshold(0.1)

indices, model = seg.segment()

Неясно, является ли проблема проблемой, которую я угадал, поэтому, если кто-то сталкивался с проблемой раньше, сообщите мне. И я не знаю, как решить проблему, информации о сегментации лидарных колец мало, кто-нибудь знает, как ее решить?

И есть ли другие методы сегментации лидарной земли, код которых я могу получить?

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


person Jaiy    schedule 11.09.2018    source источник
comment
Добро пожаловать! Пожалуйста, отредактируйте свой пост, чтобы добавить форматирование и несколько новых строк, чтобы помочь читателям. В настоящее время он слишком компактен и не читается. Также задайте вопрос и не просите предложений. И добавьте примеры кода, чтобы проиллюстрировать свой вопрос.   -  person ChrisR    schedule 11.09.2018
comment
@ChrisR: Спасибо за ваши комментарии, я редактирую вопрос, как вы говорите, код, который я использовал для алгоритма выкупа, можно перечислить, как указано выше.   -  person Jaiy    schedule 12.09.2018
comment
@scopchanov: Привет, я просто не знаю, почему ransac не смог разделить наземные кольца данных лидара, как показано на рисунке, я догадался, что это проблема программирования, но я не знаю, как ее решить, и код выкупа есть в списке выше, спасибо за ваше сообщение.   -  person Jaiy    schedule 12.09.2018
comment
Спасибо за помощь, я решил свою проблему, изменив свой код.   -  person Jaiy    schedule 17.09.2018


Ответы (1)


Попробуй это -

from mpl_toolkits.mplot3d.axes3d import *
import matplotlib.pyplot as plt
from sklearn import linear_model


fig = plt.figure("Pointcloud")
ax = Axes3D(fig)
ax.grid = True

ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
xyz = get_points()# here xyz is a 3d numpy array
    if xyz.size > 10:
        XY = xyz[:, :2]
        Z = xyz[:, 2]
        ransac = linear_model.RANSACRegressor(residual_threshold=0.01)
        ransac.fit(XY, Z)
        inlier_mask = ransac.inlier_mask_
        outlier_mask = np.logical_not(inlier_mask)
        inliers = np.zeros(shape=(len(inlier_mask), 3))
        outliers = np.zeros(shape=(len(outlier_mask), 3))
        a, b = ransac.estimator_.coef_
        d = ransac.estimator_.intercept_
        for i in range(len(inlier_mask)):
            if not outlier_mask[i]:
                inliers[i] = xyz[i]
            else:
                outliers[i] = xyz[i]

        min_x = np.amin(inliers[:, 0])
        max_x = np.amax(inliers[:, 0])
        min_y = np.amin(inliers[:, 1])
        max_y = np.amax(inliers[:, 1])

        x = np.linspace(min_x, max_x)
        y = np.linspace(min_y, max_y)

        X, Y = np.meshgrid(x, y)
        Z = a * X + b * Y + d
        AA = ax.plot_surface(X, Y, Z, cmap='binary', rstride=1, cstride=1, 
        alpha=1.0)
        BB = ax.scatter(outliers[:, 0], outliers[:, 1], outliers[:, 2],c='k', s 
        =1)
        CC = ax.scatter(inliers[:, 0], inliers[:, 1], inliers[:, 2], c='green', 
        s=1)
        plt.show()

Или предоставьте свой набор данных или поэкспериментируйте с параметрами ransac

person Samm Flynn    schedule 14.01.2020