extractEigenFeatures

Извлеките основанные на собственном значении функции из сегментов облака точек

Описание

пример

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

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

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

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

[___] = extractEigenFeatures(___,NormalizeEigenvalues=tf) нормирует собственные значения до вычисления функций в виде true или false. Установите tf к true когда следующий шаг должен использовать классификатор, чтобы присвоить семантическую метку 3-D точке. Установите tf к false когда следующий шаг должен найти соответствие с функциями. Значением по умолчанию является false.

Примеры

свернуть все

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

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 = extractEigenFeatures(ptCloud,labels,'NormalizeEigenvalues',true)
features=17×1 object
  16x1 eigenFeature array with properties:

    Feature
    Centroid
      ⋮

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

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 object. The axes object with title Matched Segments contains 5 objects of type scatter, line.

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

свернуть все

Облако точек в виде pointCloud объект.

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

Можно использовать pcsegdist или segmentLidarData функционируйте, чтобы возвратить метки.

Сегменты облака точек в виде вектора из pointCloud объекты. Каждый сегмент облака точек во входе должен иметь минимум двух точек для извлечения признаков. Никакие функции или сегменты не возвращены для входных сегментов только с одной точкой.

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

свернуть все

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

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

Ссылки

[1] Вейнманн, M., Б. Джуци и К. Маллет. “Семантическая 3D Интерпретация Сцены: Среда, Комбинирующая Оптимальный Выбор Размера Окружения с Соответствующими Функциями”. Летопись ISPRS Фотограмметрии, Дистанционного зондирования и Пространственной Информатики II–3 (7 августа 2014): 181–88. https://doi.org/10.5194/isprsannals-II-3-181-2014.

Введенный в R2021a