exponenta event banner

extractEigenFeatures

Извлечение элементов на основе собственных значений из сегментов облака точек

Описание

пример

features = extractEigenFeatures(ptCloud,labels) извлекает элементы на основе собственных значений из облака точек с помощью меток, labels, которые соответствуют сегментному облаку точек.

Элементы на основе собственных значений характеризуют геометрические элементы сегментов облака точек. Эти функции могут использоваться в приложениях одновременной локализации и отображения (SLAM) для обнаружения замыкания цикла и локализации в целевой карте.

features = extractEigenFeatures(segmentsIn) возвращает элементы на основе собственных значений из сегментов облака точек segmentsIn. Этот синтаксис используется для упрощения выбора определенных сегментов при сканировании облака точек для извлечения локальных элементов.

[features,segmentsOut] = extractEigenFeatures(___) дополнительно возвращает сегменты, извлеченные из облака входных точек с помощью любой комбинации аргументов из предыдущих синтаксисов. Этот синтаксис используется для упрощения визуализации сегментов.

Примеры

свернуть все

Загрузка организованного облака точек лидара.

ld = load('drivingLidarPoints.mat');
ptCloud = ld.ptCloud; 

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

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

Скопируйте оставшиеся точки с минимум 50 точками на кластер.

distThreshold = 0.5; % in meters
minPoints = 50;
[labels,numClusters] = segmentLidarData(ptCloud,distThreshold,'NumClusterPoints',minPoints);

Извлеките элементы на основе собственных значений и соответствующие сегменты из облака точек.

[features,segments] = extractEigenFeatures(ptCloud,labels)
features=17×1 object
  16x1 eigenFeature array with properties:

    Feature
    Centroid
      ⋮

segments=17×1 object
  16x1 pointCloud array with properties:

    Location
    Count
    XLimits
    YLimits
    ZLimits
    Color
    Normal
    Intensity
      ⋮

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

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

Чтение первого и четвертого сканирований из файла.

ptCloud1 = readFrame(veloReader,1);
ptCloud2 = readFrame(veloReader,4);

Удаление нулевой плоскости из сканирования.

maxDistance = 1; % in meters
referenceVector = [0 0 1];
[~,~,selectIdx] = pcfitplane(ptCloud1,maxDistance,referenceVector);
ptCloud1 = select(ptCloud1,selectIdx,'OutputSize','full');
[~,~,selectIdx] = pcfitplane(ptCloud2,maxDistance,referenceVector);
ptCloud2 = select(ptCloud2,selectIdx,'OutputSize','full');

Скопируйте облака точек минимум с 10 точками на кластер.

minDistance = 2; % in meters
minPoints = 10;
labels1 = pcsegdist(ptCloud1,minDistance,'NumClusterPoints',minPoints);
labels2 = pcsegdist(ptCloud2,minDistance,'NumClusterPoints',minPoints);

Извлеките элементы собственного значения и соответствующие сегменты из каждого облака точек.

[eigFeatures1,segments1] = extractEigenFeatures(ptCloud1,labels1);
[eigFeatures2,segments2] = extractEigenFeatures(ptCloud2,labels2);

Создайте матрицы элементов и центроидов, извлеченных из каждого облака точек, для сопоставления.

features1 = vertcat(eigFeatures1.Feature);
features2 = vertcat(eigFeatures2.Feature);
centroids1 = vertcat(eigFeatures1.Centroid);
centroids2 = vertcat(eigFeatures2.Centroid);

Поиск предполагаемых совпадений элементов.

indexPairs = pcmatchfeatures(features1,features2, ...
    pointCloud(centroids1),pointCloud(centroids2));

Получите соответствующие сегменты и элементы для визуализации.

matchedSegments1 = segments1(indexPairs(:,1));
matchedSegments2 = segments2(indexPairs(:,2));
matchedFeatures1 = eigFeatures1(indexPairs(:,1));
matchedFeatures2 = eigFeatures2(indexPairs(:,2));

Визуализация совпадений.

figure
pcshowMatchedFeatures(matchedSegments1,matchedSegments2,matchedFeatures1,matchedFeatures2)
title('Matched Segments')

Figure contains an axes. The axes with title Matched Segments contains 5 objects of type scatter, line.

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

свернуть все

Облако точек, указанное как pointCloud объект.

Метки кластера, заданные как вектор M-элементов числовых значений для неорганизованных облаков точек или матрица M-by-N числовых значений для организованных облаков точек. Метки соответствуют результатам сегментирования облака входных точек. Каждая точка в облаке точек имеет метку кластера, заданную соответствующим элементом в labels.

Вы можете использовать pcsegdist или segmentLidarData функция для возврата меток.

Сегменты облака точек, заданные как вектор pointCloud объекты. Каждый сегмент облака точек на входе должен иметь как минимум две точки для извлечения элемента. Элементы или сегменты не возвращаются для входных сегментов только с одной точкой.

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

свернуть все

Элементы на основе собственных значений, возвращаемые как вектор eigenFeature объекты. При извлечении элементов из входных данных облака помеченных точек каждый элемент в этом векторе содержит элементы, извлеченные из соответствующего кластера помеченных точек. При извлечении элементов из ввода сегментов каждый элемент в этом векторе содержит элементы, извлеченные из соответствующего элемента в векторе сегментов.

Сегменты, извлеченные из облака точек, заданные как вектор pointCloud объекты. Длина вектора сегментов соответствует числу ненулевых уникальных меток.

Ссылки

[1] Вайнманн, М., Б. Ютци и К. Маллет. «Интерпретация семантической 3D сцены: структура, сочетающая оптимальный выбор размера окрестности с соответствующими характеристиками». ISPRS Annals of Photogrammetry, Remote Sensing and Spatial Information Sciences II-3 (7 августа 2014 года): 181-88. https://doi.org/10.5194/isprsannals-II-3-181-2014.

Представлен в R2021a