segmentLidarData

Сегмент, организованная 3 -D область значений данных в кластеры

Описание

пример

labels = segmentLidarData(ptCloud,distThreshold) сегменты, организованные 3 -D области значений ptCloud в кластеры. Функция присваивает целочисленную метку кластера каждой точке в облаке точек и возвращает метку кластера всех точек в labels.

Функция группирует две соседние точки в один кластер, если их евклидово расстояние меньше distThreshold или если угол между датчиком и двумя соседними точками составляет не менее 5 степени.

labels = segmentLidarData(ptCloud,distThreshold,angleThreshold) устанавливает ограничение угла для группировок точек в том же кластере равным angleThreshold.

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

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

Примеры

свернуть все

Создайте организованные синтетические данные лидара, содержащие два объекта.

ldr = zeros(5,100);
ldr(:,1:50) = 10;
ldr(:,51:end) = 20;
pitch = linspace(-18,18,5);
pitch = repmat(pitch',1,100); 
yaw = linspace(-90,90,100);
yaw = repmat(yaw,5,1); 

Преобразуйте в Декартовы координаты.

X = ldr .* cosd(pitch) .* sind(yaw);
Y = ldr .* cosd(pitch) .* cosd(yaw);
Z = ldr .* sind(pitch);
pc = pointCloud(cat(3,X,Y,Z));

figure
pcshow(pc.Location,'r')
title('Unclustered Point Cloud')

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

Установите порог.

distThreshold = 5;

Сегментируйте данные лидара.

labels = segmentLidarData(pc,distThreshold);

Постройте график результатов.

figure
hold on
title('Segmented Clusters')

pc1 = select(pc,find(labels == 1));
pcshow(pc1.Location,'g')

pc2 = select(pc,find(labels == 2));
pcshow(pc2.Location,'y')

Figure contains an axes. The axes with title Segmented Clusters contains 2 objects of type scatter.

Настройте средство чтения файлов PCAP.

veloReader = velodyneFileReader('lidarData_ConstructionRoad.pcap','HDL32E');

Подождите 0,3 секунды от начала файла, затем прочтите облако точек из следующей системы координат.

veloReader.CurrentTime = veloReader.StartTime + seconds(0.3);
ptCloud = readFrame(veloReader);

Сегментируйте и удалите плоскость заземления.

groundPtsIdx = segmentGroundFromLidarData(ptCloud);
ptCloudWithoutGround = select(ptCloud,~groundPtsIdx,'OutputSize','full');

Группируйте оставшиеся точки. Расстояние в метрах.

distThreshold = 0.5;
[labels,numClusters] = segmentLidarData(ptCloudWithoutGround,distThreshold);

Добавьте дополнительную метку для плоскости заземления.

numClusters = numClusters+1;
labels(groundPtsIdx) = numClusters;

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

labelColorIndex = labels+1;
pcshow(ptCloud.Location,labelColorIndex)
colormap([hsv(numClusters);[0 0 0]])
title('Point Cloud Clusters')

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

Входные параметры

свернуть все

Облако точек, заданное как pointCloud объект. ptCloud - организованное облако точек, которое хранит координаты точек в матрице M -by N -by-3. Точки должны быть организованы углами тангажа и рыскания в последовательном порядке сканирования, который обычно получают от лазерных областей значений и velodyneFileReader.

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

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

Угловой порог, в степенях, задается как скаляр в области значений [0, 180]. Чтобы уменьшить количество выхода кластеров, уменьшите значение angleThreshold. Функция группирует смежные точки в один кластер, если угол, образованный датчиком, и точки больше, чем порог угла. Для примера на рисунке функция группирует точки A и B в один кластер, если угол, образованный датчиком, точкой A и точкой B, больше angleThreshold. Для получения дополнительной информации см. «Алгоритмы».

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

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

свернуть все

Метки кластеров всех точек в облаке точек ptCloud, возвращается как M -by - N матрица целых чисел. Каждая действительная точка в ptCloud принадлежит кластеру. Всем точкам в кластере присваивается одна и та же целочисленная метка кластера в диапазоне от 1 на numClusters. Недопустимые точки, такие как точки с Inf или NaN координаты, назначаются метки 0.

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

Алгоритмы

segmentLidarData функция использует пороги расстояния и угла для соседних точек кластера. Функция группирует две соседние точки в один кластер, если их евклидово расстояние меньше входа distThreshold или если угол между датчиком и соседними точками больше или равен входу angleThreshold. Если вы не задаете angleThresholdфункция устанавливает этот угол равным 5 степени.

Например, предположим angleThreshold установлено в 90. Поскольку углы α и β на рисунке больше заданного порога в 90 степени, функции группируют A, B и C в один и тот же кластер. Поскольку угол и меньше 90-градусного порога, функция группирует точку D в отдельный кластер. Каждый угол, используемый функцией для кластеризации, формируется линией от точки до датчика и линией от этой же точки до соседней точки

Ссылки

[1] Богославский, И. «Эффективная онлайн-сегментация для разреженных 3D лазерных сканов». Журнал фотограмметрии, дистанционного зондирования и геоинформации. Том 85, Выпуск 1, 2017, стр. 41-52.

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

Генерация кода C/C + +
Сгенерируйте код C и C++ с помощью Coder™ MATLAB ®

.
Введенный в R2018a