segmentLidarData

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

Синтаксис

labels = segmentLidarData(ptCloud,distThreshold)
labels = segmentLidarData(ptCloud,distThreshold,angleThreshold)
[labels,numClusters] = segmentLidarData(___)

Описание

пример

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

пример

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,'k')
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,'r')

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

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

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

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

свернуть все

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

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

Ссылки

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

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

Введенный в R2018a