exponenta event banner

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

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