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 Velodyne.

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] Weinmann, M., B. Jutzi, and C. Mallet. Semantic 3D Scene Interpretation: A Framework Combining Optimal Neighborhood Size Selection With Required функции ссылка). ISPRS Анналы фотограмметрии, дистанционного зондирования и пространственных информационных наук II-3 (7 августа 2014): 181-88. https://doi.org/10.5194/isprsannals-II-3-181-2014.

Введенный в R2021a