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++ с помощью Coder™ MATLAB ®

..
Введенный в R2018a
Для просмотра документации необходимо авторизоваться на сайте