exponenta event banner

pcsegdist

Сегментация облака точек в кластеры на основе евклидова расстояния

Описание

labels = pcsegdist(ptCloud,minDistance) разделяет облако точек на кластеры с минимальным евклидовым расстоянием, равным minDistance между точками из разных кластеров. pcsegdist назначает целочисленную метку кластера каждой точке в облаке точек и возвращает значение labels всех пунктов.

пример

[labels,numClusters] = pcsegdist(___) также возвращает число кластеров.

[___] = pcsegdist(___,NumClusterPoints=[1,Inf]) также задает минимальное и максимальное количество точек в каждом кластере, задаваемое как 2-элементный вектор или как скалярное значение. При указании NumClusterPoints как скаляр, максимальное количество точек в кластере является неограниченным. Функция устанавливает labels кому 0 если кластеры находятся за пределами указанного диапазона.

Примеры

свернуть все

Создайте две концентрические сферы и объедините их.

[X,Y,Z] = sphere(100);
loc1 = [X(:),Y(:),Z(:)];
loc2 = 2*loc1;
ptCloud = pointCloud([loc1;loc2]);
pcshow(ptCloud)
title('Point Cloud')

Figure contains an axes. The axes with title Point Cloud contains an object of type scatter.

Задайте минимальное евклидово расстояние между кластерами.

minDistance = 0.5;

Сегментируйте облако точек.

[labels,numClusters] = pcsegdist(ptCloud,minDistance);

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

pcshow(ptCloud.Location,labels)
colormap(hsv(numClusters))
title('Point Cloud Clusters')

Figure contains an axes. The axes with title Point Cloud Clusters contains an object of type scatter.

Загрузка организованного облака точек лидара в рабочее пространство.

ld = load('drivingLidarPoints.mat');

Обнаружить плоскость земли. Расстояние измеряется в метрах.

maxDistance = 0.9;
referenceVector = [0 0 1];
[~,inliers,outliers] = pcfitplane(ld.ptCloud,maxDistance,referenceVector);

Удалите точки нулевой плоскости.

ptCloudWithoutGround = select(ld.ptCloud,outliers);

Скопируйте облако точек минимум с 10 точками на кластер.

minDistance = 2;
minPoints = 10;
[labels,numClusters] = pcsegdist(ptCloudWithoutGround,minDistance,'NumClusterPoints',minPoints);

Удаление точек со значением метки 0.

idxValidPoints = find(labels);
labelColorIndex = labels(idxValidPoints);
segmentedPtCloud = select(ptCloudWithoutGround,idxValidPoints);

Постройте график помеченных результатов.

figure
colormap(hsv(numClusters))
pcshow(segmentedPtCloud.Location,labelColorIndex)
title('Point Cloud Clusters')

Figure contains an axes. The axes with title Point Cloud Clusters contains an object of type scatter.

Входные аргументы

свернуть все

Облако точек, указанное как pointCloud объект.

Минимальное евклидово расстояние между точками из двух различных кластеров, заданное как положительный скаляр.

Типы данных: single | double

Выходные аргументы

свернуть все

Метки кластера, возвращенные как одна из следующих.

  • Если облако точек, ptCloud, сохраняет местоположения точек в виде неорганизованной матрицы M-by-3, затем labels является вектором M-by-1.

  • Если облако точек, ptCloud, сохраняет местоположения точек как упорядоченный массив M-by-N-by-3, затем labels является матрицей M-by-N.

Каждая точка в облаке точек имеет метку кластера, заданную соответствующим элементом в labels. Значение каждой метки является целым числом от 0 к числу кластеров действительных точек, numClusters. Стоимость 0 зарезервирован для недопустимых точек, таких как точки с Inf или NaN координаты.

Число кластеров, возвращаемое как положительное целое число. Число кластеров не включает кластер, соответствующий недопустимым точкам, и исключает значение метки. 0, которая зарезервирована для недопустимых точек.

Расширенные возможности

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

..
Представлен в R2018a