segmentLidarData

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

Описание

пример

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

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

пример

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

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

Примеры

свернуть все

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

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')

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

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')

Настройте средство чтения файлов 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')

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

свернуть все

Облако точек в виде 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.

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

Алгоритмы

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

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

Ссылки

[1] Bogoslavskyi, я. “Эффективная Онлайновая Сегментация для Разреженных 3D Лазерных Сканирований”. Журнал Фотограмметрии, Дистанционного зондирования и Геоинформатики. Издание 85, Выпуск 1, 2017, стр 41–52.

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

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

Введенный в R2018a